Entity: Gestionar algunas banderas de forma interna, sin afectar las banderas "publicas"
This commit is contained in:
@@ -12,6 +12,12 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define EntityIntFlag_UpdateLight 1
|
||||||
|
#define EntityIntFlag_UpdatedPos 2
|
||||||
|
#define EntityIntFlag_UpdatedColor 4
|
||||||
|
#define EntityIntFlag_UpdateColor 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
// Entity_New
|
// Entity_New
|
||||||
@@ -52,6 +58,7 @@ Entity Entity_New(){
|
|||||||
vec2_set(e->pos0,0.0f,0.0f);
|
vec2_set(e->pos0,0.0f,0.0f);
|
||||||
vec2_set(e->pos,0.0f,0.0f);
|
vec2_set(e->pos,0.0f,0.0f);
|
||||||
e->flags=EntityFlag_Collision|EntityFlag_Overlap;
|
e->flags=EntityFlag_Collision|EntityFlag_Overlap;
|
||||||
|
e->internalFlags=EntityIntFlag_UpdateColor;
|
||||||
e->zorder=1;
|
e->zorder=1;
|
||||||
e->sortYOffset=0;
|
e->sortYOffset=0;
|
||||||
|
|
||||||
@@ -123,6 +130,7 @@ Entity Entity_Copy(Entity e){
|
|||||||
n->type=e->type;
|
n->type=e->type;
|
||||||
vec2_set(n->pos,e->pos[0],e->pos[1]);
|
vec2_set(n->pos,e->pos[0],e->pos[1]);
|
||||||
n->flags=e->flags;
|
n->flags=e->flags;
|
||||||
|
n->internalFlags=e->internalFlags;
|
||||||
n->zorder=e->zorder;
|
n->zorder=e->zorder;
|
||||||
n->sortYOffset=e->sortYOffset;
|
n->sortYOffset=e->sortYOffset;
|
||||||
|
|
||||||
@@ -225,7 +233,7 @@ int Entity_BBoxIntersect(Entity ent1,Entity ent2){
|
|||||||
//
|
//
|
||||||
void Entity_Draw(Entity e,int x,int y,float f){
|
void Entity_Draw(Entity e,int x,int y,float f){
|
||||||
vec2 fPos;
|
vec2 fPos;
|
||||||
if(e->flags&EntityFlag_UpdatedColor){
|
if(e->internalFlags&EntityIntFlag_UpdatedColor){
|
||||||
Draw_SetColor(
|
Draw_SetColor(
|
||||||
e->color0[0]-f*(e->color0[0]-e->color[0]),
|
e->color0[0]-f*(e->color0[0]-e->color[0]),
|
||||||
e->color0[1]-f*(e->color0[1]-e->color[1]),
|
e->color0[1]-f*(e->color0[1]-e->color[1]),
|
||||||
@@ -235,7 +243,7 @@ void Entity_Draw(Entity e,int x,int y,float f){
|
|||||||
}else{
|
}else{
|
||||||
Draw_SetColor(e->color[0],e->color[1],e->color[2],e->color[3]);
|
Draw_SetColor(e->color[0],e->color[1],e->color[2],e->color[3]);
|
||||||
}
|
}
|
||||||
if(e->flags&EntityFlag_UpdatedPos){
|
if(e->internalFlags&EntityIntFlag_UpdatedPos){
|
||||||
vec2_interpol(fPos,e->pos0,e->pos,f);
|
vec2_interpol(fPos,e->pos0,e->pos,f);
|
||||||
AnimPlay_Draw(&e->anim,fPos[0]+x,fPos[1]+y);
|
AnimPlay_Draw(&e->anim,fPos[0]+x,fPos[1]+y);
|
||||||
}else{
|
}else{
|
||||||
@@ -277,7 +285,7 @@ int Entity_IsVisible(Entity e,int x,int y,int w,int h){
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
void Entity_Process(Entity b,int ft){
|
void Entity_Process(Entity b,int ft){
|
||||||
b->flags&=~EntityFlag_UpdatedPos;
|
b->internalFlags&=~EntityIntFlag_UpdatedPos;
|
||||||
|
|
||||||
// Launch method
|
// Launch method
|
||||||
if(b->proc){
|
if(b->proc){
|
||||||
@@ -299,7 +307,7 @@ void Entity_PostProcess(Entity e,int ft){
|
|||||||
e->color0[1]=e->color[1];
|
e->color0[1]=e->color[1];
|
||||||
e->color0[2]=e->color[2];
|
e->color0[2]=e->color[2];
|
||||||
e->color0[3]=e->color[3];
|
e->color0[3]=e->color[3];
|
||||||
e->flags&=~EntityFlag_UpdatedColor;
|
e->internalFlags&=~EntityIntFlag_UpdatedColor;
|
||||||
|
|
||||||
// Determine if there is movement
|
// Determine if there is movement
|
||||||
qlen=vec2_dot(e->vel,e->vel);
|
qlen=vec2_dot(e->vel,e->vel);
|
||||||
@@ -321,7 +329,7 @@ void Entity_PostProcess(Entity e,int ft){
|
|||||||
|
|
||||||
// Mark the update of the position.
|
// Mark the update of the position.
|
||||||
vec2_copy(e->oldpos,e->pos);
|
vec2_copy(e->oldpos,e->pos);
|
||||||
e->flags|=EntityFlag_UpdatedPos;
|
e->internalFlags|=EntityIntFlag_UpdatedPos;
|
||||||
|
|
||||||
Entity_CalcBBox(e);
|
Entity_CalcBBox(e);
|
||||||
}
|
}
|
||||||
@@ -776,7 +784,7 @@ void Entity_UpdatePos(Entity e,vec2 pos){
|
|||||||
|
|
||||||
// Mark the update of the position.
|
// Mark the update of the position.
|
||||||
vec2_copy(e->oldpos,e->pos);
|
vec2_copy(e->oldpos,e->pos);
|
||||||
e->flags|=EntityFlag_UpdatedPos;
|
e->internalFlags|=EntityIntFlag_UpdatedPos;
|
||||||
|
|
||||||
vec2_copy(e->pos,pos);
|
vec2_copy(e->pos,pos);
|
||||||
}
|
}
|
||||||
@@ -816,7 +824,11 @@ void Entity_SetColor(Entity e,float r,float g,float b,float a){
|
|||||||
e->color[1]=g;
|
e->color[1]=g;
|
||||||
e->color[2]=b;
|
e->color[2]=b;
|
||||||
e->color[3]=a;
|
e->color[3]=a;
|
||||||
e->flags|=EntityFlag_UpdatedColor;
|
e->color0[0]=r;
|
||||||
|
e->color0[1]=g;
|
||||||
|
e->color0[2]=b;
|
||||||
|
e->color0[3]=a;
|
||||||
|
e->internalFlags&=~EntityIntFlag_UpdatedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -837,7 +849,7 @@ void Entity_AddColor(Entity e,float r,float g,float b,float a){
|
|||||||
e->color[3]+=a;
|
e->color[3]+=a;
|
||||||
if(e->color[3]>1.0f)
|
if(e->color[3]>1.0f)
|
||||||
e->color[3]=1.0f;
|
e->color[3]=1.0f;
|
||||||
e->flags|=EntityFlag_UpdatedColor;
|
e->internalFlags|=EntityIntFlag_UpdatedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
@@ -849,7 +861,7 @@ void Entity_MultColor(Entity e,float r,float g,float b,float a){
|
|||||||
e->color[1]*=g;
|
e->color[1]*=g;
|
||||||
e->color[2]*=b;
|
e->color[2]*=b;
|
||||||
e->color[3]*=a;
|
e->color[3]*=a;
|
||||||
e->flags|=EntityFlag_UpdatedColor;
|
e->internalFlags|=EntityIntFlag_UpdatedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -862,6 +874,10 @@ void Entity_SetLight(Entity e,float r,float g,float b,float rad){
|
|||||||
e->light[1]=g;
|
e->light[1]=g;
|
||||||
e->light[2]=b;
|
e->light[2]=b;
|
||||||
e->light[3]=rad;
|
e->light[3]=rad;
|
||||||
|
|
||||||
|
if(!(e->flags&EntityFlag_Light)){
|
||||||
|
e->internalFlags|=EntityIntFlag_UpdateLight;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -887,13 +903,7 @@ void Entity_Iluminate(Entity e,Entity *elist,int n){
|
|||||||
float qdist,f;
|
float qdist,f;
|
||||||
float qrad;
|
float qrad;
|
||||||
|
|
||||||
if(!(e->flags&EntityFlag_Light)){
|
if(e->flags&EntityFlag_Light){
|
||||||
Entity_SetColor(e,
|
|
||||||
e->light[0],
|
|
||||||
e->light[1],
|
|
||||||
e->light[2],
|
|
||||||
1.0f);
|
|
||||||
}else{
|
|
||||||
Entity_SetColor(e,
|
Entity_SetColor(e,
|
||||||
e->defaultColor[0],
|
e->defaultColor[0],
|
||||||
e->defaultColor[1],
|
e->defaultColor[1],
|
||||||
@@ -902,6 +912,11 @@ void Entity_Iluminate(Entity e,Entity *elist,int n){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e->color[0]=e->light[0];
|
||||||
|
e->color[1]=e->light[1];
|
||||||
|
e->color[2]=e->light[2];
|
||||||
|
e->color[3]=1.0f;
|
||||||
|
|
||||||
for(i=0;i<n;i++){
|
for(i=0;i<n;i++){
|
||||||
if(e==elist[i] || !(elist[i]->flags&EntityFlag_Light))
|
if(e==elist[i] || !(elist[i]->flags&EntityFlag_Light))
|
||||||
continue;
|
continue;
|
||||||
@@ -924,6 +939,15 @@ void Entity_Iluminate(Entity e,Entity *elist,int n){
|
|||||||
e->defaultColor[1],
|
e->defaultColor[1],
|
||||||
e->defaultColor[2],
|
e->defaultColor[2],
|
||||||
e->defaultColor[3]);
|
e->defaultColor[3]);
|
||||||
|
e->internalFlags&=~EntityIntFlag_UpdateLight;
|
||||||
|
|
||||||
|
if(e->internalFlags&EntityIntFlag_UpdateColor){
|
||||||
|
e->color0[0]=e->color[0];
|
||||||
|
e->color0[1]=e->color[1];
|
||||||
|
e->color0[2]=e->color[2];
|
||||||
|
e->color0[3]=e->color[3];
|
||||||
|
e->internalFlags&=~EntityIntFlag_UpdateColor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -957,12 +981,37 @@ void Entity_MarkUpdateLight(Entity e,Entity *elist,int n){
|
|||||||
min[1]<=elist[i]->pos0[1] &&
|
min[1]<=elist[i]->pos0[1] &&
|
||||||
max[1]>=elist[i]->pos0[1])
|
max[1]>=elist[i]->pos0[1])
|
||||||
{
|
{
|
||||||
elist[i]->flags|=EntityFlag_UpdateLight;
|
elist[i]->internalFlags|=EntityIntFlag_UpdateLight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
e->flags|=EntityFlag_UpdateLight;
|
e->internalFlags|=EntityIntFlag_UpdateLight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////
|
||||||
|
// Entity_IsLight
|
||||||
|
//
|
||||||
|
int Entity_IsLight(Entity e){
|
||||||
|
return (e->flags&EntityFlag_Light);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////
|
||||||
|
// Entity_IsUpdateLight
|
||||||
|
//
|
||||||
|
int Entity_IsUpdateLight(Entity e){
|
||||||
|
return (e->internalFlags&EntityIntFlag_UpdateLight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////
|
||||||
|
// Entity_IsMoving
|
||||||
|
//
|
||||||
|
int Entity_IsMoving(Entity e){
|
||||||
|
return (e->internalFlags&EntityIntFlag_UpdatedPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,9 +18,6 @@
|
|||||||
#define EntityFlag_BlockCollision 5
|
#define EntityFlag_BlockCollision 5
|
||||||
#define EntityFlag_Overlap 8
|
#define EntityFlag_Overlap 8
|
||||||
#define EntityFlag_Light 16
|
#define EntityFlag_Light 16
|
||||||
#define EntityFlag_UpdateLight 32
|
|
||||||
#define EntityFlag_UpdatedPos 64
|
|
||||||
#define EntityFlag_UpdatedColor 128
|
|
||||||
typedef struct TEntity TEntity, *Entity;
|
typedef struct TEntity TEntity, *Entity;
|
||||||
struct TEntity {
|
struct TEntity {
|
||||||
Entity base;
|
Entity base;
|
||||||
@@ -30,6 +27,7 @@ struct TEntity {
|
|||||||
vec2 pos0;
|
vec2 pos0;
|
||||||
vec2 pos;
|
vec2 pos;
|
||||||
int flags;
|
int flags;
|
||||||
|
int internalFlags;
|
||||||
int zorder;
|
int zorder;
|
||||||
float sortYOffset;
|
float sortYOffset;
|
||||||
|
|
||||||
@@ -264,7 +262,7 @@ void Entity_SetDefaultColor(Entity e,float r,float g,float b,float a);
|
|||||||
|
|
||||||
|
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
// Entity_AddColor
|
// Entity_Iluminate
|
||||||
//
|
//
|
||||||
void Entity_Iluminate(Entity e,Entity *elist,int n);
|
void Entity_Iluminate(Entity e,Entity *elist,int n);
|
||||||
|
|
||||||
@@ -275,5 +273,23 @@ void Entity_Iluminate(Entity e,Entity *elist,int n);
|
|||||||
void Entity_MarkUpdateLight(Entity e,Entity *elist,int n);
|
void Entity_MarkUpdateLight(Entity e,Entity *elist,int n);
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////
|
||||||
|
// Entity_IsLight
|
||||||
|
//
|
||||||
|
int Entity_IsLight(Entity e);
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////
|
||||||
|
// Entity_IsUpdateLight
|
||||||
|
//
|
||||||
|
int Entity_IsUpdateLight(Entity e);
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////
|
||||||
|
// Entity_IsMoving
|
||||||
|
//
|
||||||
|
int Entity_IsMoving(Entity e);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ void GameLib_ProcLoop(void *data){
|
|||||||
GameLib_Compactate();_entities_lock=1;
|
GameLib_Compactate();_entities_lock=1;
|
||||||
for(i=0;i<_n_entities;i++){
|
for(i=0;i<_n_entities;i++){
|
||||||
Entity_PostProcess(_entity[i],_pft);
|
Entity_PostProcess(_entity[i],_pft);
|
||||||
if(_entity[i]->flags&EntityFlag_UpdatedPos){
|
if(Entity_IsMoving(_entity[i])){
|
||||||
Entity_MarkUpdateLight(_entity[i],_entity,_n_entities);
|
Entity_MarkUpdateLight(_entity[i],_entity,_n_entities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -368,9 +368,8 @@ void GameLib_DrawLoop(void *data, float f){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update ilumination of this entity
|
// Update ilumination of this entity
|
||||||
if(e->flags&EntityFlag_UpdateLight){
|
if(Entity_IsUpdateLight(e)){
|
||||||
Entity_Iluminate(e,_entity,_n_entities);
|
Entity_Iluminate(e,_entity,_n_entities);
|
||||||
e->flags&=~EntityFlag_UpdateLight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Entity_Draw(e,-game_pos[0],-game_pos[1],f);
|
Entity_Draw(e,-game_pos[0],-game_pos[1],f);
|
||||||
@@ -578,7 +577,7 @@ void GameLib_PlaySound(AudioSnd snd,int x,int y){
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
void GameLib_EntitySetLight(Entity e,float r,float g,float b,float rad){
|
void GameLib_EntitySetLight(Entity e,float r,float g,float b,float rad){
|
||||||
if(e->flags&EntityFlag_Light){
|
if(Entity_IsLight(e)){
|
||||||
Entity_MarkUpdateLight(e,_entity,_n_entities);
|
Entity_MarkUpdateLight(e,_entity,_n_entities);
|
||||||
Entity_SetLight(e,r,g,b,rad);
|
Entity_SetLight(e,r,g,b,rad);
|
||||||
Entity_MarkUpdateLight(e,_entity,_n_entities);
|
Entity_MarkUpdateLight(e,_entity,_n_entities);
|
||||||
|
|||||||
Reference in New Issue
Block a user