
рдЯреЗрдЯреНрд░рд┐рд╕-рдЬреИрд╕реЗ рдЧреЗрдо рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╕реЛрд▓рд┐рдбреНрд╕
рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдордиреЗ рдЧреЗрдордкреНрд▓реЗ рдХреЗ рдереЛрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЖрд╡реЗрджрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдиреНрдпреВрдирддрдо рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рд╣рдордиреЗ рдУрдкрдирдЬреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдордиреЗ рд╕рд┐рд░реНрдл рдПрдХ рд░рдВрдЧреАрди рдЖрдпрдд рдмрдирд╛рдХрд░ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рд╕рд╛рде рд╣реА рд╕реНрдХреЛрд░рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдЙрдЪреНрдЪ рд╕реНрдХреЛрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдЦреИрд░, рдЖрдЧреЗ рдЪрд▓рддреЗ рд╣реИрдВред
рдпрд╣ рдЪрд┐рддреНрд░
рдЪрд▓реЛ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦреЗрдВред рд╣рдореЗрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЦрд┐рдбрд╝рдХреА рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рдХреБрдЫ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЕрдЪреНрдЫреЗ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдЕрдм рдпреЗ рд╕рд┐рд░реНрдл рд░рдВрдЧреАрди рдЖрдпрддрд╛рдХрд╛рд░ рд╣реИрдВ)ред рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╛рдкрд╛рд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЬреАрдЖрдИрдПрдордкреА рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк
рд╕рдВрдЧреНрд░рд╣ рдХреЛ рддреИрдпрд╛рд░ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ
рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВред
OpenGL 2.0 рд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреНрдпреЗрдХ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЖрдХрд╛рд░ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдерд╛ (рдпрд╛рдиреА 64 ├Ч 64, 512 ├Ч 256; рдпреЗ POT рдмрдирд╛рд╡рдЯ рд╣реИрдВ, рджреЛ рдХреА рдЕрдВрдЧреНрд░реЗрдЬреА рд╢рдХреНрддрд┐ рд╕реЗ)ред рдпрджрд┐ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдпрд╛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдордирдорд╛рдиреЗ рдЖрдХрд╛рд░ (рдПрдирдкреАрдУрдЯреА рдмрдирд╛рд╡рдЯ) рдХреЗ рдмрдирд╛рд╡рдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕реА рдмрдирд╛рд╡рдЯ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреАред рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреА рдХреЗ рддрд╣рдд рдЗрдВрдЯреЗрд▓ рдПрдХреАрдХреГрдд рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдПред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рд╣рдореЗрд╢рд╛ рдкреЙрдЯ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдЧреЗ, рдЬрдм рд╣рдо рдкрд╛рда рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдХреНрд╖рдг рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдо GIMP рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА (рд╕рдлреЗрдж) рдЫрд╡рд┐ 512 ├Ч 512 рдмрдирд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░: рдлрд┐рд▓реНрдЯрд░ тЖТ рдХрд▓рд╛рддреНрдордХ тЖТ рдХреИрдирд╡рд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдлрд┐рд░: рдлрд╝рд┐рд▓реНрдЯрд░ тЖТ рдорд╛рдирдЪрд┐рддреНрд░ тЖТ рдирд┐рд░реНрдмрд╛рдз рдмрдирд╛рдПрдВред рд╕рдм рдХреБрдЫ, background.png рддреИрдпрд╛рд░ рд╣реИред
рд╣рдо рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд╕рдВрдЧрдорд░рдорд░ рдХреА рдЧреЗрдВрджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ,
рдбреИрдирд┐рдпрд▓ рдХреЗрдЪрдо рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ
рдорджрдж рдХрд░реЗрдВрдЧреЗ ред 300 ├Ч 300 рдХрд╣реАрдВ рдкрд╛рд░рджрд░реНрд╢реА рдЫрд╡рд┐ рдмрдирд╛рдПрдВ, рдХреИрдирд╡рд╛рд╕ рдХреЗ рдкреВрд░реЗ рд╡реНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЛрд▓ рдЪрдпрди рдХрд░реЗрдВред рдЯреВрд▓ рдмрдХреЗрдЯ рднрд░рдг тЖТ рдкреИрдЯрд░реНрди рднрд░рдг тЖТ рдЪрдпрди рдмрдирд╛рд╡рдЯ рд╕рдВрдЧрдорд░рдорд░ # 1, рд╕рд░реНрдХрд▓ рднрд░реЗрдВред рдЕрдЧрд▓рд╛: рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ тЖТ рдбрд┐рд╕реНрдЯреЙрд░реНрдЯ тЖТ рд▓реЗрдВрд╕ рд╡рд┐рд░реВрдкрдг, рдореБрдЦреНрдп рдХреЛ рдЕрдзрд┐рдХрддрдо рдФрд░ рдПрдЬ рдХреЛ рдиреНрдпреВрдирддрдо, рдареАрдХ рд╣реИред рдлрд┐рд░: рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ тЖТ рд▓рд╛рдЗрдЯ рдПрдВрдб рд╢реИрдбреЛ тЖТ рд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЗрдлреЗрдХреНрдЯреНрд╕, рддреАрди-рдЖрдпрд╛рдореА рдЧреЗрдВрдж рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдЯ рд╕реЗрдЯ рдХрд░реЗрдВред рдлрд╕рд▓ рддрд╛рдХрд┐ рдЦрд╛рд▓реА рдЦреЗрдд рди рд╣реЛрдВред 256 ├Ч 256 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдкреИрдорд╛рдиреЗред рдлрд┐рд░, рдХрд▓рд░реНрд╕ тЖТ Colorize рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкрд╛рдВрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ (Hue) рдХреЛ рдмрдирд╛рдПрдВ рдФрд░ 0.png, 1.png ... 4.png рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЧреЗрдо рдореЙрдбрд▓ рдореЗрдВ рд╣рдордиреЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧреЛрдВ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдерд╛)ред
рдЕрдм рд╣рдореЗрдВ рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд┐рдЬреБрдЕрд▓ C # рдПрдХреНрд╕рдкреНрд░реЗрд╕ / рдореЛрдиреЛ-рдбрд┐рд╡реЗрд▓рдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдмрдирд╛рд╡рдЯ рдирд╛рдордХ рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ, рдФрд░ рдЗрд╕рдореЗрдВ - рдареЛрд╕ред рдлрд╛рдЗрд▓ рдореИрдиреЗрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╣рдо рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб.рдкрд┐рдВрдЧ рдлрд╛рдЗрд▓ рдХреЛ рдЯреЗрдХреНрд╕рдЪрд░ рдФрд░ 0.png ... 4.Png рдлрд╛рдЗрд▓ рдХреЛ рдЯреЗрдХреНрд╕рдЪрд░ / рд╕реЙрд▓рд┐рдб рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдЪрд┐рдд рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рднреА * .png рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдЧреБрдг рдЦреЛрд▓реЗрдВ рдФрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдХреНрд░рд┐рдпрд╛: рд╕рд╛рдордЧреНрд░реА; рдЖрдЙрдЯрдкреБрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐: рдпрджрд┐ рдирдпрд╛ рд╣реИ рддреЛ рдХреЙрдкреА рдХрд░реЗрдВред
OpenGL рдореЗрдВ рдмрдирд╛рд╡рдЯ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред OpenGL рд╕реНрд╡рдпрдВ рдЧреНрд░рд╛рдлрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (
System.Drawing.Bitmap
рдорджрдж рдХрд░реЗрдЧрд╛), рдореЗрдореЛрд░реА рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд╕реЗ рдмрд╛рдЗрдирд░реА рдмрд┐рдЯрдореИрдк рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ OpenGL рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдЬреЛ рдЗрд╕рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЖрдк рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рд╡рдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рдЖрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рдПрдХ рдирдП
Texture
рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
using System; using System.Drawing; using System.Drawing.Imaging; using OpenTK.Graphics.OpenGL; namespace ImpressiveSolids { public class Texture : IDisposable { public int GlHandle { get; protected set; } public int Width { get; protected set; } public int Height { get; protected set; } public Texture(Bitmap Bitmap) { GlHandle = GL.GenTexture(); Bind(); Width = Bitmap.Width; Height = Bitmap.Height; var BitmapData = Bitmap.LockBits(new Rectangle(0, 0, Bitmap.Width, Bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, BitmapData.Width, BitmapData.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, BitmapData.Scan0); Bitmap.UnlockBits(BitmapData); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); } public void Bind() { GL.BindTexture(TextureTarget.Texture2D, GlHandle); } #region Disposable private bool Disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool Disposing) { if (!Disposed) { if (Disposing) { GL.DeleteTexture(GlHandle); } Disposed = true; } } ~Texture() { Dispose(false); } #endregion } }
Game
рдмрдирд╛рд╡рдЯ рд▓реЛрдб рдХрд░реЗрдВред
using System.Drawing;
рд░реЗрдВрдбрд░рд┐рдВрдЧ рдмрджрд▓реЗрдВред рдмрдирд╛рд╡рдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╕рд╛рде рд╣реА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдореЛрдб рднреАред рдлрд┐рд░, рдЖрдпрдд рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдирд╛рд╡рдЯ рдХрд╛ рдЪрдпрди (рдмрд╛рдЗрдВрдб) рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ (рд╡рд░реНрдЯреЗрдХреНрд╕) рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ (1; 1) рдмрдирд╛рд╡рдЯ рдХрд╛ рдирд┐рдЪрд▓рд╛ рджрд╛рдпрд╛рдВ рдХреЛрдирд╛ рд╣реИ)ред
protected override void OnLoad(EventArgs E) { base.OnLoad(E); GL.Enable(EnableCap.Texture2D); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); New(); } protected override void OnRenderFrame(FrameEventArgs E) {
рджрд┐рдП рдЧрдП рд░рдВрдЧ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рд░рдВрдЧ, рдмрдирд╛рд╡рдЯ рдХреЛ рдЯреЛрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рдлреЗрдж рд░рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдорд╣рд╛рди, рдмрдирд╛рд╡рдЯ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдмрджреНрдз: "рдмрдирд╛рд╡рдЯ рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рдареЛрд╕"ред
рдореБрдЦреНрдп рд╕рдбрд╝рдХ
рдЕрдм рдЖрдкрдХреЛ рдХрд╛рдВрдЪ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЦрд┐рдбрд╝рдХреА рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рд▓рд╛ рдЖрдпрдд рд╣реЛрдиреЗ рджреЗрдВ, рд▓реЗрдХрд┐рди рдмреНрд▓реЙрдХ рдХреЗ рдкреАрдЫреЗред
private void RenderPipe() { GL.Disable(EnableCap.Texture2D); GL.Color4(Color4.Black); GL.Begin(BeginMode.Quads); GL.Vertex2(0, 0); GL.Vertex2(MapWidth * SolidSize, 0); GL.Vertex2(MapWidth * SolidSize, MapHeight * SolidSize); GL.Vertex2(0, MapHeight * SolidSize); GL.End(); GL.Enable(EnableCap.Texture2D); } protected override void OnRenderFrame(FrameEventArgs E) {
рдХрд╛рдВрдЪ рдХреА рд╕реНрдерд┐рддрд┐ред рдЗрд╕реЗ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдмрд╛рдИрдВ рдУрд░ рд╣реЛрдиреЗ рджреЗрдВред рдЧреНрд▓рд╛рд╕ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдмрд╛рдж рдореЗрдВ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡ (рдЦрд╛рддрд╛, рдЖрджрд┐) рд░рдЦреЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЦрд┐рдбрд╝рдХреА рдХреЛ рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рдВрдЪ рдХреЛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХреЗрдВрджреНрд░ рдХреА рдУрд░ рджрд╛рдИрдВ рдУрд░ рдмрдврд╝рд╛рдПрдВ, рдЕрдиреНрдпрдерд╛ рджрд╛рдИрдВ рдУрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦрд╛рд▓реА рдЬрдЧрд╣ рд╣реЛрдЧреАред рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡рд┐рдВрдбреЛ рдХреЛ
NominalWidth
├Ч
NominalHeight
(рдпрд╣, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХреНрд╕ рд╡рд┐рдВрдбреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рддрд╣рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛) рд╕реЗ рдЫреЛрдЯрд╛ рдмрдирд╛рдиреЗ рдкрд░
NominalWidth
ред
private const int NominalWidth = 500; private const int NominalHeight = 500; protected override void OnResize(EventArgs E) {
рдкреНрд░рддрд┐рдмрджреНрдз: "рд╕реНрдерд┐рддрд┐ рдФрд░ рд░реЗрдВрдбрд░ рдкрд╛рдЗрдк"ред
рджреАрд╡рд╛рд░ рдкрд░ рд▓рд┐рдЦрдирд╛
рдХрд╛рдВрдЪ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЪрд╛рд░ рддрддреНрд╡: рдЕрдЧрд▓реА рдЫрдбрд╝реА; рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ (рдПрдХ рд╕рдВрджреЗрд╢ "рдмрдЬрд╛рдирд╛", "рд░реБрдХрд╛ рд╣реБрдЖ" рдпрд╛ "рдЧреЗрдо рдУрд╡рд░" рд╣реЛрдЧрд╛); рдЪрд╛рд▓реВ рдЦрд╛рддрд╛; рд░рд┐рдХреЙрд░реНрдб рд╕реНрдХреЛрд░ред
рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рда рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдУрдкрдирдЧреНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рда рдХреЛ рдХреИрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред OpenGL рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдХреНрд╕рд░ рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рдВрджрд░реНрдн рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдУрдкрдирдЯреАрдХреЗ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ
TextPrinter
рдХреНрд▓рд╛рд╕ рд╣реИред
рдпрд╣ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдХреА рдмрд╛рдд рд╣реИ рдФрд░ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдЕрдм рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдмрд┐рдЯрдореИрдк рдмрдирд╛рдУ (
System.Drawing.Graphics.DrawString
рдпрд╛ рдЕрдиреНрдп рд╕рд╛рдзрдиреЛрдВ рдХрд╛
System.Drawing.Graphics.DrawString
рдХрд░рдХреЗ) рдФрд░ рдЗрд╕реЗ рдПрдХ рдмрдирд╛рд╡рдЯ рдХреА рддрд░рд╣ рдЦреАрдВрдЪреЗрдВред
рдЪрд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛
TextRenderer
рдХреНрд▓рд╛рд╕
TextRenderer
, рдЬреЛ рдПрдХ
Bitmap
рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ
TextRenderer
рдмрдирд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдирдкреАрдУрдЯреА-рдЖрдпрд╛рдореА рдмрдирд╛рд╡рдЯ рдХреА рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдХрд┐рд╕ рдЖрдХрд╛рд░ рдХрд╛ рдорд┐рд▓реЗрдЧрд╛ред рд╡рд┐рдзрд┐ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдПрдирдкреАрдУрдЯреА рдмрдирд╛рд╡рдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЪрд┐рддреНрд░ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдкреЙрдЯ-рдЖрдХрд╛рд░ рдХреА рдмрдирд╛рд╡рдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЦреЗрддреЛрдВ рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо 300 ├Ч 200 рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ 512 ├Ч 256 рдмрдирд╛рд╡рдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдорд╛рд░рд╛ рдЪрд┐рддреНрд░ рдКрдкрд░реА рдмрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ рд╣реЛрдЧрд╛, рдФрд░ рд╢реЗрд╖ рд╕реНрдерд╛рди рдЦрд╛рд▓реА рд╣реЛрдЧрд╛ред рдФрд░ рдмрдирд╛рд╡рдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рддрд╕реНрд╡реАрд░ рдХреЗ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд╣реАрдВ рд╣реИ (1; 1), рд▓реЗрдХрд┐рди (300/512; 200/256)ред
public class Texture : IDisposable { public int GlHandle { get; protected set; } public int Width { get; protected set; } public int Height { get; protected set; } #region NPOT private static bool? CalculatedSupportForNpot; public static bool NpotIsSupported { get { if (!CalculatedSupportForNpot.HasValue) { CalculatedSupportForNpot = false; int ExtensionsCount; GL.GetInteger(GetPName.NumExtensions, out ExtensionsCount); for (var i = 0; i < ExtensionsCount; i++) { if ("GL_ARB_texture_non_power_of_two" == GL.GetString(StringName.Extensions, i)) { CalculatedSupportForNpot = true; break; } } } return CalculatedSupportForNpot.Value; } } public int PotWidth { get { return NpotIsSupported ? Width : (int)Math.Pow(2, Math.Ceiling(Math.Log(Width, 2))); } } public int PotHeight { get { return NpotIsSupported ? Height : (int)Math.Pow(2, Math.Ceiling(Math.Log(Height, 2))); } } #endregion public Texture(Bitmap Bitmap) { // . . . var BitmapData = Bitmap.LockBits(new Rectangle(0, 0, Bitmap.Width, Bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, PotWidth, PotHeight, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, BitmapData.Width, BitmapData.Height, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, BitmapData.Scan0); Bitmap.UnlockBits(BitmapData); // . . . } // . . . }
рдЕрдм -
TextRenderer
ред рдХреЛрдб рд▓рдВрдмрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЪрд╛рд░ рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ: рдкрд╛рда рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдорд╛рдкреЗрдВ, рдкрд╛рда рдХреЛ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ, рдмрдирд╛рд╡рдЯ рдХреЛ рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдЖрдпрдд рдкрд░ рдереЛрдкреЗрдВред
using System; using System.Drawing; using System.Drawing.Text; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; namespace ImpressiveSolids { class TextRenderer { private Font FontValue; private string LabelValue; private bool NeedToCalculateSize, NeedToRenderTexture; private Texture Texture; private int CalculatedWidth, CalculatedHeight; public Font Font { get { return FontValue; } set { FontValue = value; NeedToCalculateSize = true; NeedToRenderTexture = true; } } public string Label { get { return LabelValue; } set { if (value != LabelValue) { LabelValue = value; NeedToCalculateSize = true; NeedToRenderTexture = true; } } } public int Width { get { if (NeedToCalculateSize) { CalculateSize(); } return CalculatedWidth; } } public int Height { get { if (NeedToCalculateSize) { CalculateSize(); } return CalculatedHeight; } } public Color4 Color = Color4.Black; public TextRenderer(Font Font) { this.Font = Font; } public TextRenderer(Font Font, Color4 Color) { this.Font = Font; this.Color = Color; } public TextRenderer(Font Font, string Label) { this.Font = Font; this.Label = Label; } public TextRenderer(Font Font, Color4 Color, string Label) { this.Font = Font; this.Color = Color; this.Label = Label; } private void CalculateSize() { using (var Bitmap = new Bitmap(1, 1)) { using (Graphics Graphics = Graphics.FromImage(Bitmap)) { var Measures = Graphics.MeasureString(Label, Font); CalculatedWidth = (int)Math.Ceiling(Measures.Width); CalculatedHeight = (int)Math.Ceiling(Measures.Height); } } NeedToCalculateSize = false; } public void Render() { if ((null == Label) || ("" == Label)) { return; } if (NeedToRenderTexture) { using (var Bitmap = new Bitmap(Width, Height)) { var Rectangle = new Rectangle(0, 0, Bitmap.Width, Bitmap.Height); using (Graphics Graphics = Graphics.FromImage(Bitmap)) { Graphics.Clear(System.Drawing.Color.Transparent); Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; Graphics.DrawString(Label, Font, Brushes.White, Rectangle); if (null != Texture) { Texture.Dispose(); } Texture = new Texture(Bitmap); } } NeedToRenderTexture = false; } Texture.Bind(); GL.Color4(Color); GL.Begin(BeginMode.Quads); GL.TexCoord2(0, 0); GL.Vertex2(0, 0); GL.TexCoord2((float)Texture.Width / Texture.PotWidth, 0); GL.Vertex2(Width, 0); GL.TexCoord2((float)Texture.Width / Texture.PotWidth, (float)Texture.Height / Texture.PotHeight); GL.Vertex2(Width, Height); GL.TexCoord2(0, (float)Texture.Height / Texture.PotHeight); GL.Vertex2(0, Height); GL.End(); } } }
рд╣рдо рдХрд╛рдВрдЪ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдХреБрдЫ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред
using System.Drawing.Text;
MapHeight * SolidSize / 4f
рдХрд╛рдВрдЪ рдХреА рдКрдВрдЪрд╛рдИ рдХрд╛ рдПрдХ рдЪреМрдерд╛рдИ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдЪрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреВрд░реА рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рдЪрдврд╝рдирд╛ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВред
рдкреНрд░рддрд┐рдмрджреНрдз: "рдкрд╛рда рдЬреАрдпреВрдЖрдИ"ред
рдЕрдЧрд▓рд╛
рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдЯрд┐рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореЙрдбрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдЧрд▓реА рдЫрдбрд╝реА рд╣реИ рдЬреЛ рдЕрдЧрд▓реЗ рдХрджрдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдЪрд╛рд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрддреНрдкрдиреНрди рд╣реЛ рдФрд░ рдХрд╣реАрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛред
private int[] NextStickColors; private void GenerateNextStick() { for (var i = 0; i < StickLength; i++) { StickColors[i] = NextStickColors[i]; NextStickColors[i] = Rand.Next(ColorsCount); } StickPosition.X = (float)Math.Floor((MapWidth - StickLength) / 2d); StickPosition.Y = 0; } private void New() {
рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
RenderSolid
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
protected override void OnRenderFrame(FrameEventArgs E) {
рдХрд┐рдпрд╛, рдкреНрд░рддрд┐рдмрджреНрдз: "рдЕрдЧрд▓реА рдЫрдбрд╝реА рдЫрдбрд╝реА"ред
рд╕реНрдХреЛрд░
рд╕реНрдХреЛрд░рд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдирд╛рд╢ рдХреЗ рд▓рд┐рдП, рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдПрдХ рд╕рд╛рде рд╡рд┐рдирд╛рд╢ рдХреЗ рд▓рд┐рдП, рд▓рдВрдмреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдВрдХ рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ, рдЦреЗрд▓ рдореЗрдВ рд░реБрдЪрд┐ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦреЗрдЧрд╛ред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдлрд╝рд╛рд░реНрдореБрд▓реЛрдВ рдХреЛ рдСрдлрд╝рд╣реИрдВрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЙрдиреНрд╣реЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреАрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред
private int TotalDestroyedThisMove; private void New() {
рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рдо рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ (рдпрджрд┐ рдпрд╣ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦреЗрдВ, рдФрд░ рдЬрдм рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╡рд░реНрддрдорд╛рди рд░рд┐рдХреЙрд░реНрдб рдкрдврд╝реЗрдВред
using System.IO;
рдкреНрд░рддрд┐рдмрджреНрдз: "рд╕реНрдХреЛрд░ рдХреА рдЧрдгрдирд╛, рдЙрдЪреНрдЪ рд╕реНрдХреЛрд░ рдХрд╛ рднрдВрдбрд╛рд░рдгред"
рд╕реНрд╡рд░реНрдЧ рдард╣рд░ рд╕рдХрддрд╛ рд╣реИ
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЦреЗрд▓ рдХреЛ рд░реЛрдХрдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдВрдЧреЗред
рдЖрдк рдПрдХ рд░рд╛рдЬреНрдп (
GameStateEnum
) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд░рд╛рдо рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реНрдЯрд┐рдХ рдХреЗ рдЧрд┐рд░рдиреЗ (
Fall
) рдХреЗ рджреМрд░рд╛рди рдФрд░
Impact
рджреМрд░рд╛рди рджреЛрдиреЛрдВ рдЦреЗрд▓ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд░рд╛рдо рд╕реЗ рдЦреЗрд▓ рдХреЛ рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рд▓рд┐рдП, рд╣рдо
OnUpdateFrame
,
OnKeyDown
,
OnKeyDown
рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд
OnUpdateFrame
рдзреНрд╡рдЬ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред
private bool Paused; private TextRenderer PauseLabel, UnpauseHint, PlayingGameLabel, PauseHint; public Game()
рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдПрдХ рдирдпрд╛ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП) рдЬрдм рдЗрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдПрдХ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдард╣рд░рд╛рд╡ рдХреБрдВрдЬреА, рдХреНрдпреЛрдВрдХрд┐ рдард╣рд░рд╛рд╡ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдВрддрд░рд┐рдХреНрд╖ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрддрд╛ рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреБрдВрдЯреЛ рд╕реНрд╡рд┐рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред
рдкреНрд░рддрд┐рдмрджреНрдз: "рд░реЛрдХреЗрдВ"ред
рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдирд┐рд╕реНрд╕рдВрджреЗрд╣, рдЦреЗрд▓ рдореЗрдВ рдЖрдк рдЕрднреА рднреА рдХрдИ рдЫреЛрдЯреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреАрдбрд╝реЗ рдкреЙрдк рдЕрдк рд╣реЛрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдореИрдВ рд╕реНрд╡рддрдВрддреНрд░ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдкрд╛рдардХ рдкрд░ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ
Google рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ Bitbucket , рд╡рд╣рд╛рдВ рдЖрдк рдЕрдВрддрд┐рдо рд╕реНрд░реЛрдд рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред