рдлреЗрдЬрд░ рдореЗрдВ рд╕реИрдкрд░ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдбреЗрд╡рд▓рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдЪрд▓рд╛рдПрдВ

рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрд░рд┐рдп рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ!

рдореЗрд░рд╛ рдирд╛рдо рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рд╣реИ, рдореИрдВ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдЧреЗрдо рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред

рдЬрд┐рди рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд░рд┐рдЬреНрдпреВрдореЗ рднреЗрдЬрд╛ рдерд╛, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдореБрдЭреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рд╕рд╣рдордд рд╣реБрдЖ рдФрд░ 1 рджрд┐рди рдХреЗ рдмрд╛рдж, рдЯреАрдУрдЖрд░ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦреЗрд▓ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рднреЗрдЬрд╛ рдЧрдпрд╛ред



рдЪреВрдВрдХрд┐ рдореИрдВ рдЧреЗрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ, рд╕рд╛рде рд╣реА рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдФрд░ рдЪреВрдВрдХрд┐ рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдФрд░ рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рдг рдХреЗ рдХрд╛рд░рдг, рд╢рд╛рдпрдж рдореЗрд░реЗ рдирд┐рд░реНрдгрдп рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд▓реЗрдЦ рдбреЗрд╡рд▓рдкрд░ рдХреА рдПрдЪрдЯреАрдПрдордПрд▓ 5 рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░реНрдп рдХреА рдорд╛рддреНрд░рд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрдЧрд╛ред рд╕рд╛рдордЧреНрд░реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд░реБрдЪрд┐ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рдлреЗрдЬрд░ рдврд╛рдВрдЪреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлреЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ - рддреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВред

рддреЛ, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реИ!

рдкрд░рд┐рдЪрдп


рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрддреЗ рд╣реИрдВред

  1. рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг HTML5 рдЧреЗрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ - рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕реИрдкрд░ред
  2. рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдлреЗрдЬрд░ 3, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
  3. рдЧреЗрдо рдХреЛ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдЕрдВрддрд┐рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдбреЗрдореЛ рдФрд░ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ

рдФрд░ рд╕реИрдкрд░ рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ, рдЕрдЧрд░ рдЕрдЪрд╛рдирдХ рдХреЛрдИ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рднреВрд▓ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓рд╛ рд╣реИ, рдирд┐рдпрдореЛрдВ рдХреЛ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рддрд╣рдд рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ :)

рд╕реИрдкрд░ рдирд┐рдпрдо
рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдПрдХ рдЯреЗрдмрд▓ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬрдм рдЦреЗрд▓ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд╕реЗрд▓ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдХреБрдЫ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдмрдо рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдЬрдм рдмрдВрдж рд╕реЗрд▓ рдкрд░ рдмрд╛рдпрд╛рдБ-рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЦреБрд▓рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рдЦреБрд▓реА рд╕реЗрд▓ рдореЗрдВ рдмрдо рдерд╛, рддреЛ рдЦреЗрд▓ рд╣рд╛рд░ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдпрджрд┐ рд╕реЗрд▓ рдореЗрдВ рдХреЛрдИ рдмрдо рдирд╣реАрдВ рдерд╛, рддреЛ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЦреБрд▓реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИред рдпрджрд┐ рдЖрд╕-рдкрд╛рд╕ рдХреЛрдИ рдмрдо рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╕реЗрд▓ рдЦрд╛рд▓реА рджрд┐рдЦрддрд╛ рд╣реИред

рдмрдВрдж рд╕реЗрд▓ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдЙрд╕ рдкрд░ рдПрдХ рдЭрдВрдбрд╛ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдХрд╛рд░реНрдп рдЙрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЭрдВрдбреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╕рднреА рдЦрдирди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рд╕рднреА рдЭрдВрдбреЗ рд░рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдЦрд┐рд▓рд╛рдбрд╝реА рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рдЬреАрддрд╛ рд╣реИ, рдПрдХ рдЦреБрд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рд╣рдо рд╕реАрдзреЗ рд╕реНрд╡рдпрдВ рдореИрдиреБрдЕрд▓ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЫреЛрдЯреЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдо рд╕рдордп рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдЪрд░рдгрдмрджреНрдз рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдЕрдВрдд рдореЗрдВ рд╣рдо рдПрдХ рдкреВрд░реНрдг рдЧреЗрдо рдмрдирд╛рдПрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░рдг рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
1. рддреИрдпрд╛рд░реА
1.1 рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ
1.2 рд╡рд┐рдиреНрдпрд╛рд╕ рдмрдирд╛рдПрдБ
1.3 рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛
1.4 рд╕рдВрдкрддреНрддрд┐ рдХреА рддреИрдпрд╛рд░реА
2. рджреГрд╢реНрдп рдмрдирд╛рдирд╛
реи.рез рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
реи.реи рдЖрд░рдВрдн рджреГрд╢реНрдп
2.3 рд╢реБрд░реБрдЖрддреА рджреГрд╢реНрдп рдХреЗ рдЧреНрд░рдВрде
2.4 рдЦреЗрд▓ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрдХреНрд░рдордг
2.5 рд╕реНрддрд░ рдХрд╛ рджреГрд╢реНрдп
2.6 рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд░ рджреГрд╢реНрдп рд╕реЗрдЯ рдХрд░рдирд╛
3. рдЦреЗрд▓ рд╡рд╕реНрддреБрдУрдВ
3.1 рдЦреЗрд▓ рдмреЛрд░реНрдб
3.2 рд╕реЗрд▓ рдореЙрдбрд▓
рей.рей рд╕реЗрд▓ рд╡реНрдпреВ
рей.рек рджреГрд╢реНрдп рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛рдирд╛
3.5 рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреЛрдЬрд┐рд╢рдирд┐рдВрдЧ
3.6 FieldView рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛
3.7 рдкреНрд░рджрд░реНрд╢рди рдмреЛрд░реНрдб рдлрд╝реАрд▓реНрдбред
3.8 рдмрдо рдмрдирд╛рдирд╛
3.9 рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛
4. рдЗрдирдкреБрдЯ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛
4.1 рдЯреНрд░реИрдХрд┐рдВрдЧ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреА рдШрдЯрдирд╛рдУрдВ
4.2ред рд▓реЗрдлреНрдЯ рдХреНрд▓рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
4.4 рд░рд╛рдЗрдЯ рдХреНрд▓рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
4.5 GameSceneView рдСрдмреНрдЬреЗрдХреНрдЯ
5. рдПрдирд┐рдореЗрд╢рди
5.1 рдмреЛрд░реНрдб рдПрдирд┐рдореЗрд╢рди рднрд░реЗрдВ
5.2 рд╕реЗрд▓ рдлреНрд▓рд┐рдк рдПрдирд┐рдореЗрд╢рди

1. рддреИрдпрд╛рд░реА


1.1 рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реИрд╕рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдпрд╣ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓реЗрдЦрдХ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
index.htmlрдПрдЪрдЯреАрдПрдордПрд▓ рдкреЗрдЬ рдЧреЗрдо рдХреА рд╢реБрд░реБрдЖрдд
рд╡реЗрдмрдкреИрдХ /base.jsрдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдиреНрдпрд╛рд╕ рдмрдирд╛рдПрдБ
prod.jsрдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╡рд┐рдиреНрдпрд╛рд╕ рдмрдирд╛рдПрдВ
src /рд╕рдВрдкрддреНрддрд┐ /рдЦреЗрд▓ рд╕рдВрдкрддреНрддрд┐ (рд╕реНрдкреНрд░рд╛рдЗрдЯ, рд▓рдЧрддрд╛ рд╣реИ, рдлреЛрдВрдЯ)
index.jsрдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди index.js рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред рдлрд┐рд░ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА /src/scripts/ рдмрдирд╛рдПрдВ рдФрд░ index.ts рдЦрд╛рд▓реА index.ts рдлрд╝рд╛рдЗрд▓ index.ts ред рд╣рдо рдЕрдкрдиреА рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
рдпрд╣ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рд░реВрдЯ рдореЗрдВ рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд░рд┐рд▓реАрдЬ рдмрд┐рд▓реНрдб рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

1.2 рд╡рд┐рдиреНрдпрд╛рд╕ рдмрдирд╛рдПрдБ


рд╣рдо рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

webpack/base.js entry рдХреБрдВрдЬреА рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА ts-loader рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛ рдЯреАрдПрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:

 // webpack/base.js //... module.exports = { entry: './src/scripts/index.ts', // ... resolve: { extensions: [ '.ts', '.tsx', '.js' ] }, module: { rules: [{ test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/ }, //... 

рд╣рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ tsconfig.json рдлрд╝рд╛рдЗрд▓ рднреА рдмрдирд╛рдиреА рд╣реЛрдЧреАред рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реИ:

 { "compilerOptions": { "module": "commonjs", "lib": [ "dom", "es5", "es6", "es2015", "es2017", "es2015.promise" ], "target": "es5", "skipLibCheck": true }, "exclude": ["node_modules", "dist"] } 

1.3 рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛


Package.json рд╕реЗ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ ts-рд▓реЛрдбрд░ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВ:

 npm i npm i typescript --save-dev npm i ts-loader --save-dev 

рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ 2 рдХрдорд╛рдВрдб рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА package.json рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ scripts рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред package.json рдлрд╝рд╛рдЗрд▓ред

  1. рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЛрд▓реЗрдВ

     npm start 
  2. рдмрд┐рд▓реНрдб рдлреЙрд░ рд╕реЗрд▓ рдЪрд▓рд╛рдПрдВ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдмрд┐рд▓реНрдб рдХреЛ рдбрд┐рд╕реНрдЯ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ

     npm run build 

1.4 рд╕рдВрдкрддреНрддрд┐ рдХреА рддреИрдпрд╛рд░реА


рдЗрд╕ рдЧреЗрдо рдХреА рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ OpenGameArt (рд╕рдВрд╕реНрдХрд░рдг 61x61) рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЗрдирдореЗрдВ рд▓рд╛рдЗрд╕реЗрдиреНрд╕ рдлрд╝реНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ , рдЬрд┐рд╕реЗ рдкреИрдХ рд╡рд╛рд▓рд╛ рдкреГрд╖реНрда рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ)ред рд╡реИрд╕реЗ, рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХреЛрдб рдореЗрдВ рдПрдХ рд╣реА рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╣реИ! ;)

рдореИрдВрдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рд╕реЗрдЯ рд╕реЗ рдШрдбрд╝реА рдХреА рдЫрд╡рд┐ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдФрд░ рдмрд╛рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдлреНрд░реЗрдо рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛред рдиреАрдЪреЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдирд╛рдореЛрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЧрдИ рд╣реИред

рдкрд░рд┐рдгрд╛рдореА рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рд╕реЗ, рд╣рдо TexturePacker рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ Phaser JSONArray рдкреНрд░рд╛рд░реВрдк рдПрдЯрд▓рд╕ рдмрдирд╛рдПрдВрдЧреЗ (рдПрдХ рдореБрдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдореБрдЭреЗ рдЕрднреА рддрдХ рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ) рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА src/assets/ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╕реНрдкреНрд░рд┐рдЯрд╢реАрдЯ ред Png рдФрд░ spritesheet.json рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рд▓реЗрдВ ред



2. рджреГрд╢реНрдп рдмрдирд╛рдирд╛


реи.рез рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ


рд╣рдо рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдмрдирд╛рдХрд░ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

 // src/scripts/index.ts import * as Phaser from "phaser"; new Phaser.Game({ type: Phaser.AUTO, parent: "minesweeper", width: window.innerWidth, height: window.innerHeight, backgroundColor: "#F0FFFF", scene: [] }); 

рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдЧреЗрдо рд╣реИ рд╡рд╣ рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рд╕реНрдХреНрд░реАрди рдХреЛ рднрд░ рджреЗрдЧрд╛, рд╣рдо рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ width рдФрд░ height рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдкреВрд░реА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
scene рдХреНрд╖реЗрддреНрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рд╣реИ рдФрд░ рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗ!

реи.реи рдЖрд░рдВрдн рджреГрд╢реНрдп


рдкрд╣рд▓реЗ рджреГрд╢реНрдп рдХреЗ рд╡рд░реНрдЧ рдХреЛ src/scripts/scenes/StartScene.ts :

 export class StartScene extends Phaser.Scene { constructor() { super('Start'); } public preload(): void { } public create(): void { } } 

Phaser.Scene рдХреЗ рдорд╛рдиреНрдп рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП Phaser.Scene рд╣рдо рдореВрд▓ рд╢реНрд░реЗрдгреА рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреГрд╢реНрдп рдирд╛рдо рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рджреГрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╕рдВрд╕рд╛рдзрди рдкреНрд░реАрд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯ рд╕реНрдХреНрд░реАрди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред

рдЖрдорддреМрд░ рдкрд░ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рджреЛ рджреГрд╢реНрдпреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡рд╣ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдП,

 Boot => Preload => Start 

рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЦреЗрд▓ рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ, рдФрд░ рдЗрддрдиреА рдХрдо рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ рд╣реИрдВ рдХрд┐ рдкреНрд░реАрд▓реЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рджреГрд╢реНрдп рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ Boot рд▓реЛрдбрд░ рд╣реИред

рд╣рдо preload рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдЯрд▓рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 2 рдЪрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. require рдЙрдкрдпреЛрдЧ рд╕реЗ png рдФрд░ json рдПрдЯрд▓рд╕ рджреЛрдиреЛрдВ рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

     // StartScene.ts const spritesheetPng = require("./../../assets/spritesheet.png"); const spritesheetJson = require("./../../assets/spritesheet.json"); // ... 

  2. рдЙрдиреНрд╣реЗрдВ рдЖрд░рдВрднрд┐рдХ рджреГрд╢реНрдп рдХреЗ preload рд╡рд┐рдзрд┐ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ:

     // StartScene.ts // ... public preload(): void { this.load.atlas("spritesheet", spritesheetPng, spritesheetJson); } // ... 


2.3 рд╢реБрд░реБрдЖрддреА рджреГрд╢реНрдп рдХреЗ рдЧреНрд░рдВрде


рд╢реБрд░реБрдЖрддреА рд╕реАрди рдореЗрдВ, 2 рдХрд╛рдо рдХрд░рдиреЗ рдмрд╛рдХреА рд╣реИрдВ:

  1. рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдПрдВ
  2. рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдкрд╣рд▓ рдкрд░ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░реЗрдВ

рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдЧреНрд░рдВрдереЛрдВ рдФрд░ рдЙрдирдХреА рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЛ рдЧрдгрдирд╛рдПрдБ рдмрдирд╛рддреЗ рд╣реИрдВ:

 // StartScene.js enum Texts { Title = 'Minesweeper HTML5', Message = 'Click anywhere to start' } enum Styles { Color = '#008080', Font = 'Arial' } //... 

рдФрд░ рдлрд┐рд░ create рд╡рд┐рдзрд┐ рдореЗрдВ рджреЛрдиреЛрдВ рдЧреНрд░рдВрдереЛрдВ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ create ред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ Phaser рдореЗрдВ рджреГрд╢реНрдпреЛрдВ рдХреЗ create рддрд░реАрдХрд╛ preload рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред

 // StartScene.js //... public create(): void { this.add.text( this.cameras.main.centerX, this.cameras.main.centerY - 100, Texts.Title, {font: `52px ${Styles.Font}`, fill: Styles.Color}) .setOrigin(0.5); this.add.text( this.cameras.main.centerX, this.cameras.main.centerY + 100, Texts.Message, {font: `28px ${Styles.Font}`, fill: Styles.Color}) .setOrigin(0.5); } //... 

рдПрдХ рдФрд░ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдо рдЧреНрд░рдВрдереЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдпрд╛ рддреЛ рд╕реНрдерд╛рдиреАрдп рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ 2 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдореИрдВ рдЗрд╕ рдХрджрдо рдХреЛ рдмреЗрдорд╛рдиреА рдорд╛рдирддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рджреГрд╢реНрдп рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ред

2.4 рдЦреЗрд▓ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрдХреНрд░рдордг


рдЕрдВрддрд┐рдо рдмрд╛рдд рдЬреЛ рд╣рдо рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ рдХрд░реЗрдВрдЧреЗ, рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЧреЗрдо рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реИ:

 // StartScene.js //... public create(): void { //... this.input.once('pointerdown', () => { this.scene.start('Game'); }); } //... 

2.5 рд╕реНрддрд░ рдХрд╛ рджреГрд╢реНрдп


"Game" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП this.scene.start рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ this.scene.start рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рджреВрд╕рд░рд╛ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рдерд╛, рдЬреЛ рдореБрдЦреНрдп рдЦреЗрд▓ рддрд░реНрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред src/scripts/scenes/GameScene.ts :

 export class GameScene extends Phaser.Scene { constructor() { super('Game'); } public create(): void { } } 

рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ, рд╣рдореЗрдВ preload рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрд┐рдЫрд▓реЗ рджреГрд╢реНрдп рдореЗрдВ рд▓реЛрдб рдХрд░ рджрд┐рдпрд╛ рд╣реИред

2.6 рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд░ рджреГрд╢реНрдп рд╕реЗрдЯ рдХрд░рдирд╛


рдЕрдм рдЬрдм рджреЛрдиреЛрдВ рджреГрд╢реНрдп рдмрдирддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
src/scripts/index.ts :

 //... import { StartScene } from "./scenes/StartScene"; import { GameScene } from "./scenes/GameScene"; //... new Phaser.Game({ // ... scene: [StartScene, GameScene] }); 

3. рдЦреЗрд▓ рд╡рд╕реНрддреБрдУрдВ


рддреЛ, GameScene рд╡рд░реНрдЧ рдЦреЗрд▓-рд╕реНрддрд░ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдФрд░ рд╣рдореЗрдВ рд╕реИрдкрд░ рдЧреЗрдо рдХреЗ рд╕реНрддрд░ рд╕реЗ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рд╣реИ? рдиреЗрддреНрд░рд╣реАрди, рд╣рдо рдмрдВрдж рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЦреЗрд▓ рдореИрджрд╛рди рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рджреА рдЧрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрдИ рдореЗрдВ рдмрдо рдЖрд░рд╛рдо рд╕реЗ рд░рдЦреЗ рдЧрдП рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

3.1 рдЦреЗрд▓ рдмреЛрд░реНрдб


рд╡рд╣ src/scripts/models/Board.ts рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдореЗрдВ рд╣рдо Board рд╡рд░реНрдЧ рд░рдЦрддреЗ рд╣реИрдВ:

 import { Field } from "./Field"; export class Board extends Phaser.Events.EventEmitter { private _scene: Phaser.Scene = null; private _rows: number = 0; private _cols: number = 0; private _bombs: number = 0; private _fields: Field[] = []; constructor(scene: Phaser.Scene, rows: number, cols: number, bombs: number) { super(); this._scene = scene; this._rows = rows; this._cols = cols; this._bombs = bombs; this._fields = []; } public get cols(): number { return this._cols; } public get rows(): number { return this._rows; } } 

рдЖрдЗрдП рдХрдХреНрд╖рд╛ рдХреЛ Phaser.Events.EventEmitter рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

Field рдХреНрд▓рд╛рд╕ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ _fields рдирд┐рдЬреА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдо рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред

рд╣рдо рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдЬреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЧреБрдг _rows рдФрд░ _cols рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред _rows рдФрд░ _cols рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ _rows рдмрдирд╛рдПрдБред

_bombs рдлрд╝реАрд▓реНрдб рд╣рдореЗрдВ рдЙрди рдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрддрд╛рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдФрд░ _scene рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ _scene рд╣рдо GameScene рдЧреЗрдо рджреГрд╢реНрдп рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо Board рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВрдЧреЗред

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╣рдо рджреГрд╢реНрдп рдХреЛ рдХреЗрд╡рд▓ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рд╡рд╕реНрддреБ рдХреЛ рдореЙрдбрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдлреЗрдЬрд╝рд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рджреГрд╢реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреНрд░реАрдлреИрдм рдмрдирд╛рддреЗ рд╕рдордп рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдп рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗред рдФрд░ рдЦреБрдж рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рд╕рдордЭреМрддреЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рджреГрд╢реНрдп рдХреЛ рд▓рд┐рдВрдХ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдЗрдВрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╣рдо рдореЙрдбрд▓ рдФрд░ рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рджреГрд╢реНрдп рдХреЗ рдХрд╕реНрдЯрдо рддрд░реАрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдордиреЗ рдмреЛрд░реНрдб рдирд┐рд░реНрдорд╛рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ GameScene рд╕реАрди рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрддреЗ рд╣реБрдП, рдЗрд╕реЗ рд▓реЗрд╡рд▓ рд╕реАрди рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ GameScene :

  // GameScene.ts import { Board } from "../models/Board"; const Rows = 8; const Cols = 8; const Bombs = 8; export class GameScene extends Phaser.Scene { private _board: Board = null; //... public create(): void { this._board = new Board(this, Rows, Cols, Bombs); } } 

рд╣рдо рджреГрд╢реНрдп рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмреЛрд░реНрдб рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рддрдХ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ Board рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рднреЗрдЬрддреЗ рд╣реИрдВред

3.2 рд╕реЗрд▓ рдореЙрдбрд▓


рдмреЛрд░реНрдб рдореЗрдВ рд╕реЗрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред src/scripts/models/Field.ts рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рдЬрдЧрд╣ рджреЗрдВрдЧреЗ рдЬреЛ рд╕реЗрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:

 import { Board } from "./Board"; export class Field extends Phaser.Events.EventEmitter { private _scene: Phaser.Scene = null; private _board: Board = null; private _row: number = 0; private _col: number = 0; constructor(scene: Phaser.Scene, board: Board, row: number, col: number) { super(); this._init(scene, board, row, col); } public get col(): number { return this._col; } public get row(): number { return this._row; } public get board(): Board { return this._board; } private _init(scene: Phaser.Scene, board: Board, row: number, col: number): void { this._scene = scene; this._board = board; this._row = row; this._col = col; } } 

рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдореЗрдВ рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рдореАрдЯреНрд░рд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рд╕реНрдерд┐рдд рд╣реИред рд╣рдо рдмреЛрд░реНрдб рдФрд░ рджреГрд╢реНрдп рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ _board рдФрд░ _scene рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо _row , _col рдФрд░ _board рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП _row рд▓рд╛рдЧреВ _board ред

рей.рей рд╕реЗрд▓ рд╡реНрдпреВ


рдЕрдореВрд░реНрдд рд╕реЗрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрдм рд╣рдо рдЗрд╕рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕реЗрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред src/scripts/views/FieldView.ts рдФрд░ рдЙрд╕рдореЗрдВ рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдбрд╛рд▓реЗрдВ:

 import { Field } from "../models/Field"; export class FieldView extends Phaser.GameObjects.Sprite { private _model: Field = null; constructor(scene: Phaser.Scene, model: Field) { super(scene, 0, 0, 'spritesheet', 'closed'); this._model = model; this._init(); this._create(); } private _init(): void { } private _create(): void { } } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ Phaser.GameObjects.Sprite рдХрд╛ рд╡рдВрд╢рдЬ рдмрдирд╛рдпрд╛ рд╣реИред рдлреЗрдЬрд░ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рд╡рд░реНрдЧ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреНрд░реАрдлреИрдм рдмрди рдЧрдпрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдореБрдЭреЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдорд┐рд▓реА, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдВрдЧреЗред

рдЖрдЗрдП рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣рд╛рдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдирд┐рдореНрди рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рджреГрд╢реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд▓рд┐рдВрдХ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЦрдВрдб 3.1 рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИ: рдлреЗрдЬрд╝рд░ рдХреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдп рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)
  • x рдФрд░ y рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╕рдордиреНрд╡рдп рдХрд░рддреЗ рд╣реИрдВ
  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рдЬреЛ рдПрдЯрд▓рд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкреНрд░рд╛рд░рдВрдн рджреГрд╢реНрдп рдХреЗ preload рд╡рд┐рдзрд┐ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдерд╛
  • рдлрд╝реНрд░реЗрдо рдПрдЯрд▓ рдХреБрдВрдЬреА рдЗрд╕ рдПрдЯрд▓рд╕ рдореЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

рдирд┐рдЬреА _model рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдореЙрдбрд▓ (рдЕрд░реНрдерд╛рдд Field рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг) рдХрд╛ рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд░реЗрдВред

рд╣рдордиреЗ рд╡рд┐рд╡реЗрдХрдкреВрд░реНрдг _create 2 рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦрд╛рд▓реА _init рдФрд░ _create рд╢реБрд░реВ _create , рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред

рей.рек рджреГрд╢реНрдп рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛рдирд╛


рддреЛ, рджреГрд╢реНрдп рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреИрд╕реЗ рдЦреАрдВрдЪрдирд╛ рд╣реИред рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреА рдирд┐рдЬреА _create рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 // FieldView.js //... private _create(): void { this.scene.add.existing(this); //      this.setOrigin(0.5); //  pivot point    } //... 

3.5 рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкреЛрдЬрд┐рд╢рдирд┐рдВрдЧ


рдлрд┐рд▓рд╣рд╛рд▓, рд╕рднреА рдмрдирд╛рдП рдЧрдП рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЛ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (0, 0) рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ рдмреЛрд░реНрдб рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЬреЛ рдЗрд╕ рд╕реЗрд▓ рдХреА рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ FieldView рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╡рд░реНрдЧ рдореЗрдВ _position рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рд╕реЗрд▓ рдХреЗ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:

 // FieldView.ts //... interface Vec2 {x: number, y: number}; export class FieldView extends Phaser.GameObjects.Sprite { private _position: Vec2 = {x: 0, y: 0}; //... 

рдЪреВрдВрдХрд┐ рд╣рдо рдмреЛрд░реНрдб рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖, рд╣рдореЗрдВ _offset рд╕рдВрдкрддреНрддрд┐ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдПрдВ рдФрд░ рд╢реАрд░реНрд╖ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╕реЗрд▓ рдХреА рдСрдлрд╕реЗрдЯ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИред рдЗрд╕реЗ рдПрдХ рдирд┐рдЬреА рдЧрдЯрд░ рд╕реЗ рдЬреЛрдбрд╝реЗрдВ:

 // FieldView.ts //... private get _offset(): Vec2 { return { x: (this.scene.cameras.main.width - this._model.board.cols * this.width) / 2, y: (this.scene.cameras.main.height - this._model.board.rows * this.height) / 2 }; } //... 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо:

  1. рдЗрд╕рдореЗрдВ рдХреБрд▓ рд╕реНрдХреНрд░реАрди рдЪреМрдбрд╝рд╛рдИ рдорд┐рд▓ рдЧрдИ this._scene.cameras.main.width ред
  2. рд╣рдореЗрдВ рдПрдХ рд╕реЗрд▓ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдмреЛрд░реНрдб рдХреА рдХреБрд▓ рдЪреМрдбрд╝рд╛рдИ рдорд┐рд▓реА: this._board.cols * this.width / this._board.cols * this.width ред
  3. рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд░реНрдб рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрдЧрд╣ рдорд┐рд▓реА, рдмреЛрд░реНрдб рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
  4. рдкрд░рд┐рдгрд╛рдореА рд╕рдВрдЦреНрдпрд╛ рдХреЛ 2 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдмреЛрд░реНрдб рдХреЗ рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдЗрдВрдбреЗрдВрдЯ рд╡реИрд▓реНрдпреВ рдорд┐рд▓реАред
  5. рдЗрд╕ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░рдХреЗ, рд╣рдо x рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдмреЛрд░реНрдб рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВред

рд╣рдо рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╡рд┐рд╕реНрдерд╛рдкрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ _init рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:

 // FieldView.ts // ... private _init(): void { const offset = this._offset; this.x = this._position.x = offset.x + this.width * this._model.col + this.width / 2; this.y = this._position.y = offset.y + this.height * this._model.row + this.height / 2; } // ... 

рдЧреБрдг рдпрд╣ред this.width , this.width , this.width , рдпрд╣ред this.width рдФрд░ this.height рдпрд╣рд╛рдБ рд╣реИред рдореВрд▓ рдЧреБрдг Phaser.GameObjects.Sprite рдХреЗ рдореВрд▓ рдЧреБрдг рд╣реИрдВред рдЗрд╕ this.x рдФрд░ this.y рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреА рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рд╣реЛ рдЬрд╛рддреА рд╣реИред

3.6 FieldView рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛


Field рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдБ:

 // Field.ts // ... private _view: FieldView = null; public get view(): FieldView { return this._view; } private _init(scene: Phaser.Scene, board: Board, row: number, col: number): void { //... this._view = new FieldView(this._scene, this); } // ... 

3.7 рдкреНрд░рджрд░реНрд╢рди рдмреЛрд░реНрдб рдлрд╝реАрд▓реНрдбред


рдЪрд▓реЛ Board рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ Field рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред

рд╣рдо рдмреЛрд░реНрдб рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ _create рд╡рд┐рдзрд┐ рдореЗрдВ _create рдФрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ _create рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣рдо рди рдХреЗрд╡рд▓ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдмрдирд╛рдПрдВрдЧреЗ, рд╣рдо рдПрдХ рдЕрд▓рдЧ _createFields рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб _createFields ред

 // Board.ts constructor(scene: Phaser.Scene, rows: number, cols: number, bombs: number) { // ... this._create(); } private _create(): void { this._createFields(); } private _createFields(): void { } 

рдпрд╣ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИ рдХрд┐ рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдПрдВрдЧреЗ:

 // Board.ts // ... private _createFields(): void { for (let row = 0; row < this._rows; row++) { for (let col = 0; col < this._cols; col++) { this._fields.push(new Field(this._scene, this, row, col)); } } } //... 

рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ

 npm start 

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣рдореЗрдВ 8 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ 64 рд╕реЗрд▓ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

3.8 рдмрдо рдмрдирд╛рдирд╛


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ Board рдХрдХреНрд╖рд╛ рдХреЗ _create рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗред рдФрд░ рдХреНрдпрд╛? рдЗрд╕рдореЗрдВ рдмрдореЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА рд╣реЛрдЧрд╛, рдФрд░ рдмрдирд╛рдИ рдЧрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкрдбрд╝реЛрд╕реА рдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдЦреБрдж рдмрдореЛрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдмреЛрд░реНрдб рдкрд░ рдПрди рдмрдо рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдмрдо рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:

                          

рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╣рдо рдЗрд╕ рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЬрдм рддрдХ рд╣рдо рдЗрд╕ рдмрдо рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдХрдИ рдмрдо рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдкреНрд░рд╛рдкреНрдд рд╕реЗрд▓ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдореЗрдВ рдПрдХ рдмрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмрдореЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ Phaser.Math.Between рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

 // Board.ts //... private _createBombs(): void { let count = this._bombs; //      while (count > 0) { //       let field = this._fields[Phaser.Math.Between(0, this._fields.length - 1)]; //    if (field.empty) { //     field.setBomb(); //     --count; //    } } } 

this._createBombs(); рдореЗрдВ рдЗрд╕ Board.ts this._createBombs(); рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ this._createBombs(); _create рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рдерд╛, рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ empty setBomb рдФрд░ setBomb рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдХрд░ Field рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ setBomb ред

рдлрд╝реАрд▓реНрдб _value рдПрдХ рдирд┐рдЬреА _value рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рд╕реЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╡рд┐рдирд┐рдпрдорд┐рдд рдХрд░реЗрдЧрд╛ред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдордЭреМрддреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
_value === режрд╕реЗрд▓ рдЦрд╛рд▓реА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЦрджрд╛рди рдпрд╛ рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ
_value === -1рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдЦрджрд╛рди рд╣реИ
_value > режрд╕реЗрд▓ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рдЦрд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ

рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рд╣рдо Field рдХреНрд▓рд╛рд╕ рдореЗрдВ рдРрд╕реЗ рддрд░реАрдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ _value рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

 // Field.ts // ... private _value: number = 0; // ... public get value(): number { return this._value; } public set value(value) { this._value = value; } public get empty(): boolean { return this._value === 0; } public get mined(): boolean { return this._value === -1; } public get filled(): boolean { return this._value > 0; } public setBomb(): void { this._value = -1; } // ... 

3.9 рдорд╛рди рд╕реЗрдЯ рдХрд░рдирд╛


рдмрдореЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдбреЗрдЯрд╛ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рд╕реИрдкрд░ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реЗрд▓ рдореЗрдВ рд╡рд╣ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕ рд╕реЗрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛред рдЗрд╕ рдирд┐рдпрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд pseudocode рд▓рд┐рдЦрддреЗ рд╣реИрдВред

                    

Board рдХрдХреНрд╖рд╛ рдореЗрдВ, рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЛрдбрдХреЛрдб рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░реЗрдВ:

 // Board.ts //... private _createValues() { //      this._fields.forEach(field => { //      if (field.mined) { //     field.getClosestFields().forEach(item => { //      if (item.value >= 0) { ++item.value; } }); } }); } //... 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдХреМрди рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ getClosestFields рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреЛрд░реНрдб рдХреЗ рдХрд┐рд╕реА рднреА рд╕реЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдХрд┐рдирд╛рд░реЗ рдкрд░ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдЪрд░рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЪрд░рдо рдХреЙрд▓рдо рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдРрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ: рд╢реАрд░реНрд╖ рдкрд░ 1, рддрд▓ рдкрд░ 1, рдмрд╛рдИрдВ рддрд░рдл 3 рдФрд░ рджрд╛рдИрдВ рдУрд░ 3 (рд╡рд┐рдХрд░реНрдг рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕рд╣рд┐рдд)ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛ рдореЗрдВ, рд╕рдВрдХреЗрддрдХ _row рдФрд░ _col 1 рд╕реЗ рдЕрдзрд┐рдХ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрддрдорд╛рди рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ _row рдФрд░ _col рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрд░рдВрдн рдореЗрдВ рд╡рд░реНрдЧ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝реЗрдВ:

 // Field.ts const Positions = [ {row : 0, col : 1}, //  {row : 0, col : -1}, //  {row : 1, col : 0}, //  {row : 1, col : 1}, //   {row : 1, col : -1}, //   {row : -1, col : 0}, //  {row : -1, col : 1}, //   {row : -1, col : -1} //   ]; //... 

рдФрд░ рдЕрдм рд╣рдо рд▓рд╛рдкрддрд╛ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрд╕ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░реЗрдВрдЧреЗ:

 // Field.ts //... public getClosestFields(): Field[] { let results = []; //      Positions.forEach(position => { //      let field = this._board.getField(this._row + position.row, this._col + position.col); //       if (field) { //     results.push(field); } }); return results; }; //... 

рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ field рдЪрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмреЛрд░реНрдб рдкрд░ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ 8 рдкрдбрд╝реЛрд╕реА рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░реА рдмрд╛рдПрдВ рд╕реЗрд▓ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдкрдбрд╝реЛрд╕реА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред

рдпрд╣ getField рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ Board рдХреНрд▓рд╛рд╕ рдореЗрдВ _create рдкрджреНрдзрддрд┐ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ

 // Board.ts //... public getField(row: number, col: number): Field { return this._fields.find(field => field.row === row && field.col === col); } //... private _create(): void { this._createFields(); this._createBombs(); this._createValues(); } //... 

4. рдЗрдирдкреБрдЯ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛


4.1 рдЯреНрд░реИрдХрд┐рдВрдЧ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреА рдШрдЯрдирд╛рдУрдВ


рдлрд┐рд▓рд╣рд╛рд▓, рдмреЛрд░реНрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд░рдВрднрд┐рдХ рд╣реИ, рдЗрд╕рдореЗрдВ рдмрдо рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрдВрдж рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦреЛрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕реЗ рд╕рд╣реА рдХрд░реЗрдВрдЧреЗ рдФрд░ рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдЙрджреНрдШрд╛рдЯрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдореЗрдВ, FieldViewрд╡рд┐рдзрд┐ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ _createрдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ :

 // FielView.ts //... private _create(): void { // ... this.setInteractive(); } //... 

рдлрд╝реЗрд╕рд░ рдореЗрдВ, рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд╛рдо рд╕реНрдерд╛рди рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ Phaser.GameObjectsред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ ( pointerdown) рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдкреНрд░реАрдлреИрдм рдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВрдЧреЗ , рдЬреЛ рдХрд┐ FieldViewрд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдПрдХ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБ рд╣реИ Phaser.GameObjects.Spriteред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдкрдХреЛ рдЖрдо рддреМрд░ рдкрд░ рдЙрд╕ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕реБрдирдирд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ setInteractiveрд╕реНрдкреНрд░рд╛рдЗрдЯ рдкрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдордиреЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред

рдЕрдм рдЬрдм рд╣рдорд╛рд░рд╛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрдХреНрд╖рд╛ BoardрдореЗрдВ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдкрд░ рдирдП рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ Field, рдЕрд░реНрдерд╛рддреН рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП _createFieldsрдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЛ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

 // Board.ts //... private _createFields(): void { for (let row = 0; row < this._rows; row++) { for (let col = 0; col < this._cols; col++) { const field = new Field(this._scene, this, row, col) field.view.on('pointerdown', this._onFieldClick.bind(this, field)); this._fields.push(field); } } } //... 

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдо рд╡рд┐рдзрд┐ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ _onFieldClick, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдХрдХреНрд╖рд╛ рд╕реЗ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ Boardред рдПрдХ рд░рд╛рдп рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЙрдбрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдмрджрд▓ рджреЗрдВ, рдЬрд┐рд╕рдХреА рд╕рдорд╛рдирддрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧреЗрдо рджреГрд╢реНрдп рдХреА рдХрдХреНрд╖рд╛ рд╣реИ GameSceneред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХреНрд▓рд┐рдХ рдИрд╡реЗрдВрдЯ рдХреЛ рдХрдХреНрд╖рд╛ Boardрд╕реЗ рджреГрд╢реНрдп рддрдХ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ ред рддреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗ:

 // Board.ts //... private _onFieldClick(field: Field, pointer: Phaser.Input.Pointer): void { if (pointer.leftButtonDown()) { this.emit(`left-click`, field); } else if (pointer.rightButtonDown()) { this.emit(`right-click`, field); } } //... 

рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рдХреЛ рдлреЗрдВрдХ рдирд╣реАрдВ рд░рд╣реЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдХрд┐ рдпрд╣ рдХреМрди рд╕рд╛ рдХреНрд▓рд┐рдХ рдерд╛ред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЬрдм рджреГрд╢реНрдп рд╡рд░реНрдЧ рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗред рдмреЗрд╢рдХ, рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рдХреЛ рднреЗрдЬрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рджреГрд╢реНрдп рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рджреЗрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдХрд┐ рдШрдЯрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреБрдЫ рддрд░реНрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реА рд░рд╣ рдЬрд╛рдПрдВрдЧреЗ Fieldред

рдЦреИрд░, рдЕрдм рдЦреЗрд▓ рдХреЗ рджреГрд╢реНрдп рдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ GameSceneрдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ _createрдХреЛрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдПрдХ рдХреНрд▓рд┐рдХ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ:

 // Board.ts //... import { Field } from "../models/Field"; //... public create(): void { this._board = new Board(this, Rows, Cols, Bombs); this._board.on('left-click', this._onFieldClickLeft, this); this._board.on('right-click', this._onFieldClickRight, this); } private _onFieldClickLeft(field: Field): void { } private _onFieldClickRight(field: Field): void { } //... 

4.2ред рд▓реЗрдлреНрдЯ рдХреНрд▓рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рд╣рдо рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЦреЛрд▓рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред рдмрд╛рдИрдВ рдмрдЯрди рджрдмрд╛рдХрд░ рд╕реЗрд▓ рдЦреЛрд▓реЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЖрд╡рд╛рдЬрд╝ рджреЗрдВ рдЬреЛ рдкреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

  1. рдмрдВрдж рд╕реЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕реЗ рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  2. рдЕрдЧрд░ рдПрдХ рдЦреБрд▓реА рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдЦрджрд╛рди рд╣реИ - рдЦреЗрд▓ рдЦреЛ рдЧрдпрд╛ рд╣реИ
  3. рдпрджрд┐ рдУрдкрди рд╕реЗрд▓ рдореЗрдВ рдХреЛрдИ рдЦрджрд╛рдиреЗрдВ рдпрд╛ рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдорд┐рди рдкрдбрд╝реЛрд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рд╕рднреА рдкрдбрд╝реЛрд╕реА рд╕реЗрд▓ рдЦреЛрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдРрд╕рд╛ рддрдм рддрдХ рдХрд░рдирд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдУрдкрди рд╕реЗрд▓ рдореЗрдВ рдореВрд▓реНрдп рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
  4. рдЬрдм рдЖрдк рдПрдХ рдЦреБрд▓реА рд╕реЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╕рднреА рдЭрдВрдбреЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЧреЗрдо рдХреЛ рдЬреАрдд рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ

рдФрд░ рдЕрдм, рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рд╕рдордЭ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрд░реЛрдХреНрдд рддрд░реНрдХ рдХреЛ рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ:

                           

рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рд╕рдордЭ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ _onFieldClickLeft:

 // GameScene.ts //... private _onFieldClickLeft(field: Field): void { if (field.closed) { //    field.open(); //   if (field.mined) { //    field.exploded = true; this._onGameOver(false); //   } else if (field.empty) { //    this._board.openClosestFields(field); //   } } else if (field.opened) { //    if (this._board.completed) { //       this._onGameOver(true); //   } } } //... 

рдФрд░ рдлрд┐рд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдВрдЧреЗ FieldрдФрд░ BoardрдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред

рд╣рдо рдПрдиреНрдпреВрдорд░реЗрд╢рди рдореЗрдВ рд╕реЗрд▓ рдХреЗ 3 рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ States, рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ _stateрдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдЯреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 // Field.ts enum States { Closed = 'closed', Opened = 'opened', Marked = 'flag' }; export class Field extends Phaser.Events.EventEmitter { private _state: string = States.Closed; //... public get marked(): boolean { return this._state === States.Marked; } public get closed(): boolean { return this._state === States.Closed; } public get opened(): boolean { return this._state === States.Opened; } //... 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдВрдХреЗрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рд╣реИрдВ рдХрд┐ рд╕реЗрд▓ рдмрдВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╣рдо рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ openрдЬреЛ рд░рд╛рдЬреНрдп рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛:

 // Field.ts //... public open(): void { this._setState(States.Opened); } private _setState(state: string): void { if (this._state !== state) { this._state = state; this.emit('change'); } } //... 

рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдРрд╕реА рдШрдЯрдирд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рдЬреА рдкрджреНрдзрддрд┐ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ _setStateрдЬрд┐рд╕рдореЗрдВ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкреВрд░реЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдореЙрдбрд▓ рдХреЗ рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреА рдЪрд╛рд╣рд┐рдПред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рдлрд╝реАрд▓реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдмреВрд▓рд┐рдпрди рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВ_exploded

 // Field.ts private _exploded: boolean = false; //... public set exploded(exploded: boolean) { this._exploded = exploded; this.emit('change'); } public get exploded(): boolean { return this._exploded; } //... 

рдЕрдм рдХрдХреНрд╖рд╛ рдЦреЛрд▓реЗрдВ BoardрдФрд░ рдЙрд╕рдореЗрдВ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░реЗрдВ openClosestFieldsред рдпрд╣ рд╡рд┐рдзрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реНрд╡реАрдХреГрдд рд╕реЗрд▓ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рднреА рдЦрд╛рд▓реА рдкрдбрд╝реЛрд╕реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЦреЛрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

  :                 

рдФрд░ рдЗрд╕ рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ:

 // Board.ts //... public openClosestFields(field: Field): void { field.getClosestFields().forEach(item => {//     if (item.closed) {//    item.open();//   if (item.empty) {//    this.openClosestFields(item);//     } } }); } //... 

рдмреЛрд░реНрдб рдкрд░ рдЭрдВрдбреЗ рдХреЗ рд╕рд╣реА рд╕реНрдерд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд completedрдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЧреЗрдЯреНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ Boardред рдпрджрд┐ рдХреЛрдИ рдмреЛрд░реНрдб рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдордВрдЬреВрд░реА рджреЗ рджреА рдЧрдИ рд╣реИ рддреЛ рд╣рдо рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдлрд╝реАрд▓реНрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдмреЛрд░реНрдб рдкрд░ рдмрдореЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

 // Board.ts //... public get completed(): boolean { return this._fields.filter(field => field.completed).length === this._bombs; } //... 

рдпрд╣ рд╡рд┐рдзрд┐ рдПрдЯрд░ рдХреЛ рд╕рд░рдгреА _fieldsрдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреА рд╣реИ completed, рдЬрд┐рд╕реЗ рдлрд╝реАрд▓реНрдб рдЪрд┐рд╣реНрди рдХреА рд╡реИрдзрддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ (рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдлрд╝реАрд▓реНрдб рдЧрд┐рд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЧреЗрдЯреНрдЯрд░ completedрдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ Field) рдлрд╝реАрд▓реНрдб рдорд╛рди _bombs(рдпрд╛рдиреА рдмреЛрд░реНрдб рдкрд░ рдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ ) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ , рддреЛ рд╣рдо рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ true, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдЗрд╕ рдЧреЗрдо рдХреЛ рдЬреАрддрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдмреЛрд░реНрдб рдХреЛ рдЦреЛрд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рднреА рдирд╣реАрдВ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕реНрддрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рднреА рдЬреЛрдбрд╝реЗрдВрдЧреЗ Board:

 // Board.ts //... public open(): void { this._fields.forEach(field => field.open()); } //... 

рдпрд╣ completedрд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЙрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдмрд╛рдХреА рд╣реИ Fieldред рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдордВрдЬреВрд░реА рджреЗ рджреА рдЬрд╛рдПрдЧреА? рдпрджрд┐ рдЗрд╕реЗ рдЦрдирди рдФрд░ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдЖрд╡рд╢реНрдпрдХ рдЧреЗрдЯреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 // Field.ts //... public get completed(): boolean { return this.marked && this.mined; } //... 

рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВрдЧреЗ _onGameOverрдЬрд┐рд╕рдореЗрдВ рд╣рдо рдмреЛрд░реНрдб рдИрд╡реЗрдВрдЯ рдХреА рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдкреВрд░реЗ рдмреЛрд░реНрдб рдХреЛ рджрд┐рдЦрд╛рдПрдВрдЧреЗред рдмрд╛рдж рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд┐рддрд┐ рдкреВрд░реНрдгрддрд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛрдб рднреА рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ statusред

 // GameScene.ts //... private _onGameOver(status: boolean) { this._board.off('left-click', this._onFieldClickLeft, this); this._board.off('right-click', this._onFieldClickRight, this); this._board.open(); } //... 

4.3 рдлреАрд▓реНрдб рдкреНрд░рджрд░реНрд╢рди


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдирдИ рдЦреЛрд▓реА рдЧрдИ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░реЗрдВред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ, Fieldрд╣рдордиреЗ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬреЛ _setStateрдПрдХ рдШрдЯрдирд╛ рдХреЛ рдЖрдЧ рд▓рдЧрд╛ рджреЗрддреА рд╣реИ changeрдЬрдм рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣рдо FieldViewрдЗрд╕ рдШрдЯрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ :

 // FieldView.ts //... private _init(): void { //... this._model.on('change', this._onStateChange, this); } private _onStateChange(): void { this._render(); } private _render(): void { this.setFrame(this._frameName); } //... 

рд╣рдордиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдордзреНрдпрд╡рд░реНрддреА рд╡рд┐рдзрд┐ _onStateChangeрдХреЛ рдореЙрдбрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛ рдХрд╛ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдпрд╛ ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИ _renderред

рдПрдХ рдирдП рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реЗрд▓ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдлреНрд░реЗрдо рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдПрдЯрд▓рд╕ рдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо setFrameрд╡рд░реНрддрдорд╛рди рдлрд╝реНрд░реЗрдо рдХреЛ рдирдП рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдЧрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ _frameName, рдЬрд┐рд╕реЗ рдЕрдм рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрди рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕реЗрд▓ рдлреНрд░реЗрдо рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдврд╛рдВрдЪрд╛рд╢рд░реНрдд
closedрдореИрджрд╛рди рдмрдВрдж рд╣реИ
flagрдЭрдВрдбреА рд▓рдЧреА рд╣реБрдИ рдЦреЗрдд
emptyрдХреНрд╖реЗрддреНрд░ рдЦреБрд▓рд╛ рд╣реИ, рдЦрдирди рдирд╣реАрдВ рд╣реИ рдпрд╛ рдореВрд▓реНрдп рд╕реЗ рднрд░рд╛ рд╣реИ
exploded
рдореИрджрд╛рди рдЦреБрд▓рд╛, рдЦрдирди рдФрд░ рдЙрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ
mined
рдореИрджрд╛рди рдЦреБрд▓рд╛ рд╣реИ, рдЦрдирди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ
1...9
рдлрд╝реАрд▓реНрдб рдЦреБрд▓рд╛ рд╣реИ рдФрд░ 1 рд╕реЗ 9 рддрдХ рдХрд╛ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рдЖрдЧреЗ рдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ

рд╣рдореЗрдВ рд╕рднреА рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЙрдбрд▓ рдХреЗ рд╕рднреА рддрд░реАрдХреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪрд▓реЛ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 // FieldView.ts const States = { 'closed': field => field.closed, 'flag': field => field.marked, 'empty': field => field.opened && !field.mined && !field.filled, 'exploded': field => field.opened && field.mined && field.exploded, 'mined': field => field.opened && field.mined && !field.exploded } //... 

рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдВрдЬреА рдлрд╝реНрд░реЗрдо рдХреЗ рдорд╛рди рд╣реЛрдВрдЧреЗ, рдФрд░ рдЗрди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдорд╛рди рдХреЙрд▓рдмреИрдХ рд╣реИрдВ рдЬреЛ рдмреВрд▓рд┐рдпрди рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдлреНрд░реЗрдо (рдЬреЛ рдХрд┐ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдХреБрдВрдЬреА рд╣реИ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 // FieldView.ts //... private get _frameName(): string { for (let key in States) { if (States[key](this._model)) { return key; } } return this._model.value.toString(); } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд▓реВрдк рдореЗрдВ рд╕рд░рд▓ рдЧрдгрдирд╛ рджреНрд╡рд╛рд░рд╛, рд╣рдо рдХреЙрдиреНрдлрд┐рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдХреБрдВрдЬреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрджрд▓реЗ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╡рд╣ trueрдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ keyрд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдХреБрдВрдЬреА рдореЙрдбрд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдлреНрд░реЗрдо рд╣реИред

рдпрджрд┐ рдХреЛрдИ рдХреБрдВрдЬреА рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЦреБрд▓реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ _value, рдХреНрдпреЛрдВрдХрд┐ Statesрд╣рдордиреЗ рдЗрд╕ рд░рд╛рдЬреНрдп рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред

рдЕрдм рд╣рдо рдмреЛрд░реНрдб рдлрд╝реАрд▓реНрдб рдкрд░ рдмрд╛рдИрдВ рдХреНрд▓рд┐рдХ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдХреИрд╕реЗ рдЦреБрд▓рддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред

4.4 рд░рд╛рдЗрдЯ рдХреНрд▓рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдПрдВ-рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╣рдореЗрдВ рдЪрдпрдирд┐рдд рд╕реЗрд▓ рдХреЛ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдХреБрдЫ рд╢рд░реНрддреЗрдВ рд╣реИрдВред

  1. рдХреЗрд╡рд▓ рдПрдХ рдмрдВрдж рдлрд╝реАрд▓реНрдб рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕реЗ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  2. рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдлрд┐рд░ рд╕реЗ рдПрдХ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдлрд╝реНрд▓реИрдЧ рдХреЛ рдлрд╝реАрд▓реНрдб рд╕реЗ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП
  3. рдзреНрд╡рдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд / рдирд┐рдХрд╛рд▓рддреЗ рд╕рдордп, рд╕реНрддрд░ рдкрд░ рдЙрдкрд▓рдмреНрдз рдЭрдВрдбреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ

рдЫрджреНрдо рдХреЛрдб рдореЗрдВ рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдорд┐рд▓рддреА рд╣реИрдВ:

                                

рдЕрдм рд╣рдо рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХреЙрд▓ рдореЗрдВ рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рдЕрднреА рддрдХ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рд╣реБрдП рд╣реЛрдВ:

 // GameScene.ts private _flags: number = 0; //... private _onFieldClickRight(field: Field): void { if (field.closed && this._flags > 0) { //        field.addFlag(); //     } else if (field.marked) { //     field.removeFlag(); //   } this._flags = Bombs - this._board.countMarked; } //... public create(): void { this._flags = Bombs; //... } //... 

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдПрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░ рднреА рд╢реБрд░реВ рдХрд┐рдпрд╛ _flags, рдЬреЛ рдХрд┐ рдЦреЗрд▓ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдмреЛрд░реНрдб рдкрд░ рдмрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЦреЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рднреА рдЭрдВрдбрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдлрд╝реАрд▓реНрдб рдХреЛ рд╣рд░ рд░рд╛рдЗрдЯ рдХреНрд▓рд┐рдХ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдзреНрд╡рдЬ рдХреЛ рдпрд╛ рддреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдмреЛрд░реНрдб рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ BoardрдЧреЗрдЯреНрдЯрд░ рдЬреЛрдбрд╝реЗрдВ countMarked:

 // Board.ts //... public get countMarked(): number { return this._fields.filter(field => field.marked).length; } //... 

рдЭрдВрдбреЗ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдмрджрд▓рд╛рд╡ рд╣реИ Field, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЗрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ open:

 // Field.ts //... public addFlag(): void { this._setState(States.Marked); } public removeFlag(): void { this._setState(States.Closed); } //... 

рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ _setStateрдПрдХ рдШрдЯрдирд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ changeрдЬреЛ рджреГрд╢реНрдп рдореЗрдВ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЙрдбрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рдЗрд╕ рдмрд╛рд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рд░рдВрдЧ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕рд╣реА рдорд╛рдЙрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдЦреБрд▓рддрд╛ рд╣реИред рдЙрд╕ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЧреЗрдо рджреГрд╢реНрдп рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ:

 // GameScene.ts //... constructor() { super('Game'); //        document.querySelector("canvas").oncontextmenu = e => e.preventDefault(); } //... 

4.5 GameSceneView рдСрдмреНрдЬреЗрдХреНрдЯ


рдЧреЗрдо рдХреЗ рджреГрд╢реНрдп рдкрд░ UI рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВрдЧреЗ GameSceneViewрдФрд░ рдЙрд╕рдореЗрдВ рдЬрдЧрд╣ рджреЗрдВрдЧреЗ src/scripts/views/GameSceneView.tsред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЕрд▓рдЧ рдПрдХ рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ FieldViewрдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рдФрд░ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдирд╣реАрдВ рдмрдирд╛рдПрдВрдЧреЗ GameObjectsред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рджреГрд╢реНрдп рджреГрд╢реНрдп рд╕реЗ рдирд┐рдореНрди рддрддреНрд╡реЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдЭрдВрдбреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд╛рда
  • рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ рдмрдЯрди
  • рдЧреЗрдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрджреЗрд╢ (рдЬреАрдд / рд╣рд╛рд░)

рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ UI рддрддреНрд╡ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ GameSceneViewред
рд╣рдо рдПрдХ рд╕реНрдЯрдм рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗред

 enum Styles { Color = '#008080', Font = 'Arial' } enum Texts { Flags = 'FLAGS: ', Exit = 'EXIT', Success = 'YOU WIN!', Failure = 'YOU LOOSE' }; export class GameSceneView { private _scene: Phaser.Scene = null; private _style: {font: string, fill: string}; constructor(scene: Phaser.Scene) { this._scene = scene; this._style = {font: `28px ${Styles.Font}`, fill: Styles.Color}; this._create(); } private _create(): void { } public render() { } } 

рдЭрдВрдбреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкрд╛рда рдЬреЛрдбрд╝реЗрдВред

 // GameSceneView.ts //... private _txtFlags: Phaser.GameObjects.Text = null; //... private _createTxtFlags(): void { this._txtFlags = this._scene.add.text( 50, 50, Texts.Flags, this._style ).setOrigin(0, 1); } //... 

рдпрд╣ рдХреЛрдб рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдкрд╛рда рдХреЛ рд╢реАрд░реНрд╖ рдФрд░ рдмрд╛рдИрдВ рдУрд░ рд╕реЗ 50px рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╢реИрд▓реА рдкрд░ рд╕реЗрдЯ рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рдзрд┐ setOriginрдкрд╛рда рдХреЗ рдзреБрд░реА рдмрд┐рдВрджреБ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (0, 1) рдкрд░ рд╕реЗрдЯ рдХрд░рддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд╛рда рдЕрдкрдиреА рдмрд╛рдИрдВ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдЧрд╛ред

рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВред

 // GameSceneView.ts //... private _txtStatus: Phaser.GameObjects.Text = null; //... private _createTxtStatus(): void { this._txtStatus = this._scene.add.text( this._scene.cameras.main.centerX, 50, Texts.Success, this._style ).setOrigin(0.5, 1); this._txtStatus.visible = false; } //... 

рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдкрд╛рда рдХреЛ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ setOriginx рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ 0.5 рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдХреЗ рдкрдВрдХреНрддрд┐ рдХреЗ рдордзреНрдп рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕ рдкрд╛рда рдХреЛ рдЫреБрдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЦреЗрд▓ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рджрд┐рдЦрд╛рдПрдВрдЧреЗред

рдПрдХ рдПрдХреНрдЬрд╝рд┐рдЯ рдмрдЯрди рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдХреЗ рдореВрд▓ рдореЗрдВ рднреА рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред

 // GameSceneView.ts //... private _btnExit: Phaser.GameObjects.Text = null; //... private _createBtnExit(): void { this._btnExit = this._scene.add.text( this._scene.cameras.main.width - 50, 50, Texts.Exit, this._style ).setOrigin(1); this._btnExit.setInteractive(); this._btnExit.once('pointerdown', () => { this._scene.scene.start('Start'); }); } //... 

рд╣рдо рдмрдЯрди рдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдКрдкрд░реА рджрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ setOriginрдЗрд╕ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЗрд╕рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рд╕рд╛рде рдкрд╛рда рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рд╣рдо рдмрдЯрди рдХреЛ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд╢реБрд░реБрдЖрддреА рджреГрд╢реНрдп рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рд╕реНрддрд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддреЗ рд╣реИрдВред

рдпрд╣ renderUI рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╕рднреА рдирд┐рд░реНрдорд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЙрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ _createред

 // GameSceneView.ts //... private _create(): void { this._createTxtFlags(); this._createTxtStatus(); this._createBtnExit(); } public render(data: {flags?: number, status?: boolean}) { if (typeof data.flags !== 'undefined') { this._txtFlags.text = Texts.Flags + data.flags.toString(); } if (typeof data.status !== 'undefined') { this._txtStatus.text = data.status ? Texts.Success : Texts.Failure; this._txtStatus.visible = true; } } //... 

рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдпреВрдЖрдИ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
GameScene рд╡рд░реНрдЧ рдореЗрдВ рдЧреЗрдо рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдмрдирд╛рдПрдБ рдФрд░ рдЬрд╣рд╛рдВ рднреА рдЕрд░реНрде рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╡рд╣рд╛рдВ _render рдкрджреНрдзрддрд┐ рдкрд░ рдХреЙрд▓ рд▓рд┐рдЦреЗрдВ:

 // GameScene.ts //... import { GameSceneView } from "../views/GameSceneView"; //... export class GameScene extends Phaser.Scene { private _view: GameSceneView = null; //... private _onGameOver(status: boolean) { //... this._view.render({status}); } //... private _onFieldClickRight(field: Field): void { //... this._flags = Bombs - this._board.countMarked; this._view.render({flags: this._flags}); } //... public create(): void { //... this._view = new GameSceneView(this); this._view.render({flags: this._flags}); } //... } 

5. рдПрдирд┐рдореЗрд╢рди


рдПрдХ рдЧреЗрдо рдмрдирд╛рдиреЗ рд╕реЗ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдорд╛рд░реЗ рдЬреИрд╕реЗ рд╕рд░рд▓, рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдПрдирд┐рдореЗрд╢рди рдирд╣реАрдВ рд╣реИрдВ?!? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рд╕реЗ рд╣рдордиреЗ рдлрд╝реИрд╕рд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЖрдЗрдП рд╣рдо рдПрдирд┐рдореЗрд╢рди рдХреА рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВ рдФрд░ рдЬреБрдбрд╝рд╡рд╛рдБ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬреБрдбрд╝рд╡рд╛рдУрдВ рдХреЛ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЦреЗрд▓ рдореЗрдВ 2 рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝реЗрдВ: рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рднрд░рдирд╛ рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗрд▓ рдХреЛ рдлреНрд▓рд┐рдк рдХрд░рдирд╛ред рдЪрд▓реЛ рдЗрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

5.1 рдмреЛрд░реНрдб рдПрдирд┐рдореЗрд╢рди рднрд░реЗрдВ




рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдмреЛрд░реНрдб рдХреА рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╕реНрдХреНрд░реАрди рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдЙрдбрд╝рддреА рд╣реИрдВред рдЧреЗрдо рд╕реНрддрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдВрджреЛрд▓рди рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХрдХреНрд╖рд╛ рдореЗрдВ, FiledViewрд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ _createрдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ _animateShow:

 // FieldView.ts //... private _create(): void { //... this._animateShow(); } //... 

B рд╣рдо рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреЗ рдирдП рддрд░реАрдХреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рд╕рд╣рдорддрд┐ рд╡реНрдпрдХреНрдд рдХреА, 2 рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

  1. рд╕реЗрд▓ рдХреЛ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдХреЗ рдкреАрдЫреЗ рд▓реЗ рдЬрд╛рдПрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рди рджреЗ
  2. рд╕рд╣реА рджреЗрд░реА рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЬреБрдбрд╝рд╡рд╛рдВ рдЖрдВрджреЛрд▓рди рд╢реБрд░реВ рдХрд░реЗрдВ

 // FieldView.ts //... private _animateShow(): Promise<void> { this.x = -this.width; this.y = -this.height; const delay = this._model.row * 50 + this._model.col * 10; return this._moveTo(this._position, delay); } //... 

рдЪреВрдВрдХрд┐ рдХреИрдирд╡рд╛рд╕ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (0, 0) рд╣реИ, рддреЛ рдЕрдЧрд░ рд╣рдо рд╕реЗрд▓ рдХреЛ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реЗрд▓ рдХреЛ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдХреЗ рдкреАрдЫреЗ рд░рдЦ рджреЗрдЧрд╛ рдФрд░ рд╕реНрдХреНрд░реАрди рд╕реЗ рдЫрд┐рдкрд╛ рджреЗрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд┐рдпрд╛ред

рдЖрдк рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рджреВрд╕рд░рд╛ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ _moveToред

 // FieldView.ts //... private _moveTo(position: Vec2, delay: number): Promise<void> { return new Promise(resolve => { this.scene.tweens.add({ targets: this, x: position.x, y: position.y, duration: 600, ease: 'Elastic', easeParams: [1, 1], delay, onComplete: () => { resolve(); } }); }); } //... 

рдПрдХ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреГрд╢реНрдп рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ tweensред рдЙрдирдХреА рдкрджреНрдзрддрд┐ рдореЗрдВ, addрд╣рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:

  • targetsрдпрд╣рд╛рдВ рдХреА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЙрди рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдореВрд▓реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдк рдПрдиреАрдореЗрд╢рди рдкреНрд░рднрд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ thisрд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреА рдПрдХ рдХрдбрд╝реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХрд╛ рдПрдХ рдкреНрд░реАрдлреИрдм рд╣реИред
  • рджреВрд╕рд░рд╛ рдФрд░ рддреАрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдо рдЧрдВрддрд╡реНрдп рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред
  • рд╕рдВрдкрддреНрддрд┐ durationрдПрдиреАрдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ - 600msред
  • рдкреИрд░рд╛рдореАрдЯрд░ easeрдФрд░ easeParamsрд╕рд╣рдЬрддрд╛ рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░реЗрдВред
  • рджреЗрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рд╣рдо рджреВрд╕рд░реЗ рддрд░реНрдХ рд╕реЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдмреЛрд░реНрдб рдкрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдмрд╛рд╣рд░ рди рдирд┐рдХрд▓реЗрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдереЛрдбрд╝реА рджреЗрд░реА рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
  • рдЕрдВрдд рдореЗрдВ, onCompleteрд╣рдо рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдПрдХ рдХреЙрд▓рдмреИрдХ рдбрд╛рд▓рддреЗ рд╣реИрдВ , рдЬрд┐рд╕реЗ рдЯреНрд╡рд┐рди рдПрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдПрдХ рд╡рд╛рджреЗ рдореЗрдВ рдЬреБрдбрд╝рд╡рд╛ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реИ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдПрдирд┐рдореЗрд╢рди рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдбреЙрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ resolve, рдЬреЛ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рдлрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ред

5.2 рд╕реЗрд▓ рдлреНрд▓рд┐рдк рдПрдирд┐рдореЗрд╢рди




рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐, рдЬрдм рд╕реЗрд▓ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдХреЗ рдЙрд▓рдЯ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡рд░реНрддрдорд╛рди _renderрдореЗрдВ рджреГрд╢реНрдп рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╕реЗрд▓ рдХреЛ рдЦреЛрд▓рдирд╛ рдлреНрд░реЗрдо рдХреЛ рдмрджрд▓рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд▓ рдЦреБрд▓реА рдереАред рдпрджрд┐ рдХрдХреНрд╖ рдЦреБрд▓рд╛ рдерд╛, рддреЛ рддреБрд░рдВрдд рдПрдХ рдирдпрд╛ рдЙрддреНрдХреНрд░рдордг рдлреНрд░реЗрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░реЗрдВред

 // FieldView.ts //... private _onStateChange(): void { if (this._model.opened) { this._animateFlip(); } else { this._render(); } } //... 

рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ scaleред рдпрджрд┐ рд╣рдо рд╕рдордп рдХреЗ рд╕рд╛рде рдзреБрд░реА xрдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реНрдХреЗрд▓ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдпрд╣ рдЕрдВрддрддрдГ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдкрдХреНрд╖реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рд╕рд┐рдХреБрдбрд╝ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрджрд┐ рдЖрдк рдзреБрд░реА рдХреЗ рд╕рд╛рде xрд╢реВрдиреНрдп рд╕реЗ рдЗрд╕рдХреА рдкреВрд░реА рдЪреМрдбрд╝рд╛рдИ рддрдХ рд╕реНрдХреЗрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЗрд╕рдХреЗ рдкреВрд░реНрдг рдЖрдХрд╛рд░ рддрдХ рдлреИрд▓рд╛рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ _animateFlipред

 // FieldView.ts //... private _animateFlip(): void { this._scaleXTo(0).then(() => { this._render(); this._scaleXTo(1); }) } //... 

рд╡рд┐рдзрд┐ рдХреЗ рдЕрдиреБрд░реВрдк, рд╣рдо _moveToрд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ _scaleTo:

 // FieldView.ts //... private _scaleXTo(scaleX: number): Promise<void> { return new Promise(resolve => { this.scene.tweens.add({ targets: this, scaleX, ease: 'Elastic.easeInOut', easeParams: [1, 1], duration: 150, onComplete: () => { resolve() } }); }); } //... 

рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкреИрдорд╛рдиреЗ рдХрд╛ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдЕрдиреНрдп рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред

рдЕрдм рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдкрдиреЗ рдЦреЗрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛! :)

рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореЗрд░реЗ рд╕рд╛рде рдЗрд╕ рдкрд▓ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж рдХрд░рддрд╛ рд╣реВрдБ!

рдирд┐рд╖реНрдХрд░реНрд╖


рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ, рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╕рд╛рдордЧреНрд░реА рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдЖрдк рдЕрдкрдиреА рдЦреБрдж рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрди рдпрд╛ рдЙрди рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рдФрд░ рдлрд╝реИрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ gamedev рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдирдП рдкрд░рд┐рдЪрд┐рддреЛрдВ рдФрд░ рдЕрдиреБрднрд╡реЛрдВ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА!

рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрднреА рдПрдХ рдкреНрд░рд╢реНрди рд╣реИред рдЪреВрдВрдХрд┐ рдореИрдВ рдЦреЗрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрди рдЫреЛрдЯреЗ рдЦреЗрд▓реЛрдВ рдХрд╛ рдПрдХ рджрд░реНрдЬрди рдЬрдорд╛ рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЦреЗрд▓ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд░реВрдкрд░реЗрдЦрд╛ рдЦреЛрд▓рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЦреЗрд▓ рдореЗрдВ рд╣рдордиреЗ рдЬреБрдбрд╝рд╡рд╛ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЫреБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рднреМрддрд┐рдХреА, рддрд┐рд▓рдорд╛рдк, рд░реАрдврд╝ рдЖрджрд┐ред
рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрд╣ рд▓реЗрдЦ рдкрд╕рдВрдж рдЖрдпрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЫреЛрдЯреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдЦреЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ? рдпрджрд┐ рдЙрддреНрддрд░ рд╣рд╛рдБ рд╣реИ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдЦрд╝реБрд╢реА рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░реВрдБрдЧрд╛ рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдирдП рдореИрдиреБрдЕрд▓ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдБрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЦреЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдПред рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд░реНрд╡реЗрдХреНрд╖рдг рд▓рд╛рддрд╛ рд╣реВрдВред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЬрд▓реНрдж рд╣реА рдЖрдк рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛!

Source: https://habr.com/ru/post/hi476682/


All Articles