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

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

рдпрд╣ рдЪрд┐рддреНрд░


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

рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВред 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; // . . . private Texture TextureBackground; private Texture[] ColorTextures = new Texture[ColorsCount]; public Game() : base(NominalWidth, NominalHeight, GraphicsMode.Default, "Impressive Solids") { VSync = VSyncMode.On; Keyboard.KeyDown += new EventHandler<KeyboardKeyEventArgs>(OnKeyDown); TextureBackground = new Texture(new Bitmap("textures/background.png")); for (var i = 0; i < ColorsCount; i++) { ColorTextures[i] = new Texture(new Bitmap("textures/solids/" + i + ".png")); } } 


рд░реЗрдВрдбрд░рд┐рдВрдЧ рдмрджрд▓реЗрдВред рдмрдирд╛рд╡рдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╕рд╛рде рд╣реА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдореЛрдб рднреАред рдлрд┐рд░, рдЖрдпрдд рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдмрдирд╛рд╡рдЯ рдХрд╛ рдЪрдпрди (рдмрд╛рдЗрдВрдб) рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ (рд╡рд░реНрдЯреЗрдХреНрд╕) рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ (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) { // . . . GL.LoadMatrix(ref Modelview); RenderBackground(); 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]); } } SwapBuffers(); } private void RenderBackground() { TextureBackground.Bind(); GL.Color4(Color4.White); GL.Begin(BeginMode.Quads); GL.TexCoord2(0, 0); GL.Vertex2(0, 0); GL.TexCoord2((float)ClientRectangle.Width / TextureBackground.Width, 0); GL.Vertex2(ProjectionWidth, 0); GL.TexCoord2((float)ClientRectangle.Width / TextureBackground.Width, (float)ClientRectangle.Height / TextureBackground.Height); GL.Vertex2(ProjectionWidth, ProjectionHeight); GL.TexCoord2(0, (float)ClientRectangle.Height / TextureBackground.Height); GL.Vertex2(0, ProjectionHeight); GL.End(); } private void RenderSolid(float X, float Y, int Color) { ColorTextures[Color].Bind(); GL.Color4(Color4.White); GL.Begin(BeginMode.Quads); GL.TexCoord2(0, 0); GL.Vertex2(X * SolidSize, Y * SolidSize); GL.TexCoord2(1, 0); GL.Vertex2((X + 1) * SolidSize, Y * SolidSize); GL.TexCoord2(1, 1); GL.Vertex2((X + 1) * SolidSize, (Y + 1) * SolidSize); GL.TexCoord2(0, 1); GL.Vertex2(X * SolidSize, (Y + 1) * SolidSize); GL.End(); } 


рджрд┐рдП рдЧрдП рд░рдВрдЧ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рд░рдВрдЧ, рдмрдирд╛рд╡рдЯ рдХреЛ рдЯреЛрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рдлреЗрдж рд░рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдорд╣рд╛рди, рдмрдирд╛рд╡рдЯ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдмрджреНрдз: "рдмрдирд╛рд╡рдЯ рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ рдареЛрд╕"ред

рдореБрдЦреНрдп рд╕рдбрд╝рдХ


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

 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) { // . . . RenderBackground(); RenderPipe(); // . . . } 


рдХрд╛рдВрдЪ рдХреА рд╕реНрдерд┐рддрд┐ред рдЗрд╕реЗ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдмрд╛рдИрдВ рдУрд░ рд╣реЛрдиреЗ рджреЗрдВред рдЧреНрд▓рд╛рд╕ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдмрд╛рдж рдореЗрдВ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡ (рдЦрд╛рддрд╛, рдЖрджрд┐) рд░рдЦреЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдЦрд┐рдбрд╝рдХреА рдХреЛ рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рдВрдЪ рдХреЛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХреЗрдВрджреНрд░ рдХреА рдУрд░ рджрд╛рдИрдВ рдУрд░ рдмрдврд╝рд╛рдПрдВ, рдЕрдиреНрдпрдерд╛ рджрд╛рдИрдВ рдУрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦрд╛рд▓реА рдЬрдЧрд╣ рд╣реЛрдЧреАред рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡рд┐рдВрдбреЛ рдХреЛ NominalWidth ├Ч NominalHeight (рдпрд╣, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХреНрд╕ рд╡рд┐рдВрдбреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рддрд╣рдд рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛) рд╕реЗ рдЫреЛрдЯрд╛ рдмрдирд╛рдиреЗ рдкрд░ NominalWidth ред

 private const int NominalWidth = 500; private const int NominalHeight = 500; protected override void OnResize(EventArgs E) { // . . . if (ClientSize.Width < NominalWidth) { ClientSize = new Size(NominalWidth, ClientSize.Height); } if (ClientSize.Height < NominalHeight) { ClientSize = new Size(ClientSize.Width, NominalHeight); } } protected override void OnRenderFrame(FrameEventArgs E) { // . . . RenderBackground(); var PipeMarginY = (ProjectionHeight - MapHeight * SolidSize) / 2f; var PipeMarginX = (NominalHeight - MapHeight * SolidSize) / 2f; var Overwidth = ProjectionWidth - ProjectionHeight * (float)NominalWidth / NominalHeight; if (Overwidth > 0) { GL.Translate(Math.Min(Overwidth, (ProjectionWidth - MapWidth * SolidSize) / 2f), PipeMarginY, 0); } else { GL.Translate(PipeMarginX, PipeMarginY, 0); } RenderPipe(); // . . . } 


рдкреНрд░рддрд┐рдмрджреНрдз: "рд╕реНрдерд┐рддрд┐ рдФрд░ рд░реЗрдВрдбрд░ рдкрд╛рдЗрдк"ред

рджреАрд╡рд╛рд░ рдкрд░ рд▓рд┐рдЦрдирд╛


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

рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рда рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдУрдкрдирдЧреНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рда рдХреЛ рдХреИрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред 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; // . . . private int Score; private int HighScore; private TextRenderer NextStickLabel, ScoreLabel, ScoreRenderer, HighScoreLabel, HighScoreRenderer, GameOverLabel, GameOverHint; public Game() // . . . var LabelFont = new Font(new FontFamily(GenericFontFamilies.SansSerif), 20, GraphicsUnit.Pixel); var LabelColor = Color4.SteelBlue; NextStickLabel = new TextRenderer(LabelFont, LabelColor, "Next"); ScoreLabel = new TextRenderer(LabelFont, LabelColor, "Score"); HighScoreLabel = new TextRenderer(LabelFont, LabelColor, "High score"); var ScoreFont = new Font(new FontFamily(GenericFontFamilies.SansSerif), 50, GraphicsUnit.Pixel); var ScoreColor = Color4.Tomato; ScoreRenderer = new TextRenderer(ScoreFont, ScoreColor); HighScoreRenderer = new TextRenderer(ScoreFont, ScoreColor); var GameStateFont = new Font(new FontFamily(GenericFontFamilies.SansSerif), 30, GraphicsUnit.Pixel); var GameStateColor = Color4.Tomato; GameOverLabel = new TextRenderer(GameStateFont, GameStateColor, "Game over"); var GameStateHintFont = new Font(new FontFamily(GenericFontFamilies.SansSerif), 25, GraphicsUnit.Pixel); var GameStateHintColor = Color4.SteelBlue; GameOverHint = new TextRenderer(GameStateHintFont, GameStateHintColor, "Press Enter"); } protected override void OnRenderFrame(FrameEventArgs E) { // . . . GL.Translate(MapWidth * SolidSize + PipeMarginX, 0, 0); NextStickLabel.Render(); // TODO   next stick GL.Translate(0, MapHeight * SolidSize / 4f, 0); if (GameStateEnum.GameOver == GameState) { GameOverLabel.Render(); GL.Translate(0, GameOverLabel.Height, 0); GameOverHint.Render(); GL.Translate(0, -GameOverLabel.Height, 0); } GL.Translate(0, MapHeight * SolidSize / 4f, 0); ScoreLabel.Render(); GL.Translate(0, ScoreLabel.Height, 0); ScoreRenderer.Label = Score.ToString(); ScoreRenderer.Render(); GL.Translate(0, -ScoreLabel.Height, 0); GL.Translate(0, MapHeight * SolidSize / 4f, 0); HighScoreLabel.Render(); GL.Translate(0, HighScoreLabel.Height, 0); HighScoreRenderer.Label = HighScore.ToString(); HighScoreRenderer.Render(); SwapBuffers(); } 


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() { // . . . StickColors = new int[StickLength]; NextStickColors = new int[StickLength]; GenerateNextStick(); GenerateNextStick(); // because 1st call makes current stick all zeros GameState = GameStateEnum.Fall; } 


рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо RenderSolid рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

 protected override void OnRenderFrame(FrameEventArgs E) { // . . . NextStickLabel.Render(); GL.Translate(0, NextStickLabel.Height, 0); RenderNextStick(); GL.Translate(0, -NextStickLabel.Height, 0); // . . . } public void RenderNextStick() { GL.Disable(EnableCap.Texture2D); GL.Color4(Color4.Black); GL.Begin(BeginMode.Quads); GL.Vertex2(0, 0); GL.Vertex2(StickLength * SolidSize, 0); GL.Vertex2(StickLength * SolidSize, SolidSize); GL.Vertex2(0, SolidSize); GL.End(); GL.Enable(EnableCap.Texture2D); for (var i = 0; i < StickLength; i++) { RenderSolid(i, 0, NextStickColors[i]); } } 


рдХрд┐рдпрд╛, рдкреНрд░рддрд┐рдмрджреНрдз: "рдЕрдЧрд▓реА рдЫрдбрд╝реА рдЫрдбрд╝реА"ред

рд╕реНрдХреЛрд░


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

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

 private int TotalDestroyedThisMove; private void New() { // . . . Score = 0; TotalDestroyedThisMove = 0; } protected override void OnUpdateFrame(FrameEventArgs E) { // . . . if (Destroyables.Count > 0) { foreach (var Coords in Destroyables) { Map[(int)Coords.X, (int)Coords.Y] = -1; } Score += (int)Math.Ceiling(Destroyables.Count + Math.Pow(1.5, Destroyables.Count - 3) - 1) + TotalDestroyedThisMove; TotalDestroyedThisMove += Destroyables.Count; Stabilized = false; } // . . . GenerateNextStick(); TotalDestroyedThisMove = 0; GameState = GameStateEnum.Fall; // . . . } 


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

 using System.IO; // . . . private string HighScoreFilename; public Game() { // . . . var ConfigDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + Path.DirectorySeparatorChar + "ImpressiveSolids"; if (!Directory.Exists(ConfigDirectory)) { Directory.CreateDirectory(ConfigDirectory); } HighScoreFilename = ConfigDirectory + Path.DirectorySeparatorChar + "HighScore.dat"; if (File.Exists(HighScoreFilename)) { using (var Stream = new FileStream(HighScoreFilename, FileMode.Open)) { using (var Reader = new BinaryReader(Stream)) { try { HighScore = Reader.ReadInt32(); } catch (IOException) { HighScore = 0; } } } } else { HighScore = 0; } } protected override void OnUpdateFrame(FrameEventArgs E) { // . . . if (GameOver) { GameState = GameStateEnum.GameOver; if (Score > HighScore) { HighScore = Score; using (var Stream = new FileStream(HighScoreFilename, FileMode.Create)) { using (var Writer = new BinaryWriter(Stream)) { Writer.Write(HighScore); } } } } else { // . . . } 


рдкреНрд░рддрд┐рдмрджреНрдз: "рд╕реНрдХреЛрд░ рдХреА рдЧрдгрдирд╛, рдЙрдЪреНрдЪ рд╕реНрдХреЛрд░ рдХрд╛ рднрдВрдбрд╛рд░рдгред"

рд╕реНрд╡рд░реНрдЧ рдард╣рд░ рд╕рдХрддрд╛ рд╣реИ


рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЦреЗрд▓ рдХреЛ рд░реЛрдХрдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдВрдЧреЗред

рдЖрдк рдПрдХ рд░рд╛рдЬреНрдп ( GameStateEnum ) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд░рд╛рдо рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реНрдЯрд┐рдХ рдХреЗ рдЧрд┐рд░рдиреЗ ( Fall ) рдХреЗ рджреМрд░рд╛рди рдФрд░ Impact рджреМрд░рд╛рди рджреЛрдиреЛрдВ рдЦреЗрд▓ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд░рд╛рдо рд╕реЗ рдЦреЗрд▓ рдХреЛ рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рд╣рдо OnUpdateFrame , OnKeyDown , OnKeyDown рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд OnUpdateFrame рдзреНрд╡рдЬ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред

 private bool Paused; private TextRenderer PauseLabel, UnpauseHint, PlayingGameLabel, PauseHint; public Game() // . . . var GameStateFont = new Font(new FontFamily(GenericFontFamilies.SansSerif), 30, GraphicsUnit.Pixel); var GameStateColor = Color4.Tomato; GameOverLabel = new TextRenderer(GameStateFont, GameStateColor, "Game over"); PauseLabel = new TextRenderer(GameStateFont, GameStateColor, "Pause"); PlayingGameLabel = new TextRenderer(GameStateFont, GameStateColor, "Playing"); var GameStateHintFont = new Font(new FontFamily(GenericFontFamilies.SansSerif), 25, GraphicsUnit.Pixel); var GameStateHintColor = Color4.SteelBlue; GameOverHint = new TextRenderer(GameStateHintFont, GameStateHintColor, "Press Enter"); UnpauseHint = new TextRenderer(GameStateHintFont, GameStateHintColor, "Press Space"); PauseHint = new TextRenderer(GameStateHintFont, GameStateHintColor, "Space pauses"); } protected override void OnLoad(EventArgs E) { base.OnLoad(E); GL.Enable(EnableCap.Texture2D); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); New(); Paused = true; } protected override void OnUpdateFrame(FrameEventArgs E) { base.OnUpdateFrame(E); if (Paused) { return; } // . . . } protected void OnKeyDown(object Sender, KeyboardKeyEventArgs E) { if ((GameStateEnum.Fall == GameState) && !Paused) { // . . . } if (((GameStateEnum.Fall == GameState) || (GameStateEnum.Impact == GameState)) && (Key.Space == E.Key)) { Paused = !Paused; } } protected override void OnRenderFrame(FrameEventArgs E) { // . . . GL.Translate(0, MapHeight * SolidSize / 4f, 0); if (GameStateEnum.GameOver == GameState) { GameOverLabel.Render(); GL.Translate(0, GameOverLabel.Height, 0); GameOverHint.Render(); GL.Translate(0, -GameOverLabel.Height, 0); } else if (Paused) { PauseLabel.Render(); GL.Translate(0, PauseLabel.Height, 0); UnpauseHint.Render(); GL.Translate(0, -PauseLabel.Height, 0); } else { PlayingGameLabel.Render(); GL.Translate(0, PlayingGameLabel.Height, 0); PauseHint.Render(); GL.Translate(0, -PlayingGameLabel.Height, 0); } // . . . } 


рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдПрдХ рдирдпрд╛ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд▓рд┐рдП) рдЬрдм рдЗрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдкреНрд░рддрд┐рдмрджреНрдз: "рд░реЛрдХреЗрдВ"ред

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

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

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


All Articles