Optimize redrawing, define keys separately

This commit is contained in:
octospacc 2022-08-03 13:55:40 +02:00
parent 53239c3dde
commit 374cc9fa9a
4 changed files with 59 additions and 31 deletions

View File

@ -6,8 +6,9 @@ BloccSpacc is a portable isometric voxel sandbox game, mainly focused on buildin
- [x] Breaking/placing blocks - [x] Breaking/placing blocks
- [ ] View mode / Edit mode - [ ] View mode / Edit mode
- [ ] Moving cursor in all 3 axis - [x] Moving cursor in all 3 axis (camera needs a fix to keep the cursor centered when it moves on Y)
- [ ] Rotating view - [ ] Rotating view
- [ ] HUD for selected blocks, view options, ...
- [ ] Inventory - [ ] Inventory
- [ ] "Layer view" (showing and moving only on 2 axis at a time, hiding other layers) for complex buildings - [ ] "Layer view" (showing and moving only on 2 axis at a time, hiding other layers) for complex buildings
- [ ] Saving+Loading maps - [ ] Saving+Loading maps
@ -15,6 +16,7 @@ BloccSpacc is a portable isometric voxel sandbox game, mainly focused on buildin
- [ ] Water+Lava physics - [ ] Water+Lava physics
- [ ] Random terrain generation - [ ] Random terrain generation
- [ ] Day/Night cycle - [ ] Day/Night cycle
- [ ] Lighting
- [ ] Infinite maps (?) - [ ] Infinite maps (?)
- [ ] Sounds - [ ] Sounds
- [ ] Screenshots - [ ] Screenshots

18
Source/Keys.h Normal file
View File

@ -0,0 +1,18 @@
#pragma once
#define KeyEsc SDLK_ESCAPE
#define KeyDebug SDLK_F3
#define KeyGenFlatMap SDLK_F6
#define KeyGenNoiseMap SDLK_F7
#define KeyUp SDLK_UP
#define KeyDown SDLK_DOWN
#define KeyLeft SDLK_LEFT
#define KeyRight SDLK_RIGHT
#define KeyAbove SDLK_LSHIFT
#define KeyBelow SDLK_LCTRL
#define KeyPlace SDLK_z
#define KeyBreak SDLK_x

View File

@ -5,13 +5,14 @@
#include "SDL/SDL_image.h" #include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h" #include "SDL/SDL_ttf.h"
#include "Blocks.h" #include "Blocks.h"
#include "Keys.h"
#include "Util.h" #include "Util.h"
#define AppName "BloccSpacc" #define AppName "BloccSpacc"
#define ScreenBits 16 #define ScreenBits 16
int ScreenWidth = 320; int ScreenWidth = 512;
int ScreenHeight = 320; int ScreenHeight = 512;
SDL_Surface * Screen = NULL; SDL_Surface * Screen = NULL;
SDL_Event Event; SDL_Event Event;
@ -26,7 +27,7 @@ SDL_Surface * DebugMsg = NULL;
TTF_Font * DebugFont = NULL; TTF_Font * DebugFont = NULL;
SDL_Color DebugTextColor = { 80, 80, 80 }; SDL_Color DebugTextColor = { 80, 80, 80 };
bool Quit, DebugMode; bool Quit, Redraw, DebugMode;
struct UsedKeys { struct UsedKeys {
bool Up, Down, Left, Right, Above, Below; bool Up, Down, Left, Right, Above, Below;
@ -36,7 +37,7 @@ struct UsedKeys {
struct xyz CursorPos, Camera, ChunksNum; struct xyz CursorPos, Camera, ChunksNum;
// TODO: Proper map memory management lol // TODO: Proper map memory management lol
int BlocksNum = ChunkSize*ChunkSize*ChunkSize; // ChunkSize * ChunksNum.z * ChunksNum.y * ChunksNum.x; int BlocksNum = ChunkSize*ChunkSize*ChunkSize;
int Map[ChunkSize][ChunkSize][ChunkSize] = {}; int Map[ChunkSize][ChunkSize][ChunkSize] = {};
struct xyz GetBlocksOnScreenNum() { struct xyz GetBlocksOnScreenNum() {
@ -142,14 +143,14 @@ void EventHandle() {
UsedKeys.Break = false; UsedKeys.Break = false;
} }
void DrawMap( struct xyz ChunksNum ) { void DrawMap( struct xyz ChunksNum ) { // TODO: Reoptimize this to draw only visible blocks
for ( int y = 0; y < ChunksNum.y; y++ ) { for ( int y = 0; y < ChunksNum.y; y++ ) {
for ( int z = 0; z < ChunksNum.z; z++ ) { for ( int z = 0; z < ChunksNum.z; z++ ) {
for ( int x = 0; x < ChunksNum.x; x++ ) { for ( int x = 0; x < ChunksNum.x; x++ ) {
struct xyz MapCoords = OrthoToIso ( x, y, z, BlockSize ); struct xyz MapCoords = OrthoToIso ( x, y, z, BlockSize );
DrawSurf( DrawSurf(
MapCoords.x - Camera.x - BlockSize/2, MapCoords.x - Camera.x - BlockSize/2,
MapCoords.z - Camera.z - y*BlockSize/2, //- Camera.y, MapCoords.z - Camera.z - y*BlockSize/2,
BlocksImg, & Blocks[Map[y][z][x]].Img, Screen BlocksImg, & Blocks[Map[y][z][x]].Img, Screen
); );
} }
@ -211,7 +212,7 @@ void SetRandomNoiseMap() {
for ( int z = 0; z < ChunksNum.z; z++ ) { for ( int z = 0; z < ChunksNum.z; z++ ) {
for ( int x = 0; x < ChunksNum.x; x++ ) { for ( int x = 0; x < ChunksNum.x; x++ ) {
int r = rand() % BlocksetNum; int r = rand() % BlocksetNum;
if ( r == 1 ) { if ( r == 1 ) { // Avoid block 1 (all white, hard to see) for testing
r = 2; r = 2;
} }
Map[y][z][x] = r; Map[y][z][x] = r;
@ -251,66 +252,74 @@ int main( int argc, char* args[] ) {
ChunksNum.z = ChunkSize; ChunksNum.z = ChunkSize;
SetRandomNoiseMap(); SetRandomNoiseMap();
CursorPos.y = BlockSize * (ChunksNum.y - 1); CursorPos.x = BlockSize * (ChunksNum.x - 1);
CursorPos.y = 0;
CursorPos.z = BlockSize * (ChunksNum.z - 1);
Redraw = true;
while ( !Quit ) { while ( !Quit ) {
while ( SDL_PollEvent( & Event ) ) { while ( SDL_PollEvent( & Event ) ) {
Redraw = true;
if ( Event.type == SDL_QUIT ) { if ( Event.type == SDL_QUIT ) {
Quit = true; Quit = true;
} }
else if ( Event.type == SDL_KEYDOWN ) { else if ( Event.type == SDL_KEYDOWN ) {
if ( Event.key.keysym.sym == SDLK_ESCAPE ) { if ( Event.key.keysym.sym == KeyEsc ) {
Quit = true; Quit = true;
} }
} }
else if ( Event.type == SDL_KEYUP ) { else if ( Event.type == SDL_KEYUP ) {
if ( Event.key.keysym.sym == SDLK_F3 ) { if ( Event.key.keysym.sym == KeyDebug ) {
DebugMode = !DebugMode; DebugMode = !DebugMode;
} }
if ( Event.key.keysym.sym == SDLK_F6 ) { if ( Event.key.keysym.sym == KeyGenFlatMap ) {
SetSuperflatMap(); SetSuperflatMap();
} }
if ( Event.key.keysym.sym == SDLK_F7 ) { if ( Event.key.keysym.sym == KeyGenNoiseMap ) {
SetRandomNoiseMap(); SetRandomNoiseMap();
} }
if ( Event.key.keysym.sym == SDLK_UP ) { if ( Event.key.keysym.sym == KeyUp ) {
UsedKeys.Up = true; UsedKeys.Up = true;
} }
if ( Event.key.keysym.sym == SDLK_RIGHT ) { if ( Event.key.keysym.sym == KeyRight ) {
UsedKeys.Right = true; UsedKeys.Right = true;
} }
if ( Event.key.keysym.sym == SDLK_DOWN ) { if ( Event.key.keysym.sym == KeyDown ) {
UsedKeys.Down = true; UsedKeys.Down = true;
} }
if ( Event.key.keysym.sym == SDLK_LEFT ) { if ( Event.key.keysym.sym == KeyLeft ) {
UsedKeys.Left = true; UsedKeys.Left = true;
} }
if ( Event.key.keysym.sym == SDLK_LSHIFT ) { if ( Event.key.keysym.sym == KeyAbove ) {
UsedKeys.Above = true; UsedKeys.Above = true;
} }
if ( Event.key.keysym.sym == SDLK_LCTRL ) { if ( Event.key.keysym.sym == KeyBelow ) {
UsedKeys.Below = true; UsedKeys.Below = true;
} }
if ( Event.key.keysym.sym == SDLK_z ) { if ( Event.key.keysym.sym == KeyPlace ) {
UsedKeys.Place = true; UsedKeys.Place = true;
} }
if ( Event.key.keysym.sym == SDLK_x ) { if ( Event.key.keysym.sym == KeyBreak ) {
UsedKeys.Break = true; UsedKeys.Break = true;
} }
} }
} }
EventHandle(); EventHandle();
SetCamera(); if ( Redraw ) {
DrawMap( ChunksNum ); SDL_FillRect( Screen, &Screen->clip_rect, SDL_MapRGB( Screen->format, 0xFF, 0xFF, 0xFF ) );
DrawCursor(); SetCamera();
if ( DebugMode ) { DrawMap( ChunksNum );
DrawDebug(); DrawCursor();
} if ( DebugMode ) {
DrawDebug();
if ( !FlipScreen( Screen ) ) { }
return 1; if ( !FlipScreen( Screen ) ) {
return 1;
}
Redraw = false;
} }
SDL_Delay( 16 ); // TODO: proper framerate management SDL_Delay( 16 ); // TODO: proper framerate management
} }

View File

@ -44,6 +44,5 @@ bool FlipScreen( SDL_Surface * Screen ) {
printf("[E] Error updating screen.\n"); printf("[E] Error updating screen.\n");
return false; return false;
} }
SDL_FillRect( Screen, &Screen->clip_rect, SDL_MapRGB( Screen->format, 0xFF, 0xFF, 0xFF ) );
return true; return true;
} }