(20111215) 12:00
This commit is contained in:
167
GameLib.c
167
GameLib.c
@@ -1,11 +1,23 @@
|
||||
#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
|
||||
@@ -23,4 +35,159 @@ int GameLib_Init(int w,int h,char *title,int fps){
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////
|
||||
// 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user