Now the buttons actually do something - also added a build_type
This commit is contained in:
parent
d04cde49c8
commit
793d6bd9a2
60
game.cpp
60
game.cpp
|
@ -20,6 +20,12 @@ Game::~Game()
|
|||
SDL_FreeSurface(background);
|
||||
if (font != NULL)
|
||||
TTF_CloseFont(font);
|
||||
|
||||
for (list<MenuButton*>::iterator cursor = buttons.begin();
|
||||
cursor != buttons.end(); cursor++)
|
||||
{
|
||||
delete *cursor;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -41,11 +47,12 @@ bool Game::init()
|
|||
return false;
|
||||
}
|
||||
|
||||
move_button = MenuButton("Move", font, 155, display->h - 95, BUTTON_MOVE);
|
||||
attack_button = MenuButton("Attack", font, 260, display->h - 95,
|
||||
BUTTON_ATTACK);
|
||||
build_button = MenuButton("Build", font, 155, display->h - 50,
|
||||
BUTTON_BUILD);
|
||||
buttons.push_back(new MenuButton("Move", font, 155, display->h - 95,
|
||||
BUTTON_MOVE));
|
||||
buttons.push_back(new MenuButton("Attack", font, 260, display->h - 95,
|
||||
BUTTON_ATTACK));
|
||||
buttons.push_back(new MenuButton("Build", font, 155, display->h - 50,
|
||||
BUTTON_BUILD));
|
||||
|
||||
|
||||
return GameState::init();
|
||||
|
@ -130,9 +137,12 @@ void Game::render()
|
|||
|
||||
if (data.get_current_vertex() != NULL)
|
||||
{
|
||||
draw_button(&move_button);
|
||||
draw_button(&build_button);
|
||||
draw_button(&attack_button);
|
||||
for (list<MenuButton*>::iterator cursor = buttons.begin();
|
||||
cursor != buttons.end(); cursor++)
|
||||
{
|
||||
MenuButton* button = *cursor;
|
||||
draw_button(button);
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Flip(display);
|
||||
|
@ -156,6 +166,32 @@ void Game::draw_button(MenuButton* button)
|
|||
}
|
||||
|
||||
|
||||
void Game::handle_button_press(ButtonAction action)
|
||||
{
|
||||
switch (action)
|
||||
{
|
||||
case BUTTON_BUILD:
|
||||
data.set_mode(MODE_BUILD);
|
||||
break;
|
||||
case BUTTON_ATTACK:
|
||||
data.set_mode(MODE_ATTACK);
|
||||
break;
|
||||
case BUTTON_MOVE:
|
||||
data.set_mode(MODE_MOVE);
|
||||
break;
|
||||
case BUTTON_BUILD_ATTACKER:
|
||||
data.set_build_type(VERTEX_ATTACKER);
|
||||
break;
|
||||
case BUTTON_BUILD_DEFENDER:
|
||||
data.set_build_type(VERTEX_DEFENDER);
|
||||
break;
|
||||
case BUTTON_BUILD_PRODUCER:
|
||||
data.set_build_type(VERTEX_PRODUCER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Game::draw_stats(Vertex* v)
|
||||
{
|
||||
int num_lines = 4;
|
||||
|
@ -181,8 +217,14 @@ void Game::draw_stats(Vertex* v)
|
|||
|
||||
void Game::on_lbutton_down(int x, int y)
|
||||
{
|
||||
if (y > display->h - 110) return;
|
||||
for (list<MenuButton*>::iterator cursor = buttons.begin();
|
||||
cursor != buttons.end(); cursor++)
|
||||
{
|
||||
MenuButton* button = *cursor;
|
||||
if (button->is_at(x, y)) handle_button_press(button->get_action());
|
||||
}
|
||||
|
||||
if (y > display->h - 110) return;
|
||||
if (!data.endgame()) data.handle_click(x, y);
|
||||
}
|
||||
|
||||
|
|
10
game.h
10
game.h
|
@ -10,9 +10,11 @@
|
|||
#include "gamedata.h"
|
||||
#include "gamestate.h"
|
||||
#include "menubutton.h"
|
||||
#include <stack>
|
||||
#include <SDL_ttf.h>
|
||||
#include <list>
|
||||
#include <stack>
|
||||
|
||||
using std::list;
|
||||
using std::stack;
|
||||
|
||||
|
||||
|
@ -39,6 +41,8 @@ class Game : public GameState
|
|||
void draw_stats(Vertex* v);
|
||||
void draw_button(MenuButton* button);
|
||||
|
||||
void handle_button_press(ButtonAction action);
|
||||
|
||||
// data
|
||||
GameData data;
|
||||
// the x,y position of the mouse cursor
|
||||
|
@ -50,9 +54,7 @@ class Game : public GameState
|
|||
TTF_Font* font;
|
||||
|
||||
// menu buttons
|
||||
MenuButton move_button;
|
||||
MenuButton build_button;
|
||||
MenuButton attack_button;
|
||||
list<MenuButton*> buttons;
|
||||
|
||||
static int NODE_RADIUS;
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@ GameData::GameData()
|
|||
player1 = Player("player 1", PLAYER1_COLOUR);
|
||||
player2 = Player("player 2", PLAYER2_COLOUR);
|
||||
turn = &player1;
|
||||
build_type = VERTEX_NONE;
|
||||
}
|
||||
|
||||
GameData::~GameData() { }
|
||||
|
@ -236,6 +237,9 @@ void GameData::set_mode(Mode m)
|
|||
// Stay in MODE_SELECT (or maybe MODE_BUILD) when current is null
|
||||
if (current == NULL) return;
|
||||
|
||||
// If we're leaving MODE_BUILD, we should set the build_type back to none
|
||||
if (mode == MODE_ATTACK && m != mode) build_type = VERTEX_NONE;
|
||||
|
||||
// The other modes all require current to match the player
|
||||
if (dynamic_cast<GameVertex*>(current)->player == turn) mode = m;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "player.h"
|
||||
|
||||
enum Mode {MODE_MOVE, MODE_ATTACK, MODE_BUILD, MODE_SELECT};
|
||||
enum VertexType {VERTEX_ATTACKER, VERTEX_DEFENDER, VERTEX_PRODUCER};
|
||||
enum VertexType {VERTEX_ATTACKER, VERTEX_DEFENDER, VERTEX_PRODUCER, VERTEX_NONE};
|
||||
|
||||
class GameVertex : public Vertex
|
||||
{
|
||||
|
@ -43,6 +43,8 @@ class GameData : public Graph
|
|||
Mode get_mode() const { return mode; }
|
||||
void set_mode(Mode m);
|
||||
|
||||
void set_build_type(VertexType type) { build_type = type; }
|
||||
|
||||
// returns the move/attack range for the specified node
|
||||
// (or the selected node if node == NULL)
|
||||
int get_range(Vertex* node = NULL);
|
||||
|
@ -57,10 +59,12 @@ class GameData : public Graph
|
|||
float calculate_strength_r(Vertex* node, unsigned int depth, list<Vertex*>& visited);
|
||||
|
||||
Vertex* current;
|
||||
Mode mode;
|
||||
Player player1, player2;
|
||||
Player* turn;
|
||||
|
||||
Mode mode;
|
||||
VertexType build_type;
|
||||
|
||||
static int PLAYER1_COLOUR;
|
||||
static int PLAYER2_COLOUR;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user