Refactor movement code into function
This commit is contained in:
		
							parent
							
								
									17dc6cc6fc
								
							
						
					
					
						commit
						68c0560b28
					
				| @ -294,6 +294,46 @@ v2 *createAsteroidVertexList(MemoryArena_ *arena, i32 iterations, | |||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void moveEntity(GameState *state, Entity *entity, v2 ddP, f32 dt, f32 ddPSpeed) | ||||||
|  | { | ||||||
|  | 	ASSERT(ABS(ddP.x) <= 1.0f && ABS(ddP.y) <= 1.0f); | ||||||
|  | 	/*
 | ||||||
|  | 	    Assuming acceleration A over t time, then integrate twice to get | ||||||
|  | 
 | ||||||
|  | 	    newVelocity = a*t + oldVelocity | ||||||
|  | 	    newPos = (a*t^2)/2 + oldVelocity*t + oldPos | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
|  | 	ddP           = v2_scale(ddP, state->pixelsPerMeter * ddPSpeed); | ||||||
|  | 	v2 oldDp      = entity->dP; | ||||||
|  | 	v2 resistance = v2_scale(oldDp, 2.0f); | ||||||
|  | 	ddP           = v2_sub(ddP, resistance); | ||||||
|  | 
 | ||||||
|  | 	v2 newDp = v2_add(v2_scale(ddP, dt), oldDp); | ||||||
|  | 
 | ||||||
|  | 	v2 ddPHalf          = v2_scale(ddP, 0.5f); | ||||||
|  | 	v2 ddPHalfDtSquared = v2_scale(ddPHalf, (SQUARED(dt))); | ||||||
|  | 	v2 oldDpDt          = v2_scale(oldDp, dt); | ||||||
|  | 	v2 oldPos           = entity->pos; | ||||||
|  | 
 | ||||||
|  | 	v2 newPos = v2_add(v2_add(ddPHalfDtSquared, oldDpDt), oldPos); | ||||||
|  | 
 | ||||||
|  | 	for (i32 i = 0; i < state->entityIndex; i++) | ||||||
|  | 	{ | ||||||
|  | 		Entity *checkEntity = &state->entityList[i]; | ||||||
|  | 		if (checkEntity->id == entity->id) continue; | ||||||
|  | 
 | ||||||
|  | 		 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	b32 moveValid = TRUE; | ||||||
|  | 	if (moveValid) | ||||||
|  | 	{ | ||||||
|  | 		entity->dP  = newDp; | ||||||
|  | 		entity->pos = newPos; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | ||||||
|                                   v2 windowSize, f32 dt) |                                   v2 windowSize, f32 dt) | ||||||
| { | { | ||||||
| @ -408,9 +448,10 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 		else if (entity->pos.x < 0) | 		else if (entity->pos.x < 0) | ||||||
| 			entity->pos.x = state->worldSize.w; | 			entity->pos.x = state->worldSize.w; | ||||||
| 
 | 
 | ||||||
|  | 		f32 ddPSpeedInMs = 0; | ||||||
|  | 		v2 ddP           = {0}; | ||||||
| 		if (entity->type == entitytype_ship) | 		if (entity->type == entitytype_ship) | ||||||
| 		{ | 		{ | ||||||
| 			v2 ddP = {0}; |  | ||||||
| 			if (getKeyStatus(&state->input.keys[keycode_up], readkeytype_repeat, | 			if (getKeyStatus(&state->input.keys[keycode_up], readkeytype_repeat, | ||||||
| 			                 0.0f, dt)) | 			                 0.0f, dt)) | ||||||
| 			{ | 			{ | ||||||
| @ -445,28 +486,7 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 				ddP = v2_scale(ddP, 0.70710678118f); | 				ddP = v2_scale(ddP, 0.70710678118f); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			/*
 | 			ddPSpeedInMs = 25; | ||||||
| 			    Assuming acceleration A over t time, then integrate twice to get |  | ||||||
| 
 |  | ||||||
| 			    newVelocity = a*t + oldVelocity |  | ||||||
| 			    newPos = (a*t^2)/2 + oldVelocity*t + oldPos |  | ||||||
| 
 |  | ||||||
| 			*/ |  | ||||||
| 
 |  | ||||||
| 			ddP = v2_scale(ddP, state->pixelsPerMeter * 25); |  | ||||||
| 
 |  | ||||||
| 			v2 oldDp      = entity->dP; |  | ||||||
| 			v2 resistance = v2_scale(oldDp, 2.0f); |  | ||||||
| 			ddP           = v2_sub(ddP, resistance); |  | ||||||
| 
 |  | ||||||
| 			entity->dP = v2_add(v2_scale(ddP, dt), oldDp); |  | ||||||
| 
 |  | ||||||
| 			v2 ddPHalf          = v2_scale(ddP, 0.5f); |  | ||||||
| 			v2 ddPHalfDtSquared = v2_scale(ddPHalf, (SQUARED(dt))); |  | ||||||
| 			v2 oldDpDt          = v2_scale(oldDp, dt); |  | ||||||
| 			v2 oldPos           = entity->pos; |  | ||||||
| 			entity->pos = v2_add(v2_add(ddPHalfDtSquared, oldDpDt), oldPos); |  | ||||||
| 
 |  | ||||||
| 			pivotPoint = v2_scale(entity->size, 0.5f); | 			pivotPoint = v2_scale(entity->size, 0.5f); | ||||||
| 
 | 
 | ||||||
| 			DEBUG_PUSH_VAR("Pos: %5.2f, %5.2f", entity->pos, "v2"); | 			DEBUG_PUSH_VAR("Pos: %5.2f, %5.2f", entity->pos, "v2"); | ||||||
| @ -544,19 +564,16 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 			break; | 			break; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			f32 dirOffset = (randValue % 10) / 100.0f; | 			f32 dirOffset = ((randValue % 10) + 1) / 100.0f; | ||||||
| 			v2_scale(ddP, dirOffset); | 			v2_scale(ddP, dirOffset); | ||||||
| 			ASSERT(ddP.x <= 1.0f && ddP.y <= 1.0f); |  | ||||||
| 
 | 
 | ||||||
| 			entity->dP          = v2_scale(ddP, state->pixelsPerMeter * 2); | 			// NOTE(doyle): Make asteroids start and move at constant speed
 | ||||||
| 			v2 ddPHalf          = v2_scale(ddP, 0.5f); | 			ddPSpeedInMs = 2; | ||||||
| 			v2 ddPHalfDtSquared = v2_scale(ddPHalf, (SQUARED(dt))); | 			entity->dP = v2_scale(ddP, state->pixelsPerMeter * ddPSpeedInMs); | ||||||
| 
 |  | ||||||
| 			v2 dPDt     = v2_scale(entity->dP, dt); |  | ||||||
| 
 |  | ||||||
| 			entity->pos = v2_add(v2_add(ddPHalfDtSquared, dPDt), entity->pos); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		moveEntity(state, entity, ddP, dt, ddPSpeedInMs); | ||||||
|  | 
 | ||||||
| 		RenderFlags flags = renderflag_wireframe | renderflag_no_texture; | 		RenderFlags flags = renderflag_wireframe | renderflag_no_texture; | ||||||
| 		renderer_entity(&state->renderer, &state->transientArena, state->camera, | 		renderer_entity(&state->renderer, &state->transientArena, state->camera, | ||||||
| 		                entity, pivotPoint, 0, V4(0.4f, 0.8f, 1.0f, 1.0f), | 		                entity, pivotPoint, 0, V4(0.4f, 0.8f, 1.0f, 1.0f), | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user