Transferred from GitHub
This commit is contained in:
parent
53130bf748
commit
16ccfe61b4
19 changed files with 1282 additions and 0 deletions
28
Makefile
Normal file
28
Makefile
Normal file
|
@ -0,0 +1,28 @@
|
|||
# Variables
|
||||
LIBS:= -lSDL2main -lSDL2 -lSDL2_image -lSDL2_ttf
|
||||
TARGET:= minesweeper
|
||||
|
||||
# Instructions
|
||||
build: compile link run
|
||||
|
||||
compile:
|
||||
g++ -c -I include source/engine/vectors.cpp -o bin/vectors.o
|
||||
g++ -c -I include source/engine/engine.cpp -o bin/engine.o
|
||||
g++ -c -I include source/game/tilemap.cpp -o bin/tilemap.o
|
||||
g++ -c -I include source/game/navbar.cpp -o bin/navbar.o
|
||||
g++ -c -I include source/game/message.cpp -o bin/message.o
|
||||
g++ -c -I include source/main.cpp -o bin/main.o
|
||||
|
||||
link:
|
||||
g++ bin/*.o -L lib $(LIBS) -o build/$(TARGET)
|
||||
|
||||
cpydat:
|
||||
cp data -r build
|
||||
|
||||
run:
|
||||
./build/$(TARGET)
|
||||
|
||||
# Complimentary
|
||||
clean:
|
||||
rm build/*
|
||||
rm bin/*
|
BIN
assets/.DS_Store
vendored
Normal file
BIN
assets/.DS_Store
vendored
Normal file
Binary file not shown.
1
assets/piskel/Tileset.piskel
Normal file
1
assets/piskel/Tileset.piskel
Normal file
|
@ -0,0 +1 @@
|
|||
{"modelVersion":2,"piskel":{"name":"Tileset","description":"","fps":12,"height":16,"width":16,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":12,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAAAQCAYAAABA4nAoAAADLElEQVRoQ+2avW7CMBDHg1QxsXZhZ2Nphk48ACtT36ElSyekzpWYupT2HfoeTB3ShQdgQCxdmVAl2gu61rne+SskGOEsSAkXn8//n8/nuJVl2S7xuFarVbJYLJLhcOhhnSRo72UcjWIEDhSBlg8Aqnh9AKDi73Q6bHcGg0Eyn8/Frm42m+KZZG+KUbSP8fsFQCc0TkgoHgTA114n4AiAHmEO4JuLvDB6+0pLxtx9aj9er01zRvF81u0Wv1z7l4+vxnd8Ptyy9nm+9113pelfv6QJLB9/sK9IZ1el+2BfOwDv223R6HW7/a9xvIEzOAoefukFgFEg6p7B77P9gDw9l8WEvnHtv+SZOH536TMbA+w/xkp6gRRDNQP6AmArfh0ANuIH+yoAgD1CwMVfEj/GVIWgVgDoYNoAAE5y4kfnaZapEwAUvwsAOvFjH1QIqP8mAOhEcsgMgADg7G6YiIvHtH0EAAVueofr+GGGsAGAzvYIRiMAcANpAwCKH3+5ZZV6zzWAdEAke1X8PgDQmR7egXDoANAJhsukEYD/NQwndIhrowBAgz4ZIAQAqPhdANAJuGkAJF/U2kAFyGYJRLNDkxmAzv5cBpKEfhQAcABsagCfnSTIBHVlAPTdpwaQhGcLgGkZpGZSqf9YB3C+SADAf10h0AEg1QPq8shl/FwBkMahkSUQbXwymSTT6bR0GzsPN9Ui2LRubGIJdEgAaF1gWgLpALApgqX42ewC6WLP1Qg+AEAbUhEstc+JX8oA6mxP33eUXSBw4hwB0AkfB8ZlBrStAUIBgPODFsm2/XcBIJgaQA2ALQBgE8ouEPjiswSyEX4EgP8OwEEjiV/KAMEAAKLnLlwKSUsg3O+ntqfwHUAVP7cTRPtkOwOC3TlmAJ34gwZAEj8KACDgAKACOdaXYG4nCHyjH8SogEP4DlBlCXSoIlhXS7jUAFUAkHxgi2A4m7NcLk1+l56rRyGq2MNLQzsLFCoAdRfBJgBM26AwlqavwS67QD4AgA9ORyFGo9EOTnX6Xv1+vzgVWuWKh9n4w4CmmLosobh3Rfufs0C9Xs/rOLRpcOLzGIFTiMA3iwMNLeSNeBkAAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[null]}}
|
1
assets/piskel/glyph.piskel
Normal file
1
assets/piskel/glyph.piskel
Normal file
|
@ -0,0 +1 @@
|
|||
{"modelVersion":2,"piskel":{"name":"glyph","description":"","fps":12,"height":16,"width":16,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":13,\"chunks\":[{\"layout\":[[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]],\"base64PNG\":\"data:image/png;base64,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\"}]}"],"hiddenFrames":[null]}}
|
BIN
data/fonts/font.ttf
Normal file
BIN
data/fonts/font.ttf
Normal file
Binary file not shown.
BIN
data/sprites/glyph.png
Normal file
BIN
data/sprites/glyph.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.4 KiB |
BIN
data/sprites/tileset.png
Normal file
BIN
data/sprites/tileset.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 849 B |
45
include/engine/engine.h
Normal file
45
include/engine/engine.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
// Define once
|
||||
#ifndef H_ENGINE
|
||||
#define H_ENGINE
|
||||
|
||||
// Includes
|
||||
/// External
|
||||
#include "externals.h"
|
||||
/// Engine
|
||||
#include "vectors.h"
|
||||
|
||||
// Constants
|
||||
#define SCR_WIDTH 512
|
||||
#define SCR_HEIGHT 562
|
||||
|
||||
#define SCR_H_BUFFER 50
|
||||
|
||||
// Classes
|
||||
class Engine{
|
||||
private:
|
||||
// Variables
|
||||
SDL_Window* window;
|
||||
Uint32 last;
|
||||
|
||||
public:
|
||||
// Variables
|
||||
static double deltaTime;
|
||||
static SDL_Renderer* renderer;
|
||||
static Vector2 mousePos;
|
||||
static int clicking;
|
||||
bool running;
|
||||
|
||||
// Constructor
|
||||
Engine();
|
||||
|
||||
// Functions
|
||||
void Update();
|
||||
|
||||
void Clear();
|
||||
void Display();
|
||||
|
||||
void Delete();
|
||||
};
|
||||
|
||||
// End definition
|
||||
#endif
|
20
include/engine/externals.h
Normal file
20
include/engine/externals.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
// Define once
|
||||
#ifndef H_EXTERNALS
|
||||
#define H_EXTERNALS
|
||||
|
||||
// Includes
|
||||
/// System
|
||||
#include <iostream>
|
||||
#include <random>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
#include <math.h>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
/// SDL2
|
||||
#include <SDL2/SDL.h>
|
||||
#include <SDL2/SDL_image.h>
|
||||
#include <SDL2/SDL_ttf.h>
|
||||
|
||||
// End definition
|
||||
#endif
|
25
include/engine/vectors.h
Normal file
25
include/engine/vectors.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
// Define once
|
||||
#ifndef H_VECTORS
|
||||
#define H_VECTORS
|
||||
|
||||
// Includes
|
||||
#include <iostream>
|
||||
|
||||
// Structure
|
||||
typedef struct Vector2{
|
||||
// Variables
|
||||
float x,y;
|
||||
|
||||
// Constructor
|
||||
Vector2();
|
||||
Vector2(float x, float y);
|
||||
|
||||
// Operations
|
||||
Vector2 operator+(Vector2 b);
|
||||
Vector2 operator*(float b);
|
||||
void operator+=(Vector2 b);
|
||||
void operator*=(float b);
|
||||
} Vector2;
|
||||
|
||||
// End definition
|
||||
#endif
|
34
include/game/message.h
Normal file
34
include/game/message.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
// Define once
|
||||
#ifndef H_MESSAGE
|
||||
#define H_MESSAGE
|
||||
|
||||
// Includes
|
||||
/// Externals
|
||||
#include <engine/externals.h>
|
||||
/// Engine
|
||||
#include <engine/engine.h>
|
||||
/// Game
|
||||
#include "tilemap.h"
|
||||
|
||||
// Classes
|
||||
class Message{
|
||||
private:
|
||||
// Variables
|
||||
SDL_Texture* texture;
|
||||
|
||||
int x,y;
|
||||
int w,h;
|
||||
|
||||
public:
|
||||
// Variables
|
||||
|
||||
// Constructors
|
||||
Message(const char* msg);
|
||||
|
||||
// Functions
|
||||
void Update();
|
||||
void Draw();
|
||||
};
|
||||
|
||||
// End definition
|
||||
#endif
|
42
include/game/navbar.h
Normal file
42
include/game/navbar.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
// Define once
|
||||
#ifndef H_NAVBAR
|
||||
#define H_NAVBAR
|
||||
|
||||
// Includes
|
||||
/// Externals
|
||||
#include <engine/externals.h>
|
||||
/// Engine
|
||||
#include <engine/engine.h>
|
||||
/// Game
|
||||
#include <game/tilemap.h>
|
||||
|
||||
// Classes
|
||||
class Navbar{
|
||||
private:
|
||||
// Variables
|
||||
Tilemap* tilemap;
|
||||
SDL_Texture* texture;
|
||||
|
||||
bool didClick;
|
||||
|
||||
// Functions
|
||||
void _drawBackground();
|
||||
void _drawFlagCounter();
|
||||
void _drawFace();
|
||||
void _drawTime();
|
||||
|
||||
Vector2 _getNumber(int number);
|
||||
|
||||
public:
|
||||
// Variables
|
||||
|
||||
// Constructor
|
||||
Navbar(Tilemap* tilemap);
|
||||
|
||||
// Functions
|
||||
void Update();
|
||||
void Draw();
|
||||
};
|
||||
|
||||
// End definition
|
||||
#endif
|
65
include/game/tilemap.h
Normal file
65
include/game/tilemap.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
// Define once
|
||||
#ifndef H_TILEMAP
|
||||
#define H_TILEMAP
|
||||
|
||||
// Includes
|
||||
/// Externals
|
||||
#include <engine/externals.h>
|
||||
/// Engine
|
||||
#include <engine/engine.h>
|
||||
|
||||
// Constants
|
||||
#define GRID_W 10
|
||||
#define GRID_H 10
|
||||
#define GRID_B 10
|
||||
|
||||
// Classes
|
||||
class Tilemap{
|
||||
private:
|
||||
// Variables
|
||||
std::vector<int> grid_bomb;
|
||||
std::vector<int> grid_flag;
|
||||
std::vector<int> grid_show;
|
||||
|
||||
SDL_Texture* texture;
|
||||
|
||||
int savedClick = 0;
|
||||
bool didClick;
|
||||
bool gameBegan;
|
||||
|
||||
bool cascading;
|
||||
float timepassed;
|
||||
|
||||
// Functions
|
||||
void _init();
|
||||
void createGrid(Vector2 mousePos);
|
||||
|
||||
int getSurrounding(Vector2 tilePos);
|
||||
void revealTiles(Vector2 mousePos);
|
||||
void spawnCascade(Vector2 position);
|
||||
|
||||
void _leftClick();
|
||||
void _rightClick();
|
||||
|
||||
void winDetection();
|
||||
void clickDetection();
|
||||
|
||||
public:
|
||||
// Variables
|
||||
bool playing;
|
||||
bool win;
|
||||
int flags;
|
||||
int gameTime;
|
||||
|
||||
// Constructors
|
||||
Tilemap();
|
||||
|
||||
// Functions
|
||||
void Update();
|
||||
void Draw();
|
||||
|
||||
void Reset();
|
||||
};
|
||||
|
||||
// End definiton
|
||||
#endif
|
85
source/engine/engine.cpp
Normal file
85
source/engine/engine.cpp
Normal file
|
@ -0,0 +1,85 @@
|
|||
// Header
|
||||
#include <engine/engine.h>
|
||||
|
||||
// Variables
|
||||
double Engine::deltaTime;
|
||||
SDL_Renderer* Engine::renderer;
|
||||
Vector2 Engine::mousePos;
|
||||
int Engine::clicking;
|
||||
|
||||
// Constructor
|
||||
Engine::Engine(){
|
||||
// Init SDL2
|
||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
|
||||
|
||||
// Create a window
|
||||
window = SDL_CreateWindow("Minesweeper",
|
||||
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||
SCR_WIDTH, SCR_HEIGHT,
|
||||
SDL_WINDOW_SHOWN);
|
||||
if(window == NULL){
|
||||
throw("Failed to create an SDL window.\n");
|
||||
}
|
||||
|
||||
// Create a renderer
|
||||
Engine::renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_ACCELERATED);
|
||||
if(Engine::renderer == NULL){
|
||||
throw("Failed to create an SDL renderer.\n");
|
||||
}
|
||||
|
||||
// Staring SDL2 subsystems
|
||||
IMG_Init(IMG_INIT_PNG);
|
||||
TTF_Init();
|
||||
|
||||
// We're running!
|
||||
running = true;
|
||||
clicking = false;
|
||||
}
|
||||
|
||||
// Functions
|
||||
void Engine::Update(){
|
||||
// Getting events
|
||||
SDL_Event event;
|
||||
|
||||
// Polling
|
||||
while(SDL_PollEvent(&event)){
|
||||
switch(event.type){
|
||||
case SDL_QUIT:
|
||||
running = false;
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
Engine::mousePos = Vector2(event.motion.x, event.motion.y);
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
if(event.button.button == SDL_BUTTON_LEFT){
|
||||
clicking = 1;
|
||||
}
|
||||
else if(event.button.button == SDL_BUTTON_RIGHT){
|
||||
clicking = 2;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
clicking = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate deltaTime
|
||||
Uint32 now = SDL_GetTicks();
|
||||
Engine::deltaTime = (now - last) / 1000.0f;
|
||||
last = now;
|
||||
}
|
||||
|
||||
void Engine::Clear(){
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 0,0,0, 1);
|
||||
SDL_RenderClear(Engine::renderer);
|
||||
}
|
||||
void Engine::Display(){
|
||||
SDL_RenderPresent(Engine::renderer);
|
||||
}
|
||||
|
||||
void Engine::Delete(){
|
||||
SDL_DestroyRenderer(Engine::renderer);
|
||||
SDL_DestroyWindow(window);
|
||||
SDL_Quit();
|
||||
}
|
26
source/engine/vectors.cpp
Normal file
26
source/engine/vectors.cpp
Normal file
|
@ -0,0 +1,26 @@
|
|||
// Header
|
||||
#include <engine/vectors.h>
|
||||
|
||||
// Constructor
|
||||
Vector2::Vector2(){
|
||||
x = 0;
|
||||
y = 0;
|
||||
}
|
||||
Vector2::Vector2(float x, float y){
|
||||
this->x = x;
|
||||
this->y = y;
|
||||
}
|
||||
|
||||
// Operations
|
||||
Vector2 Vector2::operator+(Vector2 b){
|
||||
return Vector2(x + b.x, y + b.y);
|
||||
}
|
||||
Vector2 Vector2::operator*(float b){
|
||||
return Vector2(x * b, y * b);
|
||||
}
|
||||
void Vector2::operator+=(Vector2 b){
|
||||
x += b.x; y += b.y;
|
||||
}
|
||||
void Vector2::operator*=(float b){
|
||||
x *= b; y *= b;
|
||||
}
|
38
source/game/message.cpp
Normal file
38
source/game/message.cpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
// Header
|
||||
#include <game/message.h>
|
||||
|
||||
// Constructors
|
||||
Message::Message(const char* msg){
|
||||
// Loading fonts
|
||||
TTF_Font* font = TTF_OpenFont("data/fonts/font.ttf", 64);
|
||||
if(font == NULL){
|
||||
throw("Failed to load font.\n");
|
||||
}
|
||||
|
||||
// Surface to texture
|
||||
SDL_Surface* surf = TTF_RenderText_Blended(font, msg, {255,255,255});
|
||||
texture = SDL_CreateTextureFromSurface(Engine::renderer, surf);
|
||||
|
||||
// Variables
|
||||
this->x = (SCR_WIDTH/2) - (surf->w / 2);
|
||||
this->y = (SCR_HEIGHT/2) - (surf->h / 2);
|
||||
this->w = surf->w;
|
||||
this->h = surf->h;
|
||||
|
||||
// Cleanup
|
||||
SDL_FreeSurface(surf);
|
||||
}
|
||||
|
||||
// Functions
|
||||
void Message::Update(){
|
||||
|
||||
}
|
||||
void Message::Draw(){
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
|
||||
SDL_Rect rect;
|
||||
rect.x = x; rect.y = y;
|
||||
rect.w = w; rect.h = h;
|
||||
|
||||
SDL_RenderCopy(Engine::renderer, texture, NULL, &rect);
|
||||
}
|
359
source/game/navbar.cpp
Normal file
359
source/game/navbar.cpp
Normal file
|
@ -0,0 +1,359 @@
|
|||
// Header
|
||||
#include <game/navbar.h>
|
||||
|
||||
// Constructor
|
||||
Navbar::Navbar(Tilemap* tilemap){
|
||||
// Setting variables
|
||||
this->tilemap = tilemap;
|
||||
didClick = false;
|
||||
|
||||
// Getting texture
|
||||
SDL_Surface* surf = IMG_Load("data/sprites/glyph.png");
|
||||
if(surf == NULL){
|
||||
throw("Failed to load Glyph surface.\n");
|
||||
}
|
||||
|
||||
texture = SDL_CreateTextureFromSurface(Engine::renderer, surf);
|
||||
SDL_FreeSurface(surf);
|
||||
}
|
||||
|
||||
// Functions
|
||||
/// Private
|
||||
void Navbar::_drawBackground(){
|
||||
// Making a rect for the top
|
||||
SDL_Rect rect;
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.w = SCR_WIDTH;
|
||||
rect.h = SCR_H_BUFFER;
|
||||
|
||||
// Color
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 190,190,190, 1);
|
||||
SDL_RenderFillRect(Engine::renderer, &rect);
|
||||
}
|
||||
void Navbar::_drawFlagCounter(){
|
||||
if(tilemap->flags < 10){
|
||||
// Positional rect
|
||||
SDL_Rect rect;
|
||||
rect.x = SCR_WIDTH / 10;
|
||||
rect.y = 0;
|
||||
rect.w = 50; rect.h = 50;
|
||||
|
||||
// Frame
|
||||
SDL_Rect frame;
|
||||
frame.x = 0; frame.y = 0;
|
||||
frame.w = 16; frame.h = 16;
|
||||
|
||||
// What number?
|
||||
switch(tilemap->flags){
|
||||
case 0:
|
||||
frame.x = 0;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 1:
|
||||
frame.x = 1;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 2:
|
||||
frame.x = 2;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 3:
|
||||
frame.x = 3;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 4:
|
||||
frame.x = 4;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 5:
|
||||
frame.x = 0;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 6:
|
||||
frame.x = 1;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 7:
|
||||
frame.x = 2;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 8:
|
||||
frame.x = 3;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 9:
|
||||
frame.x = 4;
|
||||
frame.y = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
// Scaling to size
|
||||
frame.x *= 16;
|
||||
frame.y *= 16;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame, &rect);
|
||||
}
|
||||
else{
|
||||
// Positional rect
|
||||
SDL_Rect rect;
|
||||
rect.x = SCR_WIDTH / 10;
|
||||
rect.y = 0;
|
||||
rect.w = 50; rect.h = 50;
|
||||
|
||||
// Frame
|
||||
SDL_Rect frame;
|
||||
frame.x = 0; frame.y = 0;
|
||||
frame.w = 16; frame.h = 16;
|
||||
|
||||
Vector2 fPos = _getNumber(tilemap->flags%10);
|
||||
frame.x = fPos.x;
|
||||
frame.y = fPos.y;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame, &rect);
|
||||
|
||||
// The second one
|
||||
rect.x -= 50;
|
||||
|
||||
fPos = _getNumber((tilemap->flags / 10)%10);
|
||||
frame.x = fPos.x;
|
||||
frame.y = fPos.y;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame, &rect);
|
||||
}
|
||||
}
|
||||
void Navbar::_drawFace(){
|
||||
// Shapes
|
||||
SDL_Rect rect;
|
||||
SDL_Rect frame;
|
||||
|
||||
rect.x = (SCR_WIDTH / 2) - (25);
|
||||
rect.y = 0;
|
||||
rect.w = 50; rect.h = 50;
|
||||
|
||||
frame.w = 16;
|
||||
frame.h = 16;
|
||||
|
||||
// This face is gonna be weird to draw..
|
||||
if(Engine::clicking){
|
||||
// Anxious face
|
||||
frame.x = 1;
|
||||
frame.y = 2;
|
||||
}
|
||||
else if(!tilemap->playing && !tilemap->win){
|
||||
// Sad face
|
||||
frame.x = 2;
|
||||
frame.y = 2;
|
||||
}
|
||||
else{
|
||||
// Happy face
|
||||
frame.x = 0;
|
||||
frame.y = 2;
|
||||
}
|
||||
|
||||
// Scaling to size
|
||||
frame.x *= 16;
|
||||
frame.y *= 16;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame, &rect);
|
||||
}
|
||||
void Navbar::_drawTime(){
|
||||
if(tilemap->gameTime < 10){
|
||||
// Positional rect
|
||||
SDL_Rect rect;
|
||||
rect.x = SCR_WIDTH / 1.2f;
|
||||
rect.y = 0;
|
||||
rect.w = 50; rect.h = 50;
|
||||
|
||||
// Frame
|
||||
SDL_Rect frame;
|
||||
frame.x = 0; frame.y = 0;
|
||||
frame.w = 16; frame.h = 16;
|
||||
|
||||
// What number?
|
||||
switch(tilemap->gameTime){
|
||||
case 0:
|
||||
frame.x = 0;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 1:
|
||||
frame.x = 1;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 2:
|
||||
frame.x = 2;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 3:
|
||||
frame.x = 3;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 4:
|
||||
frame.x = 4;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 5:
|
||||
frame.x = 0;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 6:
|
||||
frame.x = 1;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 7:
|
||||
frame.x = 2;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 8:
|
||||
frame.x = 3;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 9:
|
||||
frame.x = 4;
|
||||
frame.y = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
// Scaling to size
|
||||
frame.x *= 16;
|
||||
frame.y *= 16;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame, &rect);
|
||||
}
|
||||
else{
|
||||
// Positional rect
|
||||
SDL_Rect rect;
|
||||
rect.x = SCR_WIDTH / 1.2f;
|
||||
rect.y = 0;
|
||||
rect.w = 50; rect.h = 50;
|
||||
|
||||
// Frame
|
||||
SDL_Rect frame;
|
||||
frame.x = 0; frame.y = 0;
|
||||
frame.w = 16; frame.h = 16;
|
||||
|
||||
Vector2 fPos = _getNumber(tilemap->gameTime%10);
|
||||
frame.x = fPos.x;
|
||||
frame.y = fPos.y;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame, &rect);
|
||||
|
||||
// The second one
|
||||
rect.x -= 50;
|
||||
|
||||
fPos = _getNumber((tilemap->gameTime / 10)%10);
|
||||
frame.x = fPos.x;
|
||||
frame.y = fPos.y;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255,255,255, 1);
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame, &rect);
|
||||
}
|
||||
}
|
||||
Vector2 Navbar::_getNumber(int number){
|
||||
// Result
|
||||
Vector2 frame(0,0);
|
||||
|
||||
// What number?
|
||||
switch(number){
|
||||
case 0:
|
||||
frame.x = 0;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 1:
|
||||
frame.x = 1;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 2:
|
||||
frame.x = 2;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 3:
|
||||
frame.x = 3;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 4:
|
||||
frame.x = 4;
|
||||
frame.y = 0;
|
||||
break;
|
||||
case 5:
|
||||
frame.x = 0;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 6:
|
||||
frame.x = 1;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 7:
|
||||
frame.x = 2;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 8:
|
||||
frame.x = 3;
|
||||
frame.y = 1;
|
||||
break;
|
||||
case 9:
|
||||
frame.x = 4;
|
||||
frame.y = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
// Scaling to size
|
||||
frame.x *= 16;
|
||||
frame.y *= 16;
|
||||
|
||||
// Return result
|
||||
return frame;
|
||||
}
|
||||
/// Public
|
||||
void Navbar::Update(){
|
||||
// Did we click on the face?
|
||||
if(Engine::clicking
|
||||
&& !didClick){
|
||||
// Clicking!
|
||||
didClick = true;
|
||||
|
||||
// Getting the mouse position
|
||||
Vector2 mPos = Engine::mousePos;
|
||||
|
||||
// Constant
|
||||
const int mid_w = SCR_WIDTH / 2;
|
||||
|
||||
// Face clicking?
|
||||
if(mPos.x >= mid_w - 50
|
||||
&& mPos.x <= mid_w + 50
|
||||
&& mPos.y <= SCR_H_BUFFER){
|
||||
// Restart game
|
||||
tilemap->Reset();
|
||||
}
|
||||
}
|
||||
if(!Engine::clicking){
|
||||
didClick = false;
|
||||
}
|
||||
}
|
||||
void Navbar::Draw(){
|
||||
// Drawing stuff in order
|
||||
/// Background
|
||||
_drawBackground();
|
||||
|
||||
/// Flags counter
|
||||
_drawFlagCounter();
|
||||
|
||||
/// Smiley face
|
||||
_drawFace();
|
||||
|
||||
/// Time
|
||||
_drawTime();
|
||||
}
|
453
source/game/tilemap.cpp
Normal file
453
source/game/tilemap.cpp
Normal file
|
@ -0,0 +1,453 @@
|
|||
// Header
|
||||
#include <game/tilemap.h>
|
||||
|
||||
// Constructors
|
||||
Tilemap::Tilemap(){
|
||||
_init();
|
||||
}
|
||||
|
||||
// Functions
|
||||
/// Private
|
||||
void Tilemap::_init(){
|
||||
// Reset all of our grids
|
||||
grid_bomb.clear();
|
||||
grid_flag.clear();
|
||||
grid_show.clear();
|
||||
|
||||
// Adding all tiles to the map
|
||||
for(int y = 0; y < GRID_H; y++){
|
||||
for(int x = 0; x < GRID_W; x++){
|
||||
grid_bomb.push_back(0);
|
||||
grid_flag.push_back(0);
|
||||
grid_show.push_back(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Loading texture
|
||||
SDL_Surface* surf = IMG_Load("data/sprites/tileset.png");
|
||||
if(surf == NULL){
|
||||
printf("ERROR: %s\n", IMG_GetError());
|
||||
throw("Failed to load tiles.\n");
|
||||
}
|
||||
|
||||
texture = SDL_CreateTextureFromSurface(Engine::renderer, surf);
|
||||
SDL_FreeSurface(surf);
|
||||
|
||||
// Variables
|
||||
playing = true;
|
||||
flags = GRID_B;
|
||||
savedClick = 0;
|
||||
didClick = true;
|
||||
cascading = false;
|
||||
win = true;
|
||||
gameTime = 0;
|
||||
timepassed = 0;
|
||||
gameBegan = false;
|
||||
}
|
||||
void Tilemap::createGrid(Vector2 mousePos){
|
||||
for(int i = 0; i < GRID_B; i++){
|
||||
// Completly random number
|
||||
srand(time(NULL));
|
||||
|
||||
// Placeholder position
|
||||
Vector2 _bombPos = Vector2(0,0);
|
||||
|
||||
// Loop!
|
||||
while(true){
|
||||
_bombPos = Vector2(
|
||||
floor(rand() % GRID_W),
|
||||
floor(rand() % GRID_H)
|
||||
);
|
||||
|
||||
if(!grid_bomb[_bombPos.y*GRID_H+_bombPos.x]
|
||||
&& _bombPos.x != mousePos.x
|
||||
&& _bombPos.y != mousePos.y){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply position
|
||||
grid_bomb[_bombPos.y*GRID_H+_bombPos.x] = 1;
|
||||
}
|
||||
|
||||
gameBegan = true;
|
||||
}
|
||||
int Tilemap::getSurrounding(Vector2 tilePos){
|
||||
// Result
|
||||
int result = 0;
|
||||
|
||||
// Finding surrounding tiles
|
||||
for(int y = -1; y < 2; y++){
|
||||
for(int x = -1; x < 2; x++){
|
||||
// Out of bounds?
|
||||
if(tilePos.x + x < 0
|
||||
|| tilePos.x + x >= GRID_W
|
||||
|| tilePos.y + y < 0
|
||||
|| tilePos.y + y >= GRID_H){
|
||||
continue;
|
||||
}
|
||||
|
||||
// Otherwise good to go!
|
||||
result += grid_bomb[(y+tilePos.y)*GRID_H+(x+tilePos.x)];
|
||||
}
|
||||
}
|
||||
|
||||
// Return result
|
||||
return result;
|
||||
}
|
||||
void Tilemap::revealTiles(Vector2 mousePos){
|
||||
// What's the mouse position
|
||||
int _gridPos = mousePos.y*GRID_H+mousePos.x;
|
||||
printf("Grid Position: %i\n", _gridPos); // Debug
|
||||
|
||||
// Was it a flag?
|
||||
if(grid_flag[_gridPos]) {return;}
|
||||
|
||||
// Setting the grid position to VISIBLE
|
||||
grid_show[_gridPos] = 1;
|
||||
|
||||
// Rippling
|
||||
cascading = true;
|
||||
while(cascading){
|
||||
spawnCascade(mousePos);
|
||||
}
|
||||
|
||||
// Clicked on a bomb?
|
||||
// TODO: Add game over functionality
|
||||
if(grid_bomb[_gridPos]){
|
||||
win = false;
|
||||
playing = false;
|
||||
}
|
||||
}
|
||||
void Tilemap::spawnCascade(Vector2 position){
|
||||
// For clicking on a tile with a bomb next to it,
|
||||
// it gets annoying when it clears everything
|
||||
// when you're trying to click on a tile right next
|
||||
// to the bomb.
|
||||
if(getSurrounding(position) != 0){
|
||||
cascading = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Checking if there is a bomb near the current tile
|
||||
// And duplication
|
||||
for(int y = -1; y < 2; y++){
|
||||
for(int x = -1; x < 2; x++){
|
||||
// Checking for failure cases
|
||||
if(x == 0 && y == 0){
|
||||
// Center
|
||||
continue;
|
||||
}
|
||||
if(x + position.x < 0 || x + position.x > GRID_W
|
||||
|| y + position.y < 0 || y + position.y > GRID_H){
|
||||
// Out of bounds
|
||||
continue;
|
||||
}
|
||||
|
||||
// Diagonal
|
||||
if(x == -1 && y == -1
|
||||
&& x == -1 && y == +1
|
||||
&& x == +1 && y == +1
|
||||
&& x == +1 && y == -1){
|
||||
continue;
|
||||
}
|
||||
|
||||
// Flag near?
|
||||
if(grid_flag[(position.y+y)*GRID_W+(position.x+x)]){
|
||||
continue;
|
||||
}
|
||||
|
||||
// Bombs near?
|
||||
if(getSurrounding(position + Vector2(x,y)) != 0){
|
||||
grid_show[(position.y+y)*GRID_W+(position.x+x)] = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Duplication
|
||||
if(!grid_show[(position.y+y)*GRID_W+(position.x+x)]
|
||||
&& !grid_bomb[(position.y+y)*GRID_W+(position.x+x)]){
|
||||
grid_show[(position.y+y)*GRID_W+(position.x+x)] = 1;
|
||||
spawnCascade(Vector2(position.x + x, position.y + y));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Checking for a failure
|
||||
for(int y = -1; y < 2; y++){
|
||||
for(int x = -1; x < 2; x++){
|
||||
// Checking for failure cases
|
||||
if(x == 0 && y == 0){
|
||||
// Center
|
||||
continue;
|
||||
}
|
||||
if(x + position.x < 0 || x + position.x > GRID_W
|
||||
|| y + position.y < 0 || y + position.y > GRID_H){
|
||||
// Out of bounds
|
||||
continue;
|
||||
}
|
||||
|
||||
// Checking if there is a space that needs to be filled
|
||||
if(!grid_show[(position.y+y)*GRID_W+(position.x+x)]
|
||||
&& !grid_bomb[(position.y+y)*GRID_W+(position.x+x)]){
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Failing
|
||||
cascading = false;
|
||||
}
|
||||
void Tilemap::_leftClick(){
|
||||
// Convert mouse position into local grid position
|
||||
Vector2 _mGridPos = Vector2(
|
||||
floor(Engine::mousePos.x / (SCR_WIDTH / GRID_W)),
|
||||
floor(
|
||||
(Engine::mousePos.y + SCR_H_BUFFER) / ((SCR_HEIGHT - SCR_H_BUFFER) / GRID_H))
|
||||
- ((SCR_H_BUFFER / ((SCR_HEIGHT - SCR_H_BUFFER) / GRID_H)) + 2)
|
||||
);
|
||||
|
||||
// Do we need a new grid?
|
||||
int _totalBombs = 0;
|
||||
for(int i = 0; i < grid_bomb.size(); i++){
|
||||
_totalBombs += grid_bomb[i];
|
||||
}
|
||||
|
||||
if(_totalBombs == 0){
|
||||
createGrid(_mGridPos);
|
||||
}
|
||||
|
||||
// Reveal the tiles!
|
||||
revealTiles(_mGridPos);
|
||||
}
|
||||
void Tilemap::_rightClick(){
|
||||
// Convert mouse position into local grid position
|
||||
Vector2 _mGridPos = Vector2(
|
||||
floor(Engine::mousePos.x / (SCR_WIDTH / GRID_W)),
|
||||
floor(
|
||||
(Engine::mousePos.y + SCR_H_BUFFER) / ((SCR_HEIGHT - SCR_H_BUFFER) / GRID_H))
|
||||
- ((SCR_H_BUFFER / ((SCR_HEIGHT - SCR_H_BUFFER) / GRID_H)) + 2)
|
||||
);
|
||||
int _gridPos = _mGridPos.y*GRID_H+_mGridPos.x;
|
||||
|
||||
// Are we clicking on an existing tile?
|
||||
if(grid_show[_gridPos]) {return;}
|
||||
|
||||
// Do we want to add or remove?
|
||||
if(grid_flag[_gridPos]){
|
||||
// Remove
|
||||
flags++;
|
||||
grid_flag[_gridPos] = 0;
|
||||
}
|
||||
else{
|
||||
// Add
|
||||
if(flags <= 0) {return;}
|
||||
flags--;
|
||||
grid_flag[_gridPos] = 1;
|
||||
}
|
||||
}
|
||||
void Tilemap::winDetection(){
|
||||
// How many bombs are there, and do they match
|
||||
// Up with our flag positions?
|
||||
int _matchedBombs = 0;
|
||||
|
||||
for(int y = 0; y < GRID_H; y++){
|
||||
for(int x = 0; x < GRID_W; x++){
|
||||
if(grid_bomb[y*GRID_H+x]
|
||||
&& grid_flag[y*GRID_H+x]){
|
||||
_matchedBombs++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Matched bombs == Bombs?
|
||||
if(_matchedBombs == GRID_B){
|
||||
playing = false;
|
||||
win = true;
|
||||
}
|
||||
}
|
||||
void Tilemap::clickDetection(){
|
||||
// Are we even playing?
|
||||
if(!playing) {return;}
|
||||
|
||||
// Left clicking
|
||||
if(!didClick
|
||||
&& Engine::clicking == 1){
|
||||
// One click at a time!
|
||||
savedClick = 1;
|
||||
didClick = true;
|
||||
}
|
||||
// Right clicking
|
||||
else if(!didClick
|
||||
&& Engine::clicking == 2){
|
||||
// One click at a time!
|
||||
savedClick = 2;
|
||||
didClick = true;
|
||||
|
||||
// Right click
|
||||
_rightClick();
|
||||
}
|
||||
// Allow new click (LEFT)
|
||||
else if(didClick
|
||||
&& savedClick == 1
|
||||
&& Engine::clicking == 0){
|
||||
// Allow new click
|
||||
didClick = false;
|
||||
|
||||
// Left click
|
||||
_leftClick();
|
||||
|
||||
savedClick = 0;
|
||||
}
|
||||
else if(didClick
|
||||
&& Engine::clicking == 0){
|
||||
didClick = false;
|
||||
savedClick = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// Public
|
||||
void Tilemap::Update(){
|
||||
// Win detection
|
||||
winDetection();
|
||||
|
||||
// Click detection
|
||||
clickDetection();
|
||||
|
||||
// Time passing
|
||||
if(gameBegan
|
||||
&& playing){
|
||||
if(timepassed >= 1.0f){
|
||||
timepassed = 0;
|
||||
gameTime++;
|
||||
|
||||
if(gameTime > 99) {gameTime = 99;}
|
||||
}
|
||||
else{
|
||||
timepassed += (float)Engine::deltaTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
void Tilemap::Draw(){
|
||||
// Getting sizes
|
||||
int tileWidth = (int)(SCR_WIDTH / GRID_W);
|
||||
int tileHeight = (int)((SCR_HEIGHT - SCR_H_BUFFER) / GRID_H);
|
||||
|
||||
// Going through all tiles
|
||||
for(int y = 0; y < GRID_H; y++){
|
||||
for(int x = 0; x < GRID_W; x++){
|
||||
// Global Tile
|
||||
SDL_Rect rect;
|
||||
|
||||
rect.x = x * tileWidth;
|
||||
rect.y = (y * tileHeight) + SCR_H_BUFFER;
|
||||
|
||||
rect.w = tileWidth;
|
||||
rect.h = tileHeight;
|
||||
|
||||
// Frame
|
||||
SDL_Rect frame_rect;
|
||||
frame_rect.w = 16;
|
||||
frame_rect.h = 16;
|
||||
|
||||
int frame = 0;
|
||||
|
||||
// Shown tile, not a bomb
|
||||
if(!playing
|
||||
&& grid_bomb[y*GRID_H+x]){
|
||||
frame = 2;
|
||||
}
|
||||
else if(grid_show[y*GRID_W+x]
|
||||
&& !grid_bomb[y*GRID_H+x]){
|
||||
frame = 0;
|
||||
}
|
||||
else if(grid_flag[y*GRID_H+x]){
|
||||
frame = 1;
|
||||
}
|
||||
else{
|
||||
frame = 3;
|
||||
}
|
||||
|
||||
// Setting frame rect
|
||||
switch(frame){
|
||||
case 0:
|
||||
switch(getSurrounding(Vector2(x,y))){
|
||||
case 0:
|
||||
frame_rect.x = 3;
|
||||
frame_rect.y = 0;
|
||||
break;
|
||||
case 1:
|
||||
frame_rect.x = 0;
|
||||
frame_rect.y = 1;
|
||||
break;
|
||||
case 2:
|
||||
frame_rect.x = 1;
|
||||
frame_rect.y = 1;
|
||||
break;
|
||||
case 3:
|
||||
frame_rect.x = 2;
|
||||
frame_rect.y = 1;
|
||||
break;
|
||||
case 4:
|
||||
frame_rect.x = 3;
|
||||
frame_rect.y = 1;
|
||||
break;
|
||||
case 5:
|
||||
frame_rect.x = 0;
|
||||
frame_rect.y = 2;
|
||||
break;
|
||||
case 6:
|
||||
frame_rect.x = 1;
|
||||
frame_rect.y = 2;
|
||||
break;
|
||||
case 7:
|
||||
frame_rect.x = 2;
|
||||
frame_rect.y = 2;
|
||||
break;
|
||||
case 8:
|
||||
frame_rect.x = 3;
|
||||
frame_rect.y = 2;
|
||||
break;
|
||||
default:
|
||||
printf("Something went very wrong while checking for SURROUNDING.\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
frame_rect.x = 1;
|
||||
frame_rect.y = 0;
|
||||
break;
|
||||
case 2:
|
||||
frame_rect.x = 2;
|
||||
frame_rect.y = 0;
|
||||
break;
|
||||
case 3:
|
||||
frame_rect.x = 0;
|
||||
frame_rect.y = 0;
|
||||
break;
|
||||
default:
|
||||
printf("TILESET RENDERING ERROR.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
// Multiplying
|
||||
frame_rect.x *= 16;
|
||||
frame_rect.y *= 16;
|
||||
|
||||
// Drawing
|
||||
SDL_SetRenderDrawColor(Engine::renderer, 255, 255,255, 1);
|
||||
SDL_RenderFillRect(Engine::renderer, &rect);
|
||||
|
||||
SDL_RenderCopy(Engine::renderer, texture, &frame_rect, &rect);
|
||||
}
|
||||
}
|
||||
|
||||
// DEBUG
|
||||
}
|
||||
|
||||
void Tilemap::Reset(){
|
||||
// Resetting the game! (VERY DIFFICULT)
|
||||
printf("Reset.\n");
|
||||
|
||||
// Reset!
|
||||
_init();
|
||||
}
|
60
source/main.cpp
Normal file
60
source/main.cpp
Normal file
|
@ -0,0 +1,60 @@
|
|||
// For windows
|
||||
#define SDL_MAIN_HANDLED
|
||||
|
||||
// Includes
|
||||
/// External
|
||||
#include <engine/externals.h>
|
||||
/// Engine
|
||||
#include <engine/engine.h>
|
||||
/// Game
|
||||
#include <game/tilemap.h>
|
||||
#include <game/navbar.h>
|
||||
#include <game/message.h>
|
||||
|
||||
// Entry Point
|
||||
int main(int argc, char* argv[]){
|
||||
// Creating an engine
|
||||
Engine engine = Engine();
|
||||
Tilemap tilemap = Tilemap();
|
||||
Navbar navbar = Navbar(&tilemap);
|
||||
|
||||
// Messages
|
||||
Message gameOver("Game Over!");
|
||||
Message youWin("You Win!");
|
||||
|
||||
// Game loop
|
||||
while(engine.running){
|
||||
// Update
|
||||
engine.Update();
|
||||
|
||||
// Clear
|
||||
engine.Clear();
|
||||
|
||||
// Game code..
|
||||
tilemap.Update();
|
||||
navbar.Update();
|
||||
|
||||
// Render code..
|
||||
tilemap.Draw();
|
||||
navbar.Draw();
|
||||
|
||||
/// Messages?
|
||||
if(!tilemap.playing){
|
||||
if(tilemap.win){
|
||||
youWin.Draw();
|
||||
}
|
||||
else{
|
||||
gameOver.Draw();
|
||||
}
|
||||
}
|
||||
|
||||
// Displaying
|
||||
engine.Display();
|
||||
}
|
||||
|
||||
// Cleanup
|
||||
engine.Delete();
|
||||
|
||||
// Quit app
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue