Files
GameLib/GameLib.c
2022-01-31 05:19:01 +01:00

194 lines
3.1 KiB
C

#include <SDL/SDL.h>
#include "Time.h"
#include "Util.h"
#include "Draw.h"
#include "Input.h"
#include "Audio.h"
#include "Anim.h"
#include "Entity.h"
#include "GameLib.h"
// Globals
int _running;
Entity **_entity=NULL;
int _n_entities=0;
int _n_entities_res=0;
void (*_gameproc)()=NULL;
void (*_gamepostproc)()=NULL;
/////////////////////////////
// GameLib_Init
//
// Initializes the game.
int GameLib_Init(int w,int h,char *title,int fps){
if(!Draw_Init(w,h,title,fps)){
return(0);
}
if(!Input_Init()){
return(0);
}
Audio_Init();
return(1);
}
/////////////////////////////
// GameLib_AddEntity
//
// Adds an entity to the game.
void GameLib_AddEntity(Entity *e){
if(_n_entities>=_n_entities_res){
Entity **entity_aux;
int i;
// Grow the array
if(_n_entities_res==0)
_n_entities_res=32;
else
_n_entities_res*=2;
entity_aux=malloc(sizeof(Entity *)*_n_entities_res);
for(i=0;i<_n_entities;i++)
entity_aux[i]=_entity[i];
if(_entity)
free(_entity);
_entity=entity_aux;
}
// Add the entity
_entity[_n_entities]=e;
_n_entities++;
}
/////////////////////////////
// GameLib_UnrefEntity
//
// removes the reference to the entity.
int GameLib_UnrefEntity(Entity *e){
int i;
for(i=0;i<_n_entities;i++){
if(e==_entity[i]){
_entity[i]=NULL;
return(1);
}
}
return(0);
}
/////////////////////////////
// GameLib_DelEntity
//
// Adds an entity to the game.
int GameLib_DelEntity(Entity *e){
if(!GameLib_UnrefEntity(e)){
return(0);
}
Entity_Destroy(e);
return(1);
}
/////////////////////////////
// GameLib_ProcLoop
//
// Process the loop.
int GameLib_ProcLoop(){
int i,j;
int repeat,count;
// Launch the method
if(_gameproc){
_gameproc();
}
// Process entities
for(i=0;i<_n_entities;i++){
if(!_entity[i])
continue;
Entity_Process(_entity[i]);
}
// Process colisions between entities
count=0;
do{
repeat=0;
for(i=0;i<_n_entities-1;i++){
for(j=i+1;j<_n_entities;j++){
if(!_entity[i] || !_entity[j])
continue;
if(Entity_Collide(_entity[i],_entity[j])){
repeat=1;
}
}
}
count++;
}while(repeat && count<10);
// Stop remaining collisions
for(i=0;i<_n_entities-1;i++){
for(j=i+1;j<_n_entities;j++){
if(!_entity[i] || !_entity[j])
continue;
if(Entity_Collide(_entity[i],_entity[j])){
vec2_set(_entity[i]->vel,0,0);
vec2_set(_entity[j]->vel,0,0);
}
}
}
// PostProcess and draw entities
for(i=0;i<_n_entities;i++){
if(!_entity[i])
continue;
Entity_PostProcess(_entity[i]);
Entity_Draw(_entity[i]);
}
// Compactate
j=0;
for(i=0;i<_n_entities;i++){
if(!_entity[i])
continue;
if(i>j)
_entity[j]=_entity[i];
j++;
}
_n_entities=j;
// Launch the method
if(_gamepostproc){
_gamepostproc();
}
return(_running);
}
/////////////////////////////
// GameLib_Loop
//
// Loops the game.
void GameLib_Loop(
void (*gameproc)(),
void (*gamepostproc)())
{
_running=1;
_gameproc=gameproc;
_gamepostproc=gamepostproc;
Draw_Loop(GameLib_ProcLoop);
}
/////////////////////////////
// GameLib_BreakLoop
//
// Breaks the game loop.
void GameLib_BreakLoop(){
_running=0;
}