Add hitbox size/render size notion
This commit is contained in:
		
							parent
							
								
									c52d872058
								
							
						
					
					
						commit
						e00ef52f8a
					
				| @ -215,14 +215,14 @@ void renderer_string(Renderer *const renderer, v4 cameraBounds, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void renderer_entity(Renderer *renderer, v4 cameraBounds, Entity *entity, | void renderer_entity(Renderer *renderer, v4 cameraBounds, Entity *entity, | ||||||
|                      v2 entityRenderSize, f32 rotate, v4 color) |                      f32 rotate, v4 color) | ||||||
| { | { | ||||||
| 	// TODO(doyle): Batch into render groups
 | 	// TODO(doyle): Batch into render groups
 | ||||||
| 
 | 
 | ||||||
| 	// NOTE(doyle): Pos + Size since the origin of an entity is it's bottom left
 | 	// NOTE(doyle): Pos + Size since the origin of an entity is it's bottom left
 | ||||||
| 	// corner. Add the two together so that the clipping point is the far right
 | 	// corner. Add the two together so that the clipping point is the far right
 | ||||||
| 	// side of the entity
 | 	// side of the entity
 | ||||||
| 	v2 rightAlignedP = v2_add(entity->pos, entity->size); | 	v2 rightAlignedP = v2_add(entity->pos, entity->hitboxSize); | ||||||
| 	v2 leftAlignedP = entity->pos; | 	v2 leftAlignedP = entity->pos; | ||||||
| 	if ((leftAlignedP.x < cameraBounds.z && rightAlignedP.x >= cameraBounds.x) && | 	if ((leftAlignedP.x < cameraBounds.z && rightAlignedP.x >= cameraBounds.x) && | ||||||
| 	    (leftAlignedP.y < cameraBounds.y && rightAlignedP.y >= cameraBounds.w)) | 	    (leftAlignedP.y < cameraBounds.y && rightAlignedP.y >= cameraBounds.w)) | ||||||
| @ -244,7 +244,7 @@ void renderer_entity(Renderer *renderer, v4 cameraBounds, Entity *entity, | |||||||
| 		v2 offsetFromCamOrigin    = V2(cameraBounds.x, cameraBounds.w); | 		v2 offsetFromCamOrigin    = V2(cameraBounds.x, cameraBounds.w); | ||||||
| 		v2 entityRelativeToCamera = v2_sub(entity->pos, offsetFromCamOrigin); | 		v2 entityRelativeToCamera = v2_sub(entity->pos, offsetFromCamOrigin); | ||||||
| 
 | 
 | ||||||
| 		renderObject(renderer, entityRelativeToCamera, entityRenderSize, | 		renderObject(renderer, entityRelativeToCamera, entity->renderSize, | ||||||
| 		             rotate, color, entity->tex); | 		             rotate, color, entity->tex); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,13 +20,14 @@ INTERNAL Entity *addEntity(World *world, v2 pos, v2 size, enum EntityType type, | |||||||
| 	ASSERT(type < entitytype_count); | 	ASSERT(type < entitytype_count); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	Entity entity    = {0}; | 	Entity entity     = {0}; | ||||||
| 	entity.pos       = pos; | 	entity.pos        = pos; | ||||||
| 	entity.size      = size; | 	entity.hitboxSize = size; | ||||||
| 	entity.type      = type; | 	entity.renderSize = size; | ||||||
| 	entity.direction = direction; | 	entity.type       = type; | ||||||
| 	entity.tex       = tex; | 	entity.direction  = direction; | ||||||
| 	entity.collides  = collides; | 	entity.tex        = tex; | ||||||
|  | 	entity.collides   = collides; | ||||||
| 
 | 
 | ||||||
| 	switch(type) | 	switch(type) | ||||||
| 	{ | 	{ | ||||||
| @ -272,7 +273,7 @@ void worldTraveller_gameInit(GameState *state, v2 windowSize) | |||||||
| 
 | 
 | ||||||
| 	/* Create a NPC */ | 	/* Create a NPC */ | ||||||
| 	pos         = V2(hero->pos.x * 3, CAST(f32) state->tileSize); | 	pos         = V2(hero->pos.x * 3, CAST(f32) state->tileSize); | ||||||
| 	size        = hero->size; | 	size        = hero->hitboxSize; | ||||||
| 	type        = entitytype_npc; | 	type        = entitytype_npc; | ||||||
| 	dir         = direction_null; | 	dir         = direction_null; | ||||||
| 	tex         = hero->tex; | 	tex         = hero->tex; | ||||||
| @ -291,7 +292,7 @@ void worldTraveller_gameInit(GameState *state, v2 windowSize) | |||||||
| 	/* Create a Mob */ | 	/* Create a Mob */ | ||||||
| 	pos         = V2(renderer->size.w - (renderer->size.w / 3.0f), | 	pos         = V2(renderer->size.w - (renderer->size.w / 3.0f), | ||||||
| 	                 CAST(f32) state->tileSize); | 	                 CAST(f32) state->tileSize); | ||||||
| 	size        = hero->size; | 	size        = hero->hitboxSize; | ||||||
| 	type        = entitytype_mob; | 	type        = entitytype_mob; | ||||||
| 	dir         = direction_west; | 	dir         = direction_west; | ||||||
| 	tex         = hero->tex; | 	tex         = hero->tex; | ||||||
| @ -459,8 +460,8 @@ INTERNAL void parseInput(GameState *state, const f32 dt) | |||||||
| 			if (entity.collides) | 			if (entity.collides) | ||||||
| 			{ | 			{ | ||||||
| 				v4 heroRect = | 				v4 heroRect = | ||||||
| 				    V4(newHeroP.x, newHeroP.y, (newHeroP.x + hero->size.x), | 				    V4(newHeroP.x, newHeroP.y, (newHeroP.x + hero->hitboxSize.x), | ||||||
| 				       (newHeroP.y + hero->size.y)); | 				       (newHeroP.y + hero->hitboxSize.y)); | ||||||
| 				v4 entityRect = getEntityScreenRect(entity); | 				v4 entityRect = getEntityScreenRect(entity); | ||||||
| 
 | 
 | ||||||
| 				if (((heroRect.z >= entityRect.x && heroRect.z <= entityRect.z) || | 				if (((heroRect.z >= entityRect.x && heroRect.z <= entityRect.z) || | ||||||
| @ -489,7 +490,7 @@ INTERNAL void parseInput(GameState *state, const f32 dt) | |||||||
| 		    V2((hero->pos.x - (0.5f * state->renderer.size.w)), (0.0f)); | 		    V2((hero->pos.x - (0.5f * state->renderer.size.w)), (0.0f)); | ||||||
| 
 | 
 | ||||||
| 		// NOTE(doyle): Hero position is offset to the center so -recenter it
 | 		// NOTE(doyle): Hero position is offset to the center so -recenter it
 | ||||||
| 		offsetFromHeroToOrigin.x += (hero->size.x * 0.5f); | 		offsetFromHeroToOrigin.x += (hero->hitboxSize.x * 0.5f); | ||||||
| 		world->cameraPos = offsetFromHeroToOrigin; | 		world->cameraPos = offsetFromHeroToOrigin; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -509,6 +510,18 @@ INTERNAL void updateEntityAnim(Entity *entity, f32 dt) | |||||||
| 		texRect             = anim->rect[anim->currRectIndex]; | 		texRect             = anim->rect[anim->currRectIndex]; | ||||||
| 		anim->currDuration  = anim->duration; | 		anim->currDuration  = anim->duration; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	// NOTE(doyle): If humanoid entity, let animation dictate render size which
 | ||||||
|  | 	// may exceed the hitbox size of the entity
 | ||||||
|  | 	switch (entity->type) | ||||||
|  | 	{ | ||||||
|  | 		case entitytype_hero: | ||||||
|  | 		case entitytype_mob: | ||||||
|  | 		case entitytype_npc: | ||||||
|  | 			entity->renderSize = math_getRectSize(texRect); | ||||||
|  | 		default: | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| INTERNAL void beginAttack(GameState *state, Entity *attacker) | INTERNAL void beginAttack(GameState *state, Entity *attacker) | ||||||
| @ -570,6 +583,7 @@ INTERNAL v4 createCameraBounds(World *world, v2 size) | |||||||
| 
 | 
 | ||||||
| INTERNAL void updateEntity(GameState *state, Entity *entity, f32 dt) | INTERNAL void updateEntity(GameState *state, Entity *entity, f32 dt) | ||||||
| { | { | ||||||
|  | 
 | ||||||
| 	World *const world = &state->world[state->currWorldIndex]; | 	World *const world = &state->world[state->currWorldIndex]; | ||||||
| 	Entity *hero       = &world->entities[world->heroIndex]; | 	Entity *hero       = &world->entities[world->heroIndex]; | ||||||
| 
 | 
 | ||||||
| @ -629,6 +643,8 @@ INTERNAL void updateEntity(GameState *state, Entity *entity, f32 dt) | |||||||
| 			entity->state = entitystate_dead; | 			entity->state = entitystate_dead; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	updateEntityAnim(entity, dt); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt) | void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt) | ||||||
| @ -653,24 +669,8 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt) | |||||||
| 	for (i32 entityId = 0; entityId < world->freeEntityIndex; entityId++) | 	for (i32 entityId = 0; entityId < world->freeEntityIndex; entityId++) | ||||||
| 	{ | 	{ | ||||||
| 		Entity *const entity  = &world->entities[entityId]; | 		Entity *const entity  = &world->entities[entityId]; | ||||||
| 		u32 oldAnimCycleCount = entity->currAnimCyclesCompleted; |  | ||||||
| 		updateEntityAnim(entity, dt); |  | ||||||
| 
 |  | ||||||
| 		v2 entityRenderSize = entity->size; |  | ||||||
| 		if (entity->type == entitytype_hero || entity->type == entitytype_mob) |  | ||||||
| 		{ |  | ||||||
| #ifdef DENGINE_DEBUG |  | ||||||
| 			DEBUG_PUSH_STRING("HeroAnimCycleCount: %d", |  | ||||||
| 			                  entity->currAnimCyclesCompleted, "i32"); |  | ||||||
| #endif |  | ||||||
| 			// NOTE(doyle): If dynamic entity, allow animations to exceed
 |  | ||||||
| 			// the actual hitbox of character
 |  | ||||||
| 			EntityAnim *anim = &entity->anim[entity->currAnimId]; |  | ||||||
| 			v4 texRect       = anim->rect[anim->currRectIndex]; |  | ||||||
| 			entityRenderSize = math_getRectSize(texRect); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		updateEntity(state, entity, dt); | 		updateEntity(state, entity, dt); | ||||||
|  | 
 | ||||||
| 		if (entity->state == entitystate_battle) | 		if (entity->state == entitystate_battle) | ||||||
| 		{ | 		{ | ||||||
| 			if (hero->state == entitystate_idle) | 			if (hero->state == entitystate_idle) | ||||||
| @ -702,8 +702,8 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt) | |||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		f32 rotate = 0.0f; | 		f32 rotate = 0.0f; | ||||||
| 		renderer_entity(&state->renderer, cameraBounds, entity, | 		renderer_entity(&state->renderer, cameraBounds, entity, rotate, | ||||||
| 		                entityRenderSize, rotate, V4(1, 1, 1, 1)); | 		                V4(1, 1, 1, 1)); | ||||||
| 
 | 
 | ||||||
| #ifdef DENGINE_DEBUG | #ifdef DENGINE_DEBUG | ||||||
| 		/* Render debug markers on entities */ | 		/* Render debug markers on entities */ | ||||||
| @ -732,8 +732,8 @@ void worldTraveller_gameUpdateAndRender(GameState *state, const f32 dt) | |||||||
| 
 | 
 | ||||||
| 		if (debugString) | 		if (debugString) | ||||||
| 		{ | 		{ | ||||||
| 			v2 strPos                  = v2_add(entity->pos, entity->size); | 			v2 strPos = v2_add(entity->pos, entity->hitboxSize); | ||||||
| 			i32 indexOfLowerAInMetrics = 'a' - CAST(i32)font->codepointRange.x; | 			i32 indexOfLowerAInMetrics = 'a' - CAST(i32) font->codepointRange.x; | ||||||
| 			strPos.y += font->charMetrics[indexOfLowerAInMetrics].offset.y; | 			strPos.y += font->charMetrics[indexOfLowerAInMetrics].offset.y; | ||||||
| 
 | 
 | ||||||
| 			renderer_string(&state->renderer, cameraBounds, font, debugString, | 			renderer_string(&state->renderer, cameraBounds, font, debugString, | ||||||
|  | |||||||
| @ -81,7 +81,8 @@ typedef struct Entity | |||||||
| { | { | ||||||
| 	v2 pos;  // Position
 | 	v2 pos;  // Position
 | ||||||
| 	v2 dPos; // Velocity
 | 	v2 dPos; // Velocity
 | ||||||
| 	v2 size; | 	v2 hitboxSize; | ||||||
|  | 	v2 renderSize; | ||||||
| 
 | 
 | ||||||
| 	enum EntityState state; | 	enum EntityState state; | ||||||
| 	enum EntityType type; | 	enum EntityType type; | ||||||
| @ -100,7 +101,7 @@ typedef struct Entity | |||||||
| 
 | 
 | ||||||
| INTERNAL inline v4 getEntityScreenRect(Entity entity) | INTERNAL inline v4 getEntityScreenRect(Entity entity) | ||||||
| { | { | ||||||
| 	v4 result = math_getRect(entity.pos, entity.size); | 	v4 result = math_getRect(entity.pos, entity.hitboxSize); | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -51,6 +51,6 @@ inline void renderer_staticString(Renderer *const renderer, Font *const font, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void renderer_entity(Renderer *renderer, v4 cameraBounds, Entity *entity, | void renderer_entity(Renderer *renderer, v4 cameraBounds, Entity *entity, | ||||||
|                      v2 entityRenderSize, f32 rotate, v4 color); |                      f32 rotate, v4 color); | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user