1 / 21

CSE 380 – Computer Game Programming GUIs for Games

CSE 380 – Computer Game Programming GUIs for Games. Game GUI Controls. Stylistically fit in with game theme drawn as artwork careful font/color selection Same rules should apply as with other GUIs align components uniform style balance clarity (single word options are best)

callie
Download Presentation

CSE 380 – Computer Game Programming GUIs for Games

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CSE 380 – Computer Game ProgrammingGUIs for Games

  2. Game GUI Controls • Stylistically fit in with game theme • drawn as artwork • careful font/color selection • Same rules should apply as with other GUIs • align components • uniform style • balance • clarity (single word options are best) • keep it simple • minimize depth • don’t make assumptions about your player’s IQ

  3. What are Game GUIs for? • Starting/Stopping games • New Game, Save Game, Load Game, Pause, Continue, Quit • Game Options • level of difficulty • character selection & properties (RPG in particular) • chapter selection • Custom Controls Setup • In-game Decisions (strategy in particular) • Providing Help

  4. Menu vs. In Game Controls • Menu controls, typically • simple, elegant • textual • centered on screen • allows for menu tabbling • tied to game controllers as well • In-game controls, typically • graphical • at bottom of screen • carefully grouped • tied to keystrokes for PC gaming (very important)

  5. Halo’s Menu GUI

  6. Starcraft’s In-game GUI

  7. How might we make a GUI? • We’ll build our own buttons

  8. We know how do render images • Use images to render: • buttons • cursor • other GUI images • For buttons, use 2 images • mouse over • normal • each frame update the state based on mouse position

  9. How do we test if the mouse is over a button? void Button::updateMouseOver(POINT *mousePoint) { // IS THE CURSOR OVER THIS BUTTON? if ((mousePoint->x >= x) && (mousePoint->x <= x + width) && (mousePoint->y >= y) && (mousePoint->y <= y + height) ) { mouseOver = true; } else { mouseOver = false; } }

  10. Render Lists • Common approach in games • Each frame: • make a list of items to render • iterate through the list and render each item • throw out the list • RenderList is built and destroyed each frame • We’ll use 2 render lists: • one for the GUI • one for the game world

  11. Render List Cheating • We’re not really going to use a list • Why? • we don’t want to allocate memory dynamically • Instead, we’ll use a giant array and pretend it’s a list • give the array a max size • don’t exceed that max size

  12. A note about platform independence • Today our game’s graphics are drawn using DirectX • Tomorrow we may wish to use OpenGL • How can we minimize the difficulty of switching? • virtual functions • See: • GameGraphics & DirectXGameGraphics • TextureManager & DirectXTextureManager

  13. To maximize platform independence • Confine technology-specific types and methods to technology-specific classes • Don’t let DirectX spill over into your data management classes

  14. How do we respond to input? • Get Input • If game state is in main menu • Process input for main menu screen components • Draw main menu screen • Main Menu GUI • If game state is in game • Process input for game screen components • Draw game screen • Game GUI & Game World

  15. Getting Input • We’ll use Windows methods • To test if a key is currently pressed: • GetAsyncKeyState(key) & 0X8000 • To get the current mouse position: • GetCursorPos(mousePoint); • To test if a mouse button is currently pressed: • GetAsyncKeyState(VK_LBUTTON) & 0X8000

  16. Each Frame • We update data for: • all keys • first key press? • fill out struct for each key • mouse/cursor position • is mouse over buttons?

  17. GameInput • Each frame: void GameInput::processInput(Game *game, WINDOWINFO wi) { updateCursorPosition(wi, game->getGUI()->getCursor()); updateInputState(); respondToKeyboardInput(game); respondToMouseInput(game); }

  18. Custom Behavior • In the example I’ve given you, I have: • a core library • a custom example game • Customized behavior is loaded by key child classes: • DirectXGraphics • XButtonEventHandler • XKeyEventHandler • XTextGenerator

  19. Questions for you to figure out • Where is the programmed response to hitting SHIFT-C? • In what order are the GUI items rendered? • How can I speed up or slow down the frame rate? • How can you render something as more transparent? • How can we render changing text? • How can we render a Mini Map?

  20. Mini-Map Rendering • Naive Approach 1: • scale and render images on the fly • Naive Approach 2: • pre scale images, render individually on the fly • Improved Approach • pre build mini-map image for each level • render as single image

  21. Mini-Map Rendering – How? • Build off-screen surface as render target • CreateRenderTarget • Render scaled version of world to surface • StretchRect • Save to File as Image • D3DXSaveSurfaceToFileA • Refs: see schedule page for DirectX9 & Util APIs

More Related