chess_board_sim/chess_board.cpp

114 lines
3.1 KiB
C++
Raw Normal View History

2020-02-27 18:36:55 -05:00
#include "chess_board.h"
#include <SDL.h>
#include <SDL_video.h>
#include "stdio.h"
#define MARGIN 200
typedef enum
{
SQUARE_EMPTY = 0,
KING,
QUEEN,
ROOK,
KNIGHT,
BISHOP,
PAWN
};
static int height;
static int width;
static SDL_Texture *board_texture;
static SDL_Rect rectangle;
static int board_width;
uint8_t board_state[8][8] = 0u;
bool click(SDL_Renderer *p_renderer, int x, int y)
{
SDL_Point const point = {x, y};
bool ret_val = false;
rectangle.w = board_width;
rectangle.h = board_width;
rectangle.x = (width - board_width) / 2;
rectangle.y = (height - board_width) / 2;
if (SDL_PointInRect(&point, &rectangle))
{
int square_size = board_width / 8;
int starting_x = rectangle.x;
rectangle.w = square_size;
rectangle.h = square_size;
for (size_t j = 0; j < 8; j++)
{
rectangle.x = starting_x;
for (size_t i = 0; i < 8; i++)
{
if(SDL_PointInRect(&point, &rectangle))
{
goto draw_square;
}
rectangle.x += square_size;
}
rectangle.y += square_size;
}
draw_square:
SDL_SetRenderTarget(p_renderer, board_texture);
SDL_SetRenderDrawColor(p_renderer, 0x00, 0xFF, 0x00, 0x00);
SDL_RenderDrawRect(p_renderer, &rectangle);
SDL_RenderFillRect(p_renderer, &rectangle);
SDL_SetRenderTarget(p_renderer, NULL);
SDL_RenderCopy(p_renderer, board_texture, NULL, NULL);
SDL_RenderPresent(p_renderer);
}
return ret_val;
}
void chess_board_init(SDL_Renderer *p_renderer, int w, int h)
{
width = w;
height = h;
SDL_DestroyTexture(board_texture);
board_texture = SDL_CreateTexture(p_renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h);
board_width = ((w > h) ? h : w ) - MARGIN;
// get rid of rounding errors
board_width -= board_width % 8;
}
void draw_board(SDL_Renderer *p_renderer)
{
SDL_SetRenderTarget(p_renderer, board_texture);
SDL_SetRenderDrawColor(p_renderer, 0x7f, 0x7f, 0x7f, 0);
SDL_RenderClear(p_renderer);
SDL_RenderDrawRect(p_renderer, &rectangle);
SDL_SetRenderDrawColor(p_renderer, 0xFF, 0xFF, 0xFF, 0x00);
rectangle.w = board_width;
rectangle.h = board_width;
rectangle.x = (width - board_width) / 2;
rectangle.y = (height - board_width) / 2;
SDL_RenderFillRect(p_renderer, &rectangle);
SDL_SetRenderDrawColor(p_renderer, 0, 0, 0, 0x00);
int square_size = board_width / 8;
int starting_x = rectangle.x;
rectangle.w = square_size;
rectangle.h = square_size;
for (size_t j = 0; j < 8; j++)
{
rectangle.x = starting_x;
if ((j % 2) == 0)
{
rectangle.x += square_size;
}
for (size_t i = 0; i < 4; i++)
{
SDL_RenderFillRect(p_renderer, &rectangle);
rectangle.x += 2 * square_size;
}
rectangle.y += square_size;
}
SDL_SetRenderTarget(p_renderer, NULL);
SDL_RenderCopy(p_renderer, board_texture, NULL, NULL);
}