XNA рдХрд╛ рдкрд░рд┐рдЪрдп рдФрд░ рдкрд╣рд▓рд╛ рд╕рдВрдЧреАрдд рдЧреЗрдо рд▓рд┐рдЦрдирд╛

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


рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг

Microsoft XNA (рдЕрдВрдЧреНрд░реЗрдЬрд╝реА XNA's Noteded ) - Microsoft рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд░рдирдЯрд╛рдЗрдо (.NET) рдХреЗ рд╕рд╛рде рдЯреВрд▓ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреЗрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкреНрд░рдмрдВрдзрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред XNA "рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП" рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЦреЗрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА?

1) рдлреНрд░реЗрд╢ рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ ( рдЙрджрд╛ред рдЬреВрди 2010 )
2) рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╡рд┐рдЬреБрдЕрд▓ рд╕реА # 2010 рдПрдХреНрд╕рдкреНрд░реЗрд╕ ( рдореБрдлреНрдд рд▓рд╛рдЗрд╕реЗрдВрд╕ )
3) Microsoft XNA рдЧреЗрдо рд╕реНрдЯреВрдбрд┐рдпреЛ 4.0

рдЗрд╕ рдкрд╛рда рдореЗрдВ рдЕрд▓рдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдФрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ?



рд╣рдо рдХрд┐рд╕ рдЦреЗрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ?

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

рдЦрд╛рд▓реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЛ рдХреНрд░рдо рдореЗрдВ рд░рдЦреЗрдВ, рдлрд┐рд░ Microsoft Visual C # 2010 EXPRESS рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдПрдХ Windows рдЧреЗрдо (4.0) рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ music_catch рдХрд╣реЗрдВ:

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


Music_catch рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ "рд▓реЙрдЬрд┐рдХ" рд╣реИред
Game1.cs - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ, рдпрд╣ Microsoft.Xna.Framework.Game рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ
Program.cs рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред
Music_catchContent рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА "рд╕рд╛рдордЧреНрд░реА" рд╣реИ, рд╣рдо рд╡рд╣рд╛рдВ рд╕рдВрд╕рд╛рдзрди рдбрд╛рд▓реЗрдВрдЧреЗ ред

Game1.cs рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ
рдЗрд╕рдореЗрдВ, рдЖрдк рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
рдЧреЗрдо 1 () рдХреНрд▓рд╛рд╕ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ () - рдЖрд╡реЗрджрди рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдгред
рд▓реЛрдбрдХрдВрдЯреЗрдВрдЯ () - рд▓реЛрдбрд┐рдВрдЧ рд╕рд╛рдордЧреНрд░реАред
рдЕрдирд▓реЛрдб () - рд╕рд╛рдордЧреНрд░реА рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ ред
рдЕрдкрдбреЗрдЯ (рдЧреЗрдордЯрд╛рдЗрдо рдЧреЗрдордЯрд╛рдЗрдо) - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ (рдЬреИрд╕реЗ рднреМрддрд┐рдХреА, рдЖрджрд┐) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ
рдбреНрд░рд╛ (рдЧреЗрдордЯрд╛рдЗрдо рдЧреЗрдордЯрд╛рдЗрдо) - рдЧреЗрдо рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрдиред рдзреНрдпрд╛рди рджреЗрдВ, рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди рдХреЛ рдпрд╣рд╛рдВ рдФрд░ рдХреЗрд╡рд▓ рдпрд╣рд╛рдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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



рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣рдо рдПрдХ рдлреЙрдиреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╕реНрдкреНрд░рд╛рдЗрдЯрдлреЛрдВрдЯ 1. рдПрд╕рдкреНрд░рд┐рдЯрдлреЛрдВрдЯ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╣рдо рдирд╛рдо рдФрд░ рдЖрдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
<FontName>Segoe UI Mono</FontName> <Size>14</Size> 




рднрд╡рд┐рд╖реНрдп рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЪрд░ рдмрдирд╛рдПрдВ:
 private List<Texture2D> MelList; private Texture2D mouse; private Song song; private SpriteFont font; 


рдФрд░ рдЗрд╕реЗ рд▓реЛрдбрдХрдВрдЯреЗрдВрдЯ () рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ:

 MelList = new List<Texture2D>(); for(int a = 1; a <= 5; a++) MelList.Add(Content.Load<Texture2D>("mel" + a)); mouse = Content.Load<Texture2D>("mouse"); song = Content.Load<Song>("Leaves_in_the_Wind"); font = Content.Load<SpriteFont>("SpriteFont1"); 


рд╡реИрд╕реЗ, рд╕рд╛рдордЧреНрд░реА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рднрд░реА рд╣реБрдИ рд╣реИ: рд╕рд╛рдордЧреНрд░реАред рд▓реЛрдб <> ("рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐") рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ;
рд╕рд╛рдордЧреНрд░реА рдкреНрд░реЛрд╕реЗрд╕рд░ рддреНрд░рд┐рдХреЛрдгреАрдп рдХреЛрд╖реНрдардХ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ Texture2D, Song, SpriteFont рд╣реИред рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рд╕рд╛рдордЧреНрд░реА рднрд░реА рд╣реБрдИ рд╣реИ, Game1 рдкрд░ рдЬрд╛рдПрдВ () рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд▓рд┐рдЦреЗрдВ:
 graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 800; //   graphics.PreferredBackBufferHeight = 600; //   graphics.IsFullScreen = false; //    graphics.ApplyChanges(); //   Content.RootDirectory = "Content"; 


рдЖрд╡реЗрджрди рдЖрд░рдВрднреАрдХреГрдд рд╣реИред

рд╣рдо "рдЦреЗрд▓ рддрд░реНрдХ" рд▓рд┐рдЦрддреЗ рд╣реИрдВ


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

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрдХрдбрд╝рдиреЗ рдХреА рд╕реВрдЪреА:
 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace MusicCatch { public class Catcher { public Texture2D Texture { get; set; } //   public Vector2 Position { get; set; } //   public Vector2 Velocity { get; set; } //   public float Angle { get; set; } //    public float AngularVelocity { get; set; } //    public Color Color { get; set; } //   public float Size { get; set; } //   public int TTL { get; set; } //    private float RComponent; //   RGB private float GComponent; //   RGB private float BComponent; //   RGB public int type; //   private Random random; //    public Catcher(Texture2D texture, Vector2 position, Vector2 velocity, float angle, float angularVelocity, int type, float size, int ttl) { //     Texture = texture; Position = position; Velocity = velocity; Angle = angle; AngularVelocity = angularVelocity; this.type = type; Size = size; TTL = ttl; SetType(type); //      } public void ApplyImpulse(Vector2 vector) //   ( ) { Velocity += vector; } public void Update() //    { TTL--; Position += Velocity; Angle += AngularVelocity; if (type != -1) { Velocity = new Vector2(Velocity.X, Velocity.Y - .1f); Size = (10 + Velocity.Y) / 20; if(Size > 0.8f) Size = 0.8f; } if (type == 0) { GComponent -= 0.005f; BComponent += 0.005f; Color = new Color(RComponent, GComponent, BComponent); } else if (type == 4) { Color = new Color((float)(1f * random.NextDouble()), (float)(1f * random.NextDouble()), (float)(1f * random.NextDouble())); } } public void Draw(SpriteBatch spriteBatch) //   { Rectangle sourceRectangle = new Rectangle(0, 0, Texture.Width, Texture.Height); Vector2 origin = new Vector2(Texture.Width / 2, Texture.Height / 2); spriteBatch.Draw(Texture, Position, sourceRectangle, Color, Angle, origin, Size, SpriteEffects.None, 0f); } public void SetType(int type) //    { this.type = type; Color StartColor = new Color(1f, 1f, 1f); switch (type) { case 0: StartColor = new Color(0f, 1f, 0f); break; //  case 1: StartColor = new Color(1f, 0f, 0f); break; //  case 2: StartColor = new Color(1f, 0f, 1f); break; //  case 3: StartColor = new Color(1f, 1f, 0f); break; //  case 4: random = new Random(); break; //  } RComponent = ((int)StartColor.R) / 255f; GComponent = ((int)StartColor.G) / 255f; BComponent = ((int)StartColor.B) / 255f; Color = new Color(RComponent, GComponent, BComponent); if (type == -1) { Color = new Color(1f, 1f, 1f, 0.1f); } } } } 


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрдЪрдлрд╝реЛрд░реНрдб рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ:
 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace MusicCatch { class CatcherHolder { private Random random; //    public List<Catcher> particles; //   (Catcher) private List<Texture2D> textures; //   public List<float> accomulator { get; set; } //  float-,      accomulator тАФ   . public CatcherHolder(List<Texture2D> textures) { this.textures = textures; this.particles = new List<Catcher>(); random = new Random(); accomulator = new List<float>(); //       128  тАФ 1.0f for (int a = 0; a < 128; a++) { accomulator.Add(1.0f); } } //    // Wave - ,   0f   . private Catcher GenerateNewParticle(float Wave) { Texture2D texture = textures[random.Next(textures.Count)]; //      Vector2 position = new Vector2(Wave, 0); //   Vector2 velocity = new Vector2((float)(random.NextDouble() - 0.5), (float)(random.NextDouble() * 10)); //  , 0.5f  X  10f  Y float angle = 0; //   = 0 float angularVelocity = 0.05f * (float)(random.NextDouble()*2 - 1 ); //    Color color = new Color(0f, 1f, 0f); //   (     Catcher) float size = (float)random.NextDouble()*.8f + .2f; //   int ttl = 400; //    400 (400    , .. 400 / 60 тАФ 6   . int type = 0; тАФ   0 //   if (random.Next(10000) > 9900) //  type = 1; else if (random.Next(10000) > 9950) //  type = 3; else if (random.Next(10000) > 9997) //  type = 2; else if (random.Next(10000) > 9998) //  type = 4; return new Catcher(texture, position, velocity, angle, angularVelocity, type, size, ttl); //      } //         public void GenerateYellowExplossion(int x, int y, int radius) { Texture2D texture = textures[random.Next(textures.Count)]; Vector2 direction = Vector2.Zero; float angle = (float)Math.PI * 2.0f * (float)random.NextDouble(); float length = radius * 4f; direction.X = (float)Math.Cos(angle); direction.Y = -(float)Math.Sin(angle); Vector2 position = new Vector2(x, y) + direction * length; Vector2 velocity = direction * 4f; float angularVelocity = 0.05f * (float)(random.NextDouble() * 2 - 1); float size = (float)random.NextDouble() * .8f + .2f; int ttl = 400; int type = 3; particles.Add(new Catcher(texture, position, velocity, 0, angularVelocity, type, size, ttl)); } // "" ,   public void Beat(float Wave) { particles.Add(GenerateNewParticle(Wave)); } public void Update() //    { for (int particle = 0; particle < particles.Count; particle++) { particles[particle].Update(); if (particles[particle].Size <= 0 || particles[particle].TTL <= 0) { //        ,   particles.RemoveAt(particle); particle--; } } //  ,     1f,   ,     Constants тАФ ACCUMULATE_SPEED,  Constanst - . for (int a = 0; a < 128; a++) if (accomulator[a] < 1.0f) accomulator[a] += Constanst.ACCUMULATE_SPEED; } public void Draw(SpriteBatch spriteBatch) { //   ,   BlendState.Additive,     "". spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive); for (int index = 0; index < particles.Count; index++) { particles[index].Draw(spriteBatch); } spriteBatch.End(); } } } 


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд▓рдЧрд╛рддрд╛рд░:
 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MusicCatch { public class Constanst { public const float BEAT_COST = .4f; // "" ,        public const float ACCUMULATE_SPEED = .01f; //   public const float BEAT_REACTION = .5f; //    ""   public const float ACCOMULATOR_REACTION = .5f; //      ,      } } 


рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдПрдХ рд░рд╣рд╕реНрдпрдордпреА рдмреИрдЯрд░реА рдХреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрддреА рд╣реИред рдЪрд▓реЛ "рд╕рдВрдЧреАрдд" рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рд╕рдВрдЧреАрдд рд╕рдВрдХреЗрдд рдПрдХ рдСрдбрд┐рдпреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рднреЛрдЬрди рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ - рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╕реНрдкреАрдХрд░ рд╕рдВрдЧреАрдд рдирд╣реАрдВ рд╕реБрдирддреЗ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╕реНрддрд┐рд╖реНрдХ рджреНрд╡рд╛рд░рд╛ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЖрд╡реГрддреНрддрд┐ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВред
рдмрддреНрддрдЦ, рд╡рд┐рдЪрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрдпрддрди рдХреЗ "рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ" рдХреЛ рд╕реБрдирдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рдирдбрд╛рдЯрд╛ред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, 128 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ, рдЬреЛ 0f рд╕реЗ 1f рддрдХ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрдпрддрди: рд╕рд░рдгреА рдореЗрдВ рдореВрд▓реНрдп рд╕рдВрдЧреАрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рд╕рднреА 128 рддрддреНрд╡реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рддрддреНрд╡ рдХрд╛ рдорд╛рди 0.6f рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдмреАрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡реЗрд╡ (рд╕рд░рдгреА рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдирд╛ рд╣реБрдИ) рдкрд╛рд╕ рдХрд░реЗрдВред рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЖрдк рдмреАрдЯ рдореЗрдВ рдПрдХ рдиреЛрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддреАрди рдЕрдкрдбреЗрдЯ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реА рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рдореВрд▓реНрдп> 0.6f рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 100500 рдХрдг рд╣реЛрдВрдЧреЗред рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмреИрдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╕рд░рд▓ рд╣реИ: рдмреАрдЯ рдХреЗ рджреМрд░рд╛рди, рдирд┐рд░рдВрддрд░ BEAT_COST рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡реЗрд╡ рдЗрдВрдбреЗрдХреНрд╕ рдХреА рдмреИрдЯрд░реА рд╕рд░рдгреА рдХреЗ рд╕реЗрд▓ рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрджреНрдпрддрди рд╕рднреА рдмреИрдЯрд░реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ ACCUMULATE_SPEED рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдмреАрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЬрд╛рдВрдЪ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ - рдмреИрдЯрд░реА рдорд╛рди> ACCOMULATOR_REACTION, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдмреАрдЯ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд GameLogic (Game1) рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб, рд▓реЗрдХрд┐рди рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
 using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace MusicCatch { public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; private List<Texture2D> MelList; private Texture2D mouse; private CatcherHolder m_cHolder; MediaLibrary mediaLibrary; //   "" Song song; //   VisualizationData visualizationData; SpriteFont font; private int scores = 0; //  private float self_size = 1f; //  "" private int xsize = 1; //   private float power = 0f; //     private float activity = 0f; //     public Game1() { graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 800; graphics.PreferredBackBufferHeight = 600; graphics.IsFullScreen = false; graphics.ApplyChanges(); Content.RootDirectory = "Content"; //   mediaLibrary = new MediaLibrary(); visualizationData = new VisualizationData(); scores = 0; } protected override void Initialize() { m_cHolder = new CatcherHolder(MelList); MediaPlayer.Play(song); //    MediaPlayer.IsVisualizationEnabled = true; //   base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); MelList = new List<Texture2D>(); for(int a = 1; a <= 5; a++) MelList.Add(Content.Load<Texture2D>("mel" + a)); mouse = Content.Load<Texture2D>("mouse"); song = Content.Load<Song>("Leaves_in_the_Wind"); font = Content.Load<SpriteFont>("SpriteFont1"); } protected override void UnloadContent() { } protected override void Update(GameTime gameTime) { m_cHolder.Update(); MediaPlayer.GetVisualizationData(visualizationData); //   // ""   ,   for (int a = 0; a < 128; a++) { if (visualizationData.Frequencies[a] > Constanst.BEAT_REACTION && m_cHolder.accomulator[a] > Constanst.ACCOMULATOR_REACTION) { m_cHolder.Beat(a * 3.125f * 2); //  "",   . m_cHolder.accomulator[a] -= Constanst.BEAT_COST; //   } } // ,   ,       if (power > 0f) { for (int particle = 0; particle < m_cHolder.particles.Count; particle++) { if (m_cHolder.particles[particle].type != 1) //   ,   { float body1X = m_cHolder.particles[particle].Position.X; float body1Y = m_cHolder.particles[particle].Position.Y; float body2X = (float)Mouse.GetState().X; float body2Y = (float)Mouse.GetState().Y; float Angle = (float)Math.Atan2(body2X - body1X, body2Y - body1Y) - ((float)Math.PI / 2.0f); //     float Lenght = (float)(5000f * power) / (float)Math.Pow((float)Distance(body1X, body1Y, body2X, body2Y), 2.0f); //   m_cHolder.particles[particle].ApplyImpulse(AngleToV2(Angle, Lenght)); //    } } power -= 0.001f; //   } activity -= 0.001f; //    if (activity < 0.0f) activity = 0.0f; else if (activity > 0.5f) activity = 0.5f; //     0f  .5f //    :    for (int particle = 0; particle < m_cHolder.particles.Count; particle++) { int x = (int)m_cHolder.particles[particle].Position.X; int y = (int)m_cHolder.particles[particle].Position.Y; int radius = (int)(16f * m_cHolder.particles[particle].Size); if (circlesColliding(Mouse.GetState().X, Mouse.GetState().Y, (int)(16f * self_size), x, y, radius)) { scores += (int)(10f * m_cHolder.particles[particle].Size * xsize); //  ,        activity += 0.005f; //   int type = m_cHolder.particles[particle].type; //   ,     switch (type) { case 3: //  self_size += 0.1f; xsize += 1; //      if (self_size > 4.0f) self_size = 4.0f; break; case 2: //  power = 1f; //   ,       break; case 4: //  for (int b = 0; b < m_cHolder.particles.Count; b++) m_cHolder.particles[b].SetType(3); //     тАФ  break; case 1: //  () for(int a = 1; a < xsize; a++) m_cHolder.GenerateYellowExplossion(Mouse.GetState().X, Mouse.GetState().Y, (int)(16f * self_size)); xsize = 1; self_size = 1f; scores -= (int)(scores / 4); break; } //   m_cHolder.particles[particle].TTL = 0; m_cHolder.particles.RemoveAt(particle); particle--; } } base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); m_cHolder.Draw(spriteBatch); //  CatcherHolder spriteBatch.Begin(); Rectangle sourceRectangle = new Rectangle(0, 0, mouse.Width, mouse.Height); //   Vector2 origin = new Vector2(mouse.Width / 2, mouse.Height / 2); // offset  Vector2 mouse_vector = new Vector2(Mouse.GetState().X, Mouse.GetState().Y); // ()  string xtext = "x" + xsize.ToString(); //  Vector2 text_vector = font.MeasureString(xtext) / 2.0f; //  offset'a  spriteBatch.Draw(mouse, mouse_vector, sourceRectangle, new Color(0.5f - power/2.0f + activity, 0.5f, 0.5f - power/2.0f), 0.0f, origin, self_size, SpriteEffects.None, 0f); //   spriteBatch.DrawString(font, xtext, mouse_vector - text_vector, Color.White); //   spriteBatch.DrawString(font, "Score: " + scores.ToString(), new Vector2(5, graphics.PreferredBackBufferHeight - 34), Color.White); //   spriteBatch.End(); base.Draw(gameTime); } // ,       bool circlesColliding(int x1, int y1, int radius1, int x2, int y2, int radius2) { int dx = x2 - x1; int dy = y2 - y1; int radii = radius1 + radius2; if ((dx * dx) + (dy * dy) < radii * radii) { return true; } else { return false; } } //      public Vector2 AngleToV2(float angle, float length) { Vector2 direction = Vector2.Zero; direction.X = (float)Math.Cos(angle) * length; direction.Y = -(float)Math.Sin(angle) * length; return direction; } //  public float Distance(float x1, float y1, float x2, float y2) { return (float)Math.Sqrt((float)Math.Pow(x2 - x1, 2) + (float)Math.Pow(y2 - y1, 2)); } } } 


рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рдЦрд┐рд▓реМрдирд╛ рд╣реИред XNA 4.0 рдФрд░ .NET рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдВрддрд┐рдо рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;

рд▓рд┐рдВрдХ: рдЦреЗрд▓ рд╣реА ( рдкреНрд░рддреНрдпрдХреНрд╖ ) | рд╕реНрд░реЛрдд рдХреЛрдб ( рдкреНрд░рддреНрдпрдХреНрд╖ ) | XNA рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдВрдб-рдпреВрдЬрд╝рд░

рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ:


PS рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдореЗрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЦреЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╝реНрд▓реИрд╢ рдХреЗ рддрд╣рдд рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рдЦреЗрд▓ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛; рддрджрдиреБрд╕рд╛рд░, рдпрд╣ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
PSS рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ XNA / рдкрд╛рда рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реВрдВрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдПрдХ рд╣рдмреНрд░ рдпрд╛ рдЙрди рд╕рдВрдкрд░реНрдХреЛрдВ рдкрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИрдВред

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


All Articles