рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╕реЛрд▓рд┐рдбреНрд╕: рдУрдкрдирдЬреАрдПрд▓, рднрд╛рдЧ I рдХреЗ рддрд╣рдд C # рдореЗрдВ рдПрдХ рдЧреЗрдо рдмрдирд╛рдирд╛

рд╡рдиреНрд╕ рдЕрдкреЙрди рдП рдЯрд╛рдЗрдо рдЗрди рдЕрдореЗрд░рд┐рдХрд╛


рдПрдХ рдмрд╛рд░, 2002 рдореЗрдВ, рдЕрдореЗрдЬрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ рдирд╛рдордХ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЦрд┐рд▓реМрдирд╛ рдиреЗ рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рд╣рд┐рдЯ рдХрд┐рдпрд╛ред рдПрдХ рдЧреЗрдо, рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреЗрдЯреНрд░рд┐рд╕ рдХреНрд▓рд╛рд╕ (рдЧреЗрдордкреНрд▓реЗ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ); рд╡рд╣ рдореЗрд░реА рдорд╛рдВ рдХреЗ рдмрд╣реБрдд рд╢реМрдХреАрди рдереЗ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдЦреЗрд▓ рдХреЛ рдШрдВрдЯреЛрдВ рдЦреЗрд▓рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдХрдореА рдереА: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, 10 рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЦреЗрд▓ рдХреЛ рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╢реБрд░реВ рд╣реБрдИ, рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рдирд┐: рд╢реБрд▓реНрдХ рдерд╛, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЬреЛ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рджреБрд░реНрдЧрдо рдмрд╛рдзрд╛ рдереА, рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╣рдорд╛рд░реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдХреЛрдИ рдЗрдВрдЯрд░рдиреЗрдЯ рдирд╣реАрдВ рдерд╛ред , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реБрдирд╛ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╣реИред рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

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

рдЫрд╡рд┐ рддреЛ рд╣рдо рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдЦреЗрд▓ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ? рдмрд╛рдд рдпрд╣ рд╣реИред рдПрдХ рдЖрдпрддрд╛рдХрд╛рд░ рдЧреНрд▓рд╛рд╕ 7 ├Ч 13 рдореЗрдВ, рдПрдХ рдХреНрд╖реИрддрд┐рдЬ рдЫрдбрд╝реА рдЧрд┐рд░рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 3 рд░рдВрдЧ рдмреНрд▓реЙрдХ рд╣реЛрддреЗ рд╣реИрдВ (рдХреБрд▓ 5 рд░рдВрдЧ рд╣реЛрддреЗ рд╣реИрдВ)ред рдЖрдВрджреЛрд▓рди рдХреЗ рджреМрд░рд╛рди, рдЗрд╕реЗ рджрд╛рдПрдВ-рдмрд╛рдПрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ (рд▓рд╛рд▓, рд╣рд░рд╛, рдиреАрд▓рд╛ тЖТ рд╣рд░рд╛, рдиреАрд▓рд╛, рд▓рд╛рд▓) рдХреЗ рд░реЛрдЯреЗрд╢рди рдореЗрдВ рд╕реНрд╡реИрдк рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдЫрдбрд╝реА рдХрд╛рдВрдЪ рдХреЗ рдлрд░реНрд╢ рдХреЛ рдЫреВрддреА рд╣реИ рдпрд╛ рдЧреНрд▓рд╛рд╕ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рд░ рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯрд┐рдХ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрд┐рд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмреНрд▓реЙрдХ рдпрд╛ рдЖрдзрд╛ рдЧрд┐рд▓рд╛рд╕ рдкрд░ рди рд╣реЛрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рдВрдЪ рдореЗрдВ рдПрдХ рд╣реА рд░рдВрдЧ рдХреЗ рддреАрди рдпрд╛ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рдХреА рдПрдХ рдХреНрд╖реИрддрд┐рдЬ, рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдпрд╛ рд╡рд┐рдХрд░реНрдг рд░реЗрдЦрд╛ рд╣реИ; рдРрд╕реА рд▓рд╛рдЗрдиреЗрдВ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдпрджрд┐ рдирд╖реНрдЯ рд▓рд╛рдЗрди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмреНрд▓реЙрдХ рдереЗ, рддреЛ рд╡реЗ рдЦрд╛рд▓реА рдЬрдЧрд╣ рдкрд░ рд╕реНрд▓рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЧрдард┐рдд рд▓рд╛рдЗрдиреЗрдВ рдлрд┐рд░ рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдЬрдм рд╕рдм рдХреБрдЫ рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдКрдкрд░ рд╕реЗ рдПрдХ рдирдИ рдЫрдбрд╝реА рдЧрд┐рд░рдиреЗ рд▓рдЧрддреА рд╣реИред рдирд╖реНрдЯ рд╣реЛ рдЪреБрдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЧреНрд▓рд╛рд╕ рдКрдкрд░ рд╕реЗ рднрд░ рдЬрд╛рдиреЗ рдкрд░ рдЦреЗрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреАред рд╣рдо рдЦреЗрд▓ рдХреЛ рд╕реА # рдореЗрдВ рдХрд░реЗрдВрдЧреЗ (рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ), рдУрдкрдирдЬреАрдПрд▓ (рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рд┐рдирдХреНрд╕ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ), рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдорд░реНрдХреНрдпреВрд░рд┐рдпрд▓ (рд╡реАрд╕реАрдПрд╕ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдкрдорд╛рдирдЬрдирдХ рд╣реИ)ред

рдЧреЗрдо рдХреЛ рдЗрдореНрдкреНрд░реЗрд╕рд┐рд╡ рд╕реЙрд▓рд┐рдбреНрд╕ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред


рдЖрд░рдВрдн


рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ Microsoft Visual C # 2010 рдПрдХреНрд╕рдкреНрд░реЗрд╕ (рдирд┐рд╢реБрд▓реНрдХ рд╡рд┐рддрд░рд┐рдд) рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ Mercurial рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡рд┐рдВрдбреЛрдЬ рдХреНрд▓рд╛рдЗрдВрдЯ TortoiseHg рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓рд┐рдирдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╣рдо MonoDevelop рдФрд░ рдХрдВрд╕реЛрд▓ hg рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

OpenGL рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдмрд╛рдЗрдВрдбрд┐рдВрдЧ OpenTK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рдЖрдкрдХреЛ рдирд╡реАрдирддрдо рдирд╛рдЗрдЯрд▓реА рдмрд┐рд▓реНрдб (рд▓реЗрдЦрди рдХреЗ рд╕рдордп: 2011-12-03) рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

ImpressiveSolids рдирд╛рдордХ Visual C # Express рдореЗрдВ рдПрдХ рдирдпрд╛ рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБред рд╕рд╣реЗрдЬреЗрдВред рдлрд┐рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЦреЛрд▓реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ TortoiseHg тЖТ рдХреНрд░рд┐рдПрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдпрд╣рд╛рдВ рдЪреБрдиреЗрдВред рд╣рдо .hignore рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред

Visual C # рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ .hgignore рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреЗрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рди рд░рдЦреЗред

syntax: glob *.suo *.pidb ImpressiveSolids/bin/* ImpressiveSolids/obj/* 


рд╕рдорд╛рдзрд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ; рдЬрд╣рд╛рдВ .hignignore рдирд┐рд╣рд┐рдд рд╣реИ), OpenTK рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдФрд░ OpenTK * OpenTK \ OpenTK \ рд░рд┐рд▓реАрдЬрд╝ \ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╕реЗ OpenTK *ред Dll рдФрд░ OpenTK *ред Dll.config рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБред

рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реА # рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдореЗрдВ, рд╕рдВрджрд░реНрдн рдореЗрдиреВ рд╕рдВрджрд░реНрдн тЖТ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗрдВ тЖТ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░реЗрдВред рдЪреБрдиреЗрдВ ../OpenTK/OpenTK.dllред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ .NET рдЯреИрдм рд╕реЗ System.Drawing рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рдирдпрд╛ Game рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ рд╣реИ, рдЗрд╕рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рд╡рд╣ OpenTK.GameWindow рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реИ рдФрд░ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ ( OnUpdateFrame ) рдФрд░ redrawing ( OnUpdateFrame ) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЕрдм рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рд▓реА рдЦрд┐рдбрд╝рдХреА рд╣реЛрдЧреАред

  using System; using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; namespace ImpressiveSolids { class Game : GameWindow { [STAThread] static void Main() { using (var Game = new Game()) { Game.Run(30); } } public Game() : base(700, 500, GraphicsMode.Default, "Impressive Solids") { VSync = VSyncMode.On; } protected override void OnLoad(EventArgs E) { base.OnLoad(E); } protected override void OnResize(EventArgs E) { base.OnResize(E); GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height); } protected override void OnUpdateFrame(FrameEventArgs E) { base.OnUpdateFrame(E); } protected override void OnRenderFrame(FrameEventArgs E) { base.OnRenderFrame(E); GL.ClearColor(Color4.Black); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); SwapBuffers(); } } } 


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ рдкрд░ рдЬрд╛рдПрдВ (рдкреНрд░реЛрдЬреЗрдХреНрдЯ тЖТ рдЗрдореНрдкреНрд░реЗрд╕рд┐рд╡рд╕реЛрд▓рд┐рдбреНрд╕ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝) рдФрд░ рдЯрд╛рд░рдЧреЗрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ: .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 2.0; рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░: рд╡рд┐рдВрдбреЛрдЬ рдПрдкреНрд▓реАрдХреЗрд╢рди; рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдСрдмреНрдЬреЗрдХреНрдЯ: ImpressiveSolids.Gameред

рдЖрдк рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, "рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╕реЙрд▓рд┐рдбреНрд╕" рд╢реАрд░реНрд╖рдХ рдХреЗ рд╕рд╛рде 700 ├Ч 500 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд▓реА рдЦрд┐рдбрд╝рдХреА рджрд┐рдЦрд╛рдИ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓рд╛, рддреЛ рдХрдЫреБрдЖ рд╣реЙрдЧ рд╡рд░реНрдХрдмреЗрдиреНрдЪ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ "рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧреЗрдо рд╡рд┐рдВрдбреЛ" рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдХрд░реЗрдВред

рдЧрд┐рд░рдирд╛


рд╣рдореЗрдВ рдЫрдбрд╝реА рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдЧрд┐рд░рдиреЗ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдЯрд┐рдХ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдореЙрдбрд▓ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдерд┐рддрд┐ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ - рдХрд╛рдВрдЪ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ (0; 0) рдХрд╛рдВрдЪ рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рд╡реИрд╕реЗ, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЖрдпрд╛рдо MapWidth , MapHeight рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреНрд▓реЙрдХ рдХреЗ рд░рдВрдЧ рдЬреЛ рд╕реНрдЯрд┐рдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рд░рдВрдЧ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реЛрдВ рдХрд┐ рд░рдВрдЧ рдХреЛ 0 рд╕реЗ ColorsCount тИТ 1 рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

  private Random Rand; private const int MapWidth = 7; private const int MapHeight = 13; private const int StickLength = 3; private int[] StickColors; private Vector2 StickPosition; private const int ColorsCount = 5; protected override void OnLoad(EventArgs E) { base.OnLoad(E); New(); } private void New() { Rand = new Random(); StickColors = new int[StickLength]; for (var i = 0; i < StickLength; i++) { StickColors[i] = Rand.Next(ColorsCount); } StickPosition.X = (float)Math.Floor((MapWidth - StickLength) / 2d); StickPosition.Y = 0; } 


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

  private const int NominalWidth = 700; private const int NominalHeight = 500; private float ProjectionWidth; private float ProjectionHeight; private const int SolidSize = 35; private Color4[] Colors = {Color4.PaleVioletRed, Color4.LightSeaGreen, Color4.CornflowerBlue, Color4.RosyBrown, Color4.LightGoldenrodYellow}; public Game() : base(NominalWidth, NominalHeight, GraphicsMode.Default, "Impressive Solids") { VSync = VSyncMode.On; } protected override void OnResize(EventArgs E) { base.OnResize(E); GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height); ProjectionWidth = NominalWidth; ProjectionHeight = (float)ClientRectangle.Height / (float)ClientRectangle.Width * ProjectionWidth; if (ProjectionHeight < NominalHeight) { ProjectionHeight = NominalHeight; ProjectionWidth = (float)ClientRectangle.Width / (float)ClientRectangle.Height * ProjectionHeight; } } protected override void OnRenderFrame(FrameEventArgs E) { base.OnRenderFrame(E); GL.ClearColor(Color4.Black); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); var Projection = Matrix4.CreateOrthographic(-ProjectionWidth, -ProjectionHeight, -1, 1); GL.MatrixMode(MatrixMode.Projection); GL.LoadMatrix(ref Projection); GL.Translate(ProjectionWidth / 2, -ProjectionHeight / 2, 0); var Modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY); GL.MatrixMode(MatrixMode.Modelview); GL.LoadMatrix(ref Modelview); GL.Begin(BeginMode.Quads); for (var i = 0; i < StickLength; i++) { RenderSolid(StickPosition.X + i, StickPosition.Y, StickColors[i]); } GL.End(); SwapBuffers(); } private void RenderSolid(float X, float Y, int Color) { GL.Color4(Colors[Color]); GL.Vertex2(X * SolidSize, Y * SolidSize); GL.Vertex2((X + 1) * SolidSize, Y * SolidSize); GL.Vertex2((X + 1) * SolidSize, (Y + 1) * SolidSize); GL.Vertex2(X * SolidSize, (Y + 1) * SolidSize); } 


рд╡рд┐рдВрдбреЛ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП Nominal/Projection Width/Height рд╕рд╛рде рдЯреНрд░рд┐рдХреНрд╕ Nominal/Projection Width/Height рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЕрдиреБрдкрд╛рдд рд╡рд┐рдХреГрдд рдирд╣реАрдВ рдереЗред

рдЕрдм рдЕрдВрдд рдореЗрдВ рд╕реНрдЯрд┐рдХ рдлреЙрд▓ рдХрд░реЗрдВ рдФрд░ тАЩs, тЖТ, (рдХреАрдЬрд╝ рд╡рд░реНрдХ (рдХрд▓рд░ рд░реЛрдЯреЗрд╢рди) рдХрд░реЗрдВред

  public Game() : base(NominalWidth, NominalHeight, GraphicsMode.Default, "Impressive Solids") { VSync = VSyncMode.On; Keyboard.KeyDown += new EventHandler<KeyboardKeyEventArgs>(OnKeyDown); } protected override void OnUpdateFrame(FrameEventArgs E) { base.OnUpdateFrame(E); StickPosition.Y += 0.02f; } protected void OnKeyDown(object Sender, KeyboardKeyEventArgs E) { if (Key.Left == E.Key) { --StickPosition.X; } else if (Key.Right == E.Key) { ++StickPosition.X; } else if (Key.Up == E.Key) { var T = StickColors[0]; for (var i = 0; i < StickLength - 1; i++) { StickColors[i] = StickColors[i + 1]; } StickColors[StickLength - 1] = T; } } 


рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ: "рдЫрдбрд╝реА, рдЧрд┐рд░рдиреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рдиреЗ рдпреЛрдЧреНрдп"ред

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

рджреБрдирд┐рдпрд╛ рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛


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

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

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

  private int[,] Map; private void New() { Rand = new Random(); Map = new int[MapWidth, MapHeight]; for (var X = 0; X < MapWidth; X++) { for (var Y = 0; Y < MapHeight; Y++) { Map[X, Y] = -1; } } StickColors = new int[StickLength]; GenerateNextStick(); } private void GenerateNextStick() { for (var i = 0; i < StickLength; i++) { StickColors[i] = Rand.Next(ColorsCount); } StickPosition.X = (float)Math.Floor((MapWidth - StickLength) / 2d); StickPosition.Y = 0; } protected override void OnUpdateFrame(FrameEventArgs E) { base.OnUpdateFrame(E); StickPosition.Y += 0.02f; var FellOnFloor = (StickPosition.Y >= MapHeight - 1); var FellOnBlock = false; if (!FellOnFloor) { var Y = (int)Math.Floor(StickPosition.Y + 1); for (var i = 0; i < StickLength; i++) { var X = (int)StickPosition.X + i; if (Map[X, Y] >= 0) { FellOnBlock = true; break; } } } if (FellOnFloor || FellOnBlock) { var Y = (int)Math.Floor(StickPosition.Y); for (var i = 0; i < StickLength; i++) { var X = (int)StickPosition.X + i; Map[X, Y] = StickColors[i]; } GenerateNextStick(); } } protected void OnKeyDown(object Sender, KeyboardKeyEventArgs E) { if ((Key.Left == E.Key) && (StickPosition.X > 0)) { --StickPosition.X; } else if ((Key.Right == E.Key) && (StickPosition.X + StickLength < MapWidth)) { ++StickPosition.X; } else if (Key.Up == E.Key) { // . . . } } protected override void OnRenderFrame(FrameEventArgs E) { // . . . GL.Begin(BeginMode.Quads); for (var X = 0; X < MapWidth; X++) { for (var Y = 0; Y < MapHeight; Y++) { if (Map[X, Y] >= 0) { RenderSolid(X, Y, Map[X, Y]); } } } for (var i = 0; i < StickLength; i++) { RenderSolid(StickPosition.X + i, StickPosition.Y, StickColors[i]); } GL.End(); SwapBuffers(); } 


рдЕрдм рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдмреНрд▓реЙрдХ рдХреЛ рдмрд╣реБрдд рдКрдкрд░ рддрдХ рд╕реНрдХреЗрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдЯреЗрдЯреНрд░рд┐рд╕ рдореЗрдВред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдк 0.02f рд╕рд╛рде 0.2f рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рджрд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ред рдХреБрдВрдЬреА рджрдмрд╛рдХрд░ рдЗрд╕реЗ рддреЗрдЬ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рдорд░рдХрд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ: "рд╕реНрдЯрд┐рдХ рдЧрд┐рд░рдиреЗ рдХреЗ рдмрд╛рдж рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдмреНрд▓реЙрдХ"ред

рджреЛрд╣рд░рд╛ рдЕрд╕рд░


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

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

рд╣рдо рдХреЛрдб рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдШреЛрд╖рдгрд╛рдПрдБ рдХрд░реЗрдВрдЧреЗред

  private enum GameStateEnum { Fall, Impact, GameOver } private GameStateEnum GameState; private void New() { // . . . GenerateNextStick(); GameState = GameStateEnum.Fall; } protected override void OnUpdateFrame(FrameEventArgs E) { base.OnUpdateFrame(E); if (GameStateEnum.Fall == GameState) { StickPosition.Y += 0.2f; // . . . if (FellOnFloor || FellOnBlock) { var Y = (int)Math.Floor(StickPosition.Y); for (var i = 0; i < StickLength; i++) { var X = (int)StickPosition.X + i; Map[X, Y] = StickColors[i]; } GameState = GameStateEnum.Impact; } } else if (GameStateEnum.Impact == GameState) { var Stabilized = true; // TODO   if (Stabilized) { GenerateNextStick(); GameState = GameStateEnum.Fall; } } } 


рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдПрдХ рдЪрд┐рдХрдиреА рдЧрд┐рд░рд╛рд╡рдЯ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдХрд╛рдВрдЪ ( Map ) рдХреЗ рдореЙрдбрд▓ рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЪрд╛рд▓ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрддреЗ рд╣реИрдВред рд╕реЗрд▓ (X; Y) рд╕реЗ рд╕реЗрд▓ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ (X; Y + 1) рдХреЛ рдЬрд╛рдиреЗ рджреЗрдВ - рдФрд░ рдЙрд╕реЗ рдФрд░ рдХрд╣рд╛рдВ рдЧрд┐рд░рдирд╛ рдЪрд╛рд╣рд┐рдП? - рд╕реЗрд▓ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз (рдПрдХреНрд╕; рд╡рд╛рдИ) рдирд┐рдЪрд▓реЗ рд╕реЗрд▓ рдореЗрдВ рдЕрдВрддрд┐рдо рд╣рд┐рдЯ рдХреЗ рдХреНрд╖рдг рддрдХ; рдФрд░ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдмреНрд▓реЙрдХ рдХреЗ рдЖрдВрд╢рд┐рдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛ рдЬрд╛рдПред рдпрд╣реА рд╣реИ, рдмреНрд▓реЙрдХ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ (рдПрдХреНрд╕; рд╡рд╛рдИ), рд▓реЗрдХрд┐рди (рдПрдХреНрд╕; рд╡рд╛рдИ + ╬Ф), рдЗрд╕реЗ OnRenderFrame рдореЗрдВ OnRenderFrame рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред

  private const float FallSpeed = 0.2f; private float[,] ImpactFallOffset; private void New() { // . . . ImpactFallOffset = new float[MapWidth, MapHeight]; } protected override void OnUpdateFrame(FrameEventArgs E) { base.OnUpdateFrame(E); if (GameStateEnum.Fall == GameState) { StickPosition.Y += FallSpeed; // . . . } else if (GameStateEnum.Impact == GameState) { var Stabilized = true; for (var X = 0; X < MapWidth; X++) { for (var Y = MapHeight - 2; Y >= 0; Y--) { if ((Map[X, Y] >= 0) && ((Map[X, Y + 1] < 0) || (ImpactFallOffset[X, Y + 1] > 0))) { Stabilized = false; ImpactFallOffset[X, Y] += FallSpeed; if (ImpactFallOffset[X, Y] >= 1) { Map[X, Y + 1] = Map[X, Y]; Map[X, Y] = -1; ImpactFallOffset[X, Y] = 0; } } } } if (Stabilized) { GenerateNextStick(); GameState = GameStateEnum.Fall; } } } protected override void OnRenderFrame(FrameEventArgs E) { // . . . GL.Begin(BeginMode.Quads); for (var X = 0; X < MapWidth; X++) { for (var Y = 0; Y < MapHeight; Y++) { if (Map[X, Y] >= 0) { RenderSolid(X, Y + ImpactFallOffset[X, Y], Map[X, Y]); } } } if (GameStateEnum.Fall == GameState) { for (var i = 0; i < StickLength; i++) { RenderSolid(StickPosition.X + i, StickPosition.Y, StickColors[i]); } } GL.End(); SwapBuffers(); } 


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

рдкреНрд░рддрд┐рдмрджреНрдз рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: "рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рддрдХ рдмреНрд▓реЙрдХ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред"

рд╕рд╛рдореВрд╣рд┐рдХ рд╡рд┐рдирд╛рд╢ рдХрд╛ рд╣рдерд┐рдпрд╛рд░


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

  private const int DestroyableLength = 3; private Stack<Vector2> Destroyables = new Stack<Vector2>(); protected override void OnUpdateFrame(FrameEventArgs E) { // . . . } else if (GameStateEnum.Impact == GameState) { // . . . if (Stabilized) { Destroyables.Clear(); for (var X = 0; X < MapWidth; X++) { for (var Y = 0; Y < MapHeight; Y++) { CheckDestroyableLine(X, Y, 1, 0); CheckDestroyableLine(X, Y, 0, 1); CheckDestroyableLine(X, Y, 1, 1); CheckDestroyableLine(X, Y, 1, -1); } } if (Destroyables.Count > 0) { foreach (var Coords in Destroyables) { Map[(int)Coords.X, (int)Coords.Y] = -1; } Stabilized = false; } } if (Stabilized) { GenerateNextStick(); GameState = GameStateEnum.Fall; } } } private void CheckDestroyableLine(int X1, int Y1, int DeltaX, int DeltaY) { if (Map[X1, Y1] < 0) { return; } int X2 = X1, Y2 = Y1; var LineLength = 0; while ((X2 >= 0) && (Y2 >= 0) && (X2 < MapWidth) && (Y2 < MapHeight) && (Map[X2, Y2] == Map[X1, Y1])) { ++LineLength; X2 += DeltaX; Y2 += DeltaY; } if (LineLength >= DestroyableLength) { for (var i = 0; i < LineLength; i++) { Destroyables.Push(new Vector2(X1 + i * DeltaX, Y1 + i * DeltaY)); } } } 


рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣рдо рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ: "рдПрдХ рд╣реА рд░рдВрдЧ рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛"ред

рдЦреЗрд▓ рдЦрддреНрдо


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

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред

  protected override void OnUpdateFrame(FrameEventArgs E) { // . . . } else if (GameStateEnum.Impact == GameState) { // . . . if (Stabilized) { var GameOver = false; for (var X = 0; X < MapWidth; X++) { if (Map[X, 0] >= 0) { GameOver = true; break; } } if (GameOver) { GameState = GameStateEnum.GameOver; } else { GenerateNextStick(); GameState = GameStateEnum.Fall; } } } } protected void OnKeyDown(object Sender, KeyboardKeyEventArgs E) { if (GameStateEnum.Fall == GameState) { if ((Key.Left == E.Key) && (StickPosition.X > 0)) { --StickPosition.X; } else if ((Key.Right == E.Key) && (StickPosition.X + StickLength < MapWidth)) { ++StickPosition.X; } else if (Key.Up == E.Key) { var T = StickColors[0]; for (var i = 0; i < StickLength - 1; i++) { StickColors[i] = StickColors[i + 1]; } StickColors[StickLength - 1] = T; } } else if (GameStateEnum.GameOver == GameState) { if ((Key.Enter == E.Key) || (Key.KeypadEnter == E.Key)) { New(); } } } 


рдкреНрд░рддрд┐рдмрджреНрдз, рдмрд┐рдирд╛ рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдХреЗ: "рдЧреЗрдо рдУрд╡рд░ред"

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

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ Google рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ Bitbucket , рд╡рд╣рд╛рдВ рдЖрдк рдЕрдВрддрд┐рдо рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


All Articles