XNA рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдЬреАрдпреВрдЖрдИ

рд╢реБрдн рджрд┐рдиред рдпрд╣ рдЖрд▓реЗрдЦ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдирдП рдкрд╣рд▓реБрдУрдВ рдХреЛ рдирд╣реАрдВ рдЦреЛрд▓реЗрдЧрд╛, рдпрд╣ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╢рд╛рдВрдд рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛рдПрдЧрд╛, рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдмрд╕ рдПрдХ рдФрд░ рдкреБрд░рд╛рдиреА рдмрд╛рдЗрдХ, рдЬрдВрдЧ рдЦрд╛рдП, рд▓реЗрдХрд┐рди рдЬрд╛рдиреЗ рдкрд░, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд▓рдВрдмреА рд╕рд╡рд╛рд░реА рд╣реИ ...



рдЗрддрдирд╛

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

рдЖрдзрд╛рд░ рдХреЛрдб
class Gui { public GuiObject elements[]; public Gui() { elements = new GuiObject[6]; } } class GuiObject { public Rectangle rect; //    , ,  .. public bool lpressed; //     public bool rpressed; public bool lclick;//      public bool rclick; public GameState drawstate; //    ,    public bool darktransparency; //    ,    public bool lighttransparency; public string text; public bool undercursor; public GuiObject(Rectangle rec, bool dtr, bool ltr, GameState st, UpdateFunction f,DrawFunction f2, string text = "") { rect = rec; lpressed = false; rpressed = false; enable = true; lclick = false; rclick = false; darktransparency = dtr; lighttransparency = ltr; drawstate = st; this.text = text; updateFunction = f; drawFunction = f2; } } public enum GameState { Any, MainMenu, Game } 


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

рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб
  public delegate void UpdateFunction(ref GuiObject me); public delegate void DrawFunction(Texture2D line, Texture2D darkbackground, Texture2D lightbackground, ref GuiObject me); public DrawFunction drawFunction; public UpdateFunction updateFunction; /*           . , ,   */ /* line, darkbackground, lightbackground -   ,   */ 


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

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
 //Gui.cs public void Update(MouseState mstate,GameState state,GameTime gameTime) { for (int i = 0; i < elements.Length; i++) { if (elements[i].drawstate == state&&elements[i].enable) { elements[i].Update(mstate); elements[i].updateFunction(ref elements[i]); } } } /*   foreach  for,         */ /*   ?      ( click  pressed),          ( ).*/ // GuiObject.cs public void Update(MouseState state) { lclick = false; rclick = false; if (rect.Contains(new Point(state.X, state.Y))) { if (state.LeftButton == ButtonState.Pressed) if (!lpressed) { lclick = true; lpressed = true; } if (lpressed && state.LeftButton == ButtonState.Released) lpressed = false; if (state.RightButton == ButtonState.Pressed) if (!rpressed) { rclick = true; rpressed = true; } if (rpressed && state.RightButton == ButtonState.Released) rpressed = false; undercursor = true; } else undercursor = false; } 


рд╣рдордиреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐рдкрд╛рджрди рд╢реЗрд╖ рдерд╛ред рдпрд╛рдж рд░рдЦреЗрдВ, GameState рдореЗрдВ рдХреЛрдИ рднреА рдЖрдЗрдЯрдо рд╣реИ? рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдмрдЯрди рд╣рдореЗрд╢рд╛ рдмрдирд╛ рд░рд╣реЗ ... рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рджрд┐рдЦреЗрдВред

рдбреНрд░рд╛рдЗрдВрдЧ
 //Gui.cs public void Draw(Texture2D line, Texture2D darkbackground, Texture2D lightbackground, GameState state) { for (int i = 0; i < elements.Length; i++) { if ((elements[i].drawstate == GameState.Any || elements[i].drawstate == state)&&elements[i].enable) elements[i].drawFunction(line, darkbackground, lightbackground, ref elements[i]); } } 


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

рдПрдХ рд╡рд┐рдХрд╕рд┐рдд рдЦреЗрд▓ рд╕реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рднрдпрд╛рдирдХ рдЙрджрд╛рд╣рд░рдг
 // void Init() state = GameState.MainMenu; gui = new Gui(); gui.elements[0] = new GuiObject(new Rectangle(0, 0, width-205, height), false, false, GameState.Game, Main, MapGuiDraw); gui.elements[1] = new GuiObject(new Rectangle(width - 205, 0, 205, height), false, false, GameState.Game, RightPanel, RightPanelDraw); gui.elements[2] = new GuiObject(new Rectangle(width - 205, 0, 205, 39), false, false, GameState.Game, GameMenuButton, GameMenuButtonDraw); gui.elements[3] = new GuiObject(new Rectangle((width - 150) / 2, height / 2, 150, 30), false, false, GameState.MainMenu, StartGameButton, StandartButtonDraw, "Start game"); gui.elements[4] = new GuiObject(new Rectangle((width - 150) / 2, height / 2 + 50, 150, 30), false, false, GameState.StartGameMenu, GenerateButton, StandartButtonDraw, "Generate"); //Draw Functions Example void StandartGuiDraw( Texture2D line, Texture2D darkbackground, Texture2D lightbackground, ref GuiObject me) { if (me.darktransparency) DrawTexturedRect( darkbackground, me.rect); if (me.lighttransparency) DrawTexturedRect( lightbackground, me.rect); DrawOutLine(line, me.rect); if (me.text != "") { Vector2 size = font.MeasureString(me.text); spriteBatch.DrawString(font, me.text, new Vector2((int)(me.rect.X + me.rect.Width / 2 - size.X / 2), (int)(me.rect.Y + me.rect.Height / 2 - size.Y / 2)), Color.White); } } 


рдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдЦреЗрд▓ рд╢рд╣рд░рд╡рд╛рд╕реА (рд╡рд┐рдХрд╛рд╕ рдореЗрдВ)
рдореЗрдиреВ:

рдореИрдк рдЬреЗрдирд░реЗрдЯрд░ рдореЗрдиреВ:

рдЦреЗрд▓ рд╕реНрдХреНрд░реАрди:

рдЦреЗрд▓ рдкреНрд░рд╛рдЪреАрди рд╕рд╛рдореНрд░рд╛рдЬреНрдп
рдореЗрдиреВ:

рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХ рдореЗрдиреВ:

рдорд╛рдирдЪрд┐рддреНрд░ рд╕рдВрдкрд╛рджрдХ:


рдХрд╛рдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ

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

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм рдореИрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЦреЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдореЗрд░реЗ рдЦреЗрд▓, рдЯрд╛рдЙрдирд╕рдореИрди рдЕрднреА рднреА рд▓рд┐рдЦреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рд╕рдорд╛рдкреНрдд рдХрд░ рджреВрдВрдЧрд╛, рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВред
рдкреНрд░рд╛рдЪреАрди рд╕рд╛рдореНрд░рд╛рдЬреНрдпреЛрдВ рдХреЛ ex.ua рдпрд╛ Google рдкрд░ рдЫреЛрдЯреЗ рдЦреЗрд▓реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

PS рдХреГрдкрдпрд╛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ред рдмрд┐рдирд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рд╡рд┐рдкрдХреНрд╖ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред :)

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


All Articles