Ragazzi, stò creando un piccolissimo engine per un giochino 2D, ho iniziato a introdurre le funzioni basilari che serviranno per il giochino:
Engine.h:
codice:
#ifndef _ENGINE_H
#define _ENGINE_H
#include <stdio.h>
#include <stdlib.h>
#define TICKGAME 1000 // FPS ( Frame Per Second )
typedef void (*GAMELOOP)(void);
typedef void (*RENDERFRAME)(void);
typedef void (*PROCESSINPUT)(void);
typedef void (*UPDATE)(void);
typedef struct _engine
{
int TickGame;
GAMELOOP GameLoop;
RENDERFRAME RenderFrame;
PROCESSINPUT ProcessInput;
UPDATE Update;
} ENGINE;
ENGINE* Init();
void GameLoop(); // Main Game Loop
void RenderFrame(); // Renderizza un frame
void ProcessInput(); // Processa l'input dell'utente
void Update(); // Aggiorna tutti i componenti interni dell'Engine
#endif
Engine.c
codice:
#include "Engine.h"
ENGINE* Init() {
ENGINE *engine = malloc(sizeof(ENGINE));
engine->GameLoop = &GameLoop;
engine->RenderFrame = &RenderFrame;
engine->ProcessInput = &ProcessInput;
engine->Update = &Update;
return engine;
}
void GameLoop()
{
int TickGameBefore, TickGameAfter;
// Clock attuale
TickGameBefore = clock();
do {
// Clock all'inizio del gameloop
TickGameAfter = clock();
// Se sono passati TICKGAME( millisecondi ) allora eseguo il tick di gioco
if (TickGameAfter - TickGameBefore > TICKGAME)
{
ProcessInput();
Update();
RenderFrame();
// Clock alla fine di un tick di gioco
TickGameBefore = TickGameAfter;
}
} while (1); // Continuo fino a quando non clicco ESC
}
void RenderFrame()
{
printf("RenderFrame Function\n");
}
void ProcessInput()
{
printf("ProcessInput Function\n");
}
void Update()
{
printf("Update Function\n");
}
main.c
codice:
#include "Console.h"
#include "Engine.h"
int main()
{
printf("Benvenuti nel gioco\n");
printf("***********************\n\n");
ENGINE *engine = Init();
engine->GameLoop();
return 0;
}
Ora mi è sorto un dubbio:
Le funzioni che sono all'interno del GameLoop, cioè "ProcessInput", "Update" e "RenderFrame", a loro volta cosa faranno precisamente? Per intenderci. Ora vorrei fare in modo che quando clicco "ESC", devo uscire dal gameloop e quindi terminare il gioco, questa cosa va gestita all'interno della funzione ProcessInput?
premetto che in "Console.c", ho un metodo LeggiTasto che è il seguente:
codice:
int LeggiTasto
( int Wait // Input: attesa massima in millesimi di secondo
) // -1 attesa infinita; 0 non attende
{ int Prima, Dopo,
Tasto = 0;
Prima = clock(); // lettura in millesimi di secondo
if (Wait<0) Wait = 0x7FFFFFFF; // circa 25 giorni
do Dopo = clock(); while (Dopo-Prima<Wait && !_kbhit());
if (_kbhit())
{ Tasto = _getch();
if (Tasto == 0 || Tasto == 224) Tasto = _getch() + 256;
}
return ( Tasto );
}
Io credo che l'input debba essere qualcosa di globale nel gioco, non credete?
In definitiva chiedo, come mi consigliate di gestire l'input ?