#include "gamecore.h" #include "drawutils.h" #include "mathutils.h" #include "debug.h" int GameCore::MAX_MOVE_DISTANCE = 100; int GameCore::NODE_RADIUS = 12; int GameCore::PLAYER1_COLOUR = 0x4a483f; int GameCore::PLAYER2_COLOUR = 0x090c7a; GameCore::GameCore() { display = NULL; background = NULL; is_running = true; who = PLAYER1; } int GameCore::execute() { if (!init()) return 1; SDL_Event event; while (is_running) { while(SDL_PollEvent(&event)) handle_event(&event); iterate(); render(); } cleanup(); return 0; } bool GameCore::init() { if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return false; display = SDL_SetVideoMode(1024,768,32, SDL_HWSURFACE | SDL_DOUBLEBUF); if (display == NULL) { #ifdef DEBUG std::cerr << "GameCore::init(): error: Couldn't create main surface\n"; #endif return false; } background = DrawUtils::load("background.bmp"); if (background == NULL) { #ifdef DEBUG std::cerr << "GameCore::init(): error: Couldn't load background image\n"; #endif return false; } // DrawUtils::transpare(node, 255, 0, 255); // DrawUtils::transpare(move_template, 255, 0, 255); // SDL_SetAlpha(move_template, SDL_SRCALPHA, 128); return true; } void GameCore::render() { DrawUtils::draw(display, background, 0, 0); list vertices = graph.get_vertices(); list edges = graph.get_edges(); if (graph.get_current_vertex() != NULL) { Vertex* v = graph.get_current_vertex(); DrawUtils::draw_circle_filled(display, v->x, v->y, MAX_MOVE_DISTANCE, 0xcb1919); } for (list::iterator cursor = vertices.begin(); cursor != vertices.end(); cursor++) { Vertex v = *(*cursor); DrawUtils::draw_circle_filled(display, v.x, v.y, v.r, v.colour); } for (list::iterator cursor = edges.begin(); cursor != edges.end(); cursor++) { Edge e = *cursor; DrawUtils::draw_line(display, e.a->x, e.a->y, e.b->x, e.b->y, 2, e.a->colour); } SDL_Flip(display); } void GameCore::iterate() { } void GameCore::cleanup() { SDL_FreeSurface(background); SDL_FreeSurface(display); SDL_Quit(); } void GameCore::on_exit() { is_running = false; } void GameCore::on_lbutton_down(int x, int y) { Vertex* cv = graph.get_current_vertex(); if (cv != NULL && (MathUtils::distance(cv->x, cv->y, x, y) > MAX_MOVE_DISTANCE)) { Vertex* v = graph.vertex_at(x, y); if (v->colour == PLAYER1_COLOUR && turn == PLAYER1 || v->colour == PLAYER2_COLOUR && turn == PLAYER2) graph.select_vertex(x, y); return; } graph.do_vertex(x, y, NODE_RADIUS, PLAYER1_COLOUR); if (turn == PLAYER1) turn = PLAYER2; else turn = PLAYER_1; } void GameCore::on_rbutton_down(int mX, int mY) { graph.clear_current_vertex(); }