рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди 7 XNA: рдкрд┐рдХреНрд╕ рдХреЛ рдореЛрдбрд╝реЗрдВ рдпрд╛ рди рд╣рд┐рд▓рд╛рдПрдВ

рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдорд┐рддреНрд░ред

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





рд╕рд┐рджреНрдзрд╛рдВрдд



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

рдмреЗрд╢рдХ, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдореИрдкрд┐рдВрдЧ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рд╡рд┐рдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рд╢рд╛рдВрдд рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдмреЗрд╕рд┐рдХрдлреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдкрд┐рдХреНрд╕рд▓ рдХреЛ рдХреИрд╕реЗ рдЭреБрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдзрд┐ рдкрд╛рдЧрд▓рдкрди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдмреЗрд╣рдж рдкреНрд░рднрд╛рд╡реА рд╣реИред

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

- рдХреНрдпрд╛ рдХрд░реЗрдВ, рд▓рдбрд╝рдХрд╛?

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдПрдХ рддрд╕реНрд╡реАрд░ рд╣реИ - 480x800, рд╣рдо рдПрдХ 48x80 рдЧреНрд░рд┐рдб рдмрдирд╛рддреЗ рд╣реИрдВ (рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдПрдХ рд╕реБрдВрджрд░ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП - рдмрд╕ рд╕рд╣реА рд╣реИ)ред рдЧреНрд░рд┐рдб 3840 рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдЖрдпрд╛рдореА рдЖрдпрд╛рдо рд╣реИред рдпрд╣ рд╕рднреА WP7 рдкрд░ 3-4 рдПрдордПрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдХрдо рдореЗрд╖ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╕рд╛рде - 1-2 рдПрдордПрд╕ ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЧреНрд░рд┐рдб рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рд╡рд┐рд░реВрдкрдг рдХреЗ рд╕рд╛рде рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ рдХрд┐ рддреНрд░рд┐рдХреЛрдг рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдЧреНрд░рд┐рдб 10 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП - рд╕реНрдХреНрд░реАрди рдкрд░ рдХрджрдо 3 рдорд┐рдореА = 10 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИред рдЦреИрд░, рдареАрдХ рд╣реИ, рдХреБрдЫ рдореИрдВ рдПрдХ рдмрд╛рддрдЪреАрдд рдореЗрдВ рдорд┐рд▓рд╛ред

- рдЕрд░реЗ рдпрд╛рд░, рдпрд╣реА рдХрд╛рдлреА рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ, рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдЬрд╛рдУред

рдЕрднреНрдпрд╛рд╕



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

рд╕рдбрд╝рдХ рдкрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╕рд╛рдордЧреНрд░реА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВред

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


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

рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ WP7 рдХреЗ рддрд╣рдд XNA рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 30 рдПрдлрдкреАрдПрд╕ (рджреЗрд╢реА 60 рдкреАрдкреАрдПрд╕ рдХреЗ рдмрдЬрд╛рдп) рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреБрдЫ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕рдВрднрд╡ рд╣реИ; рджреВрд╕рд░реА рдУрд░, рдЬреЛ рд╣рддреНрдпрд╛рд░реЗ рдХреА рдмреИрдЯрд░реА рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдПрдХ рд╕рдордп рд╣рддреНрдпрд╛рд░рд╛ рдирд╣реАрдВ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рд╣рдо 30 рдПрдлрдкреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдк рдкрд╛рдПрдВрдЧреЗ:

// Frame rate is 30 fps by default for Windows Phone. TargetElapsedTime = TimeSpan.FromTicks(333333); // Extend battery life under lock. InactiveSleepTime = TimeSpan.FromSeconds(1); 


рдПрдлрдкреАрдПрд╕ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд▓рд╛рдЗрди - рдЕрдкрдиреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдВред

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

 if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); 


рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЫреВрдПрдВрдЧреЗ, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрднреНрдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рдЕрд░реНрде рдФрд░ рдкреНрдпрд╛рд░ рдХреЗ рд╕рд╛рде Game1 рднрд░реЗрдВред

рдЪрд░ рдмрдирд╛рдПрдВ:

 Texture2D background; BasicEffect basicEffect; 


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

рд╣рдо рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ:

 background = Content.Load<Texture2D>("distortion"); 


рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛, рдЗрд╕реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛:

 graphics.PreferredBackBufferWidth = 480; graphics.PreferredBackBufferHeight = 800; graphics.IsFullScreen = true; 


рддрд╛рдХрд┐ рд╡рд╣рд╛рдБ рдПрдХ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдерд╛ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред

рдмреЗрд╕рд┐рдХрд▓реАрдлреЗрдХреНрдЯ (рдЖрд░рдВрдн рдореЗрдВ) :

 basicEffect = new BasicEffect(GraphicsDevice); basicEffect.TextureEnabled = true; //      basicEffect.Projection = Matrix.CreateOrthographicOffCenter(0, 480, 800, 0, 0f, 10f); basicEffect.View = Matrix.Identity; basicEffect.World = Matrix.Identity; 


рдкреНрд░реЛрдЬреЗрдХреНрд╢рди - рдПрдХ рджреЛ рдЖрдпрд╛рдореА рд╡рд┐рдорд╛рди (рд╕реНрдХреНрд░реАрди) рдкрд░ рддреАрди рдЖрдпрд╛рдореА рд╡рд╕реНрддреБ рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рдХреНрд╖реЗрдкрдгред
рджреГрд╢реНрдп - рдПрдХ рджреГрд╢реНрдп рдХрд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕, рдПрдХ рдХреИрдорд░рд╛, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВред
рд╡рд┐рд╢реНрд╡ - рд╡рд┐рд╢реНрд╡ рдореИрдЯреНрд░рд┐рдХреНрд╕: рд░реЛрдЯреЗрд╢рди, рдЖрдХрд╛рд░, рд╕реНрдерд┐рддрд┐ред

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

рддреЛ, рдЕрдм рдХреЗ рд▓рд┐рдП, Game1 рдХреЗ рд╕рд╛рде, рдЪрд▓реЛ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ GridVertexPositionColorTexture , рдФрд░ рдпрд╣рд╛рдБ рдЗрд╕рдХреА рдкреВрд░реНрдг рд╕реВрдЪреА рд╣реИ (рдореИрдВ рдкреВрд░реНрдг рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдпрд╣ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ):

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework; namespace GridDistortion { public class GridVertexPositionColorTexture { public VertexPositionColorTexture[] Vertices; //   ,      ,    UV   public short[] Indices; // ,       ,   3D ,   ,    public int Width; //    X public int Height; //    Y public Vector2 CellSize; //       X  Y  public void BuildGeometry(int colums, int rows, Vector2 cellSize) //     { Width = colums; Height = rows; CellSize = cellSize; Vertices = new VertexPositionColorTexture[(Width + 1) * (Height + 1)]; //    Indices = new short[Width * Height * 6]; //      /*    */ for (int i = 0; i < Width + 1; i++) { for (int j = 0; j < Height + 1; j++) { int index = j * (Width + 1) + i; VertexPositionColorTexture vertex = new VertexPositionColorTexture() { Position = new Vector3(new Vector2(i, j) * CellSize, 0f), //   Color = Color.White, TextureCoordinate = GetDefaultUV(index) //   }; Vertices[index] = vertex; } } /*    */ int indexPos = 0; for (int i = 0; i < Width; i++) { for (int j = 0; j < Height; j++) { int v0 = j * (Width + 1) + i; int v1 = j * (Width + 1) + i + 1; int v2 = (j + 1) * (Width + 1) + i; int v3 = (j + 1) * (Width + 1) + i + 1; Indices[indexPos] = (short)v0; Indices[indexPos + 1] = (short)v1; Indices[indexPos + 2] = (short)v2; Indices[indexPos + 3] = (short)v2; Indices[indexPos + 4] = (short)v1; Indices[indexPos + 5] = (short)v3; indexPos += 6; } } } public void Draw(GraphicsDevice graphicsDevice) //     VertexPositionColorTexture { graphicsDevice.DrawUserIndexedPrimitives<VertexPositionColorTexture>(PrimitiveType.TriangleList, Vertices, 0, Vertices.Length, Indices, 0, Indices.Length / 3); } public void ResetUVs() //  UV  { for (int i = 0; i < Vertices.Length; i++) { VertexPositionColorTexture v = Vertices[i]; v.TextureCoordinate = GetDefaultUV(i); Vertices[i] = v; } } public Vector2 GetUV0(int index) //    { return Vertices[index].TextureCoordinate; } public void SetUV0(int index, Vector2 value) //    { Vertices[index].TextureCoordinate = value; } public Vector2 GetDefaultUV(int index) //       { int i = index % (Width + 1); int j = index / (Width + 1); return new Vector2((float)i / Width, (float)j / Height); } } } 


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЧреНрд░рд┐рдб рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред
рджреВрд╕рд░рд╛ рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рдХреЛ рдЬреЗрд▓реА рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдиреЗ рддрдХ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХрд░реЗрдЧрд╛ред

рд╣рдо рдкрд╣рд▓рд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдПрдХ рдирдпрд╛ рд╕рд┐рдореНрдкрд▓рдЧреНрд░рд┐рдб рдХреНрд▓рд╛рд╕ рдФрд░ рдЙрд╕рдХреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдмрдирд╛рдПрдБрдЧреЗ :

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; namespace GridDistortion { public class SimpleGrid { publicGridVertexPositionColorTexture grid; //    public SimpleGrid(GridVertexPositionColorTexture grid) { this.grid = grid; } public void Update() { swap(); } public virutal void swap() //       { grid.ResetUVs(); } public void Rebellion(Vector2 pos_rebellion, float radius) //         { Vector2 gridSize = new Vector2(grid.Width, grid.Height) * grid.CellSize; //    for (int i = 0; i < grid.Vertices.Length; i++) { Vector2 pos = grid.GetUV0(i) * gridSize; //       Vector2 newPos = pos; Vector2 center = pos_rebellion; //    float distance = Distance(pos, center); //         if (distance < radius) //    ,    ,   { Vector2 dir = pos - center; //    float length = dir.Length(); float minDisplacement = -length; if (dir.Length() != 0) { dir.Normalize(); //   } Vector2 displacement = dir * Math.Max(-100f, minDisplacement); //   ,  -100f тАФ  ,   тАФ   ,   newPos += displacement * (1f - distance / radius) * 0.25f; grid.SetUV0(i, newPos / gridSize); //    } } } public static float Distance(Vector2 vector1, Vector2 vector2) { double value = ((vector2.X - vector1.X) * (vector2.X - vector1.X)) + ((vector2.Y - vector1.Y) * (vector2.Y - vector1.Y)); return (float)Math.Sqrt(value); } } } 


рдирд┐рдпрдВрддреНрд░рдХ рд▓рд┐рдЦрд╛ рд╣реИ, рдЕрдм Game1 рдкрд░ рд╡рд╛рдкрд╕, рджреЛ рдирдП рдЪрд░:

 GridVertexPositionColorTexture grid; SimpleGrid simpleGrid; 


рдЙрдирдХрд╛ рдкреНрд░рд╛рд░рдВрдн:

 grid = new GridVertexPositionColorTexture(); grid.BuildGeometry(48, 80, new Vector2(10, 10)); simpleGrid = new SimpleGrid(grid); 


рдЦреБрдж рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ :

 simpleGrid.Update(); //    TouchCollection collection = TouchPanel.GetState(); //    foreach (TouchLocation point in collection) { if (point.State == TouchLocationState.Moved) { simpleGrid.Rebellion(point.Position, 100f); //     point.Position   100f } } 


рдФрд░ рдЕрдВрдд рдореЗрдВ, рдбреНрд░рд╛рдЗрдВрдЧ:

 GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp; //  Clamp, ..  Wrap-    Reach ,      basicEffect.Texture = background; //     basicEffect.CurrentTechnique.Passes[0].Apply(); //  basicEffect grid.Draw(GraphicsDevice); //   


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

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; namespace GridDistortion { public class ElasticGrid : SimpleGrid { private Vector2[] Velocity; //   public ElasticGrid(GridVertexPositionColorTexture grid) : base(grid) { this.Velocity = new Vector2[(grid.Width + 1) * (grid.Height + 1)]; } public override void swap() { Vector2 gridSize = new Vector2(grid.Width, grid.Height) * grid.CellSize; for (int i = 0; i < grid.Vertices.Length; i++) { //Get the position in pixels Vector2 pos = grid.GetUV0(i) * gridSize; Vector2 pos_default = grid.GetDefaultUV(i) * gridSize; Vector2 dir = (pos_default - pos) / 1.1f; //          1.1f, //Set the new Texture Coordinates grid.SetUV0(i, (pos + Velocity[i]) / gridSize); //   +   Velocity[i] = dir; //     } } } } 


Game1 рдореЗрдВ рдЧреНрд░рд┐рдб рдирд┐рдпрдВрддреНрд░рдХ рдмрджрд▓реЗрдВ рдФрд░ рд╡рд┐рдХреГрддрд┐рдпреЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред

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

рдПрдХ рдмрд╛рд░ рдореИрдВ рдЖрдкрдХреЗ рдЦреЗрд▓ рдореЗрдВ рд╕реБрдВрджрд░рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред
рдпрд╣ рднреА XNA рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ 3 рдбреА рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред
рдЦреИрд░, рдФрд░ рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рд╕рдВрднрд╡рдд: рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк WP7 рдкрд░ рдЧреЗрдо рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рд░рдЦреЗрдВ, рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЧрд░реАрдмреА рдореЗрдВ рдмреИрдареЗрдВред

рд╕реВрддреНрд░реЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдкреНрд░рдпреЛрдЧ, рд╕реГрдЬрди; рдЬрд▓реНрдж рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ :-)

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


All Articles