void APIENTRY Projectile_Update(Object *pObject) { Projectile *pProjectile=(Projectile *)pObject; switch(pProjectile->type) { case PROJECTILE_BULLET: Bullet_Update(pObject); break; case PROJECTILE_ROCKET: Rocket_Update(pObject); break; } pProjectile->fLife -= 0.1f; if(pProjectile->fLife<0.f) { if(pProjectile->pTrails[0]) { Trail_SetDelete( (Object*)pProjectile->pTrails[0], true ); } if(pProjectile->pTrails[1]) { Trail_SetDelete( (Object*)pProjectile->pTrails[1], true ); } TrashCan_DeleteObject( (Object*)pProjectile ); } }
virtual int render() { STX_TRY; mI->Input->Update (); // ----- Delta Time ----- fElapsedTime = mI->Render->GetFrameTime() / 1000.0f; // ----- Text ----- stx_strlcpy (szText, "Move the mouse left and right and watch the tank try to follow!\n", 2048); stx_strlcat (szText, "Press Left Mouse button to fire!\n", 2048); stx_strlcat (szText, "Press 'f' to toggle freezing the tank movement (debug)\n", 2048); stx_snprintf(szBuf, 2048, "%d, %d\n", mI->Input->GetMouseX(), mI->Input->GetMouseY() ); stx_strlcat (szText, szBuf, 2048); stx_snprintf(szBuf, 2048, "%.3f, %.3f\n", g_vecPlayer_Pos.x, g_vecPlayer_Pos.y); stx_strlcat (szText, szBuf, 2048); stx_snprintf(szBuf, 2048, "Muzzle angle %.3f\n", g_fGunAngle); stx_strlcat (szText, szBuf, 2048); stx_snprintf(szBuf, 2048, "Tank velocity %.3f\n", g_vecPlayer_Velocity.x); stx_strlcat (szText, szBuf, 2048); mTextSmallWhite.SetText (szText); // Position the mouse cursor cursor.SetPosition((float)mI->Input->GetMouseX(), (float)mI->Input->GetMouseY(), 1); // "Freeze" tank except allow gun to rotate if (mI->Input->OnKeyPress(KEY_f)) g_bToggleFreezeTank = !g_bToggleFreezeTank; ULONG Direction = 0; float deltaX = g_vecPlayer_Pos.x - mI->Input->GetMouseX(); if (!g_bToggleFreezeTank && fabs(deltaX) > g_Epsilon) { if (deltaX < 0) { Direction |= DIR_RIGHT; tank.SetSequence(1); } else if (deltaX > 0) { Direction |= DIR_LEFT; tank.SetSequence(2); } } else { // Stop the animation if not moving tank.SetSequence(0); } // Any movement? if ( Direction && !g_bToggleFreezeTank ) { Player_Move( Direction, g_fSpeed * fElapsedTime, true ); } //--------------------------- // Update the player //--------------------------- Player_Update( fElapsedTime ); //--------------------------- // Move and rotate the barrel // Note: there would normally be a class representing the whole tank //--------------------------- float fMouse2TankX = tank.GetPosX() - mI->Input->GetMouseX(); float fMouse2TankY = tank.GetPosY() - mI->Input->GetMouseY(); // y position going down // Clamp. Mouse is below tank if (fMouse2TankY < 0.0f) fMouse2TankY = 0.0f; g_fGunAngle = atan2(fMouse2TankY, fMouse2TankX) * 180.0f / fPI; // in degrees g_fGunAngle -= 90.0f; // barrel is initially pointing up (in image). atan2() w.r.t x-axis (pointing right) barrel.SetAngleXYZ(0.0f, 0.0f, g_fGunAngle); // Set position of barrel (child) on the tank (parent) g_vecBarrel.x = tank.GetPosX(); g_vecBarrel.y = tank.GetPosY(); barrel.SetPosition(g_vecBarrel.x, g_vecBarrel.y, 0); // Move the tank (player) tank.SetPosition(g_vecPlayer_Pos.x, g_vecPlayer_Pos.y, 1); tankShadow.SetPosition(tank.GetPosX(), tank.GetPosY() + 50, 0); // location is tank HotSpot plus an offset of 50 //--------------------------- // Fire weapon!! //--------------------------- if (5 && mI->Input->OnMouseButtonPress(MBUTTON_LEFT)) { // Initial bullet position (following code is rather verbose and could be combined into less lines // but did it that way to explain the math. float angleDegrees = barrel.GetAngleZ() + 90.0f; float angleRadians = angleDegrees * fPI / 180.0f; float fX = barrel.GetPosX() - cosf(angleRadians) * BARREL_LENGTH; float fY = barrel.GetPosY() - sinf(angleRadians) * BARREL_LENGTH; bullet.SetAngleXYZ(0, 0, angleDegrees - 90.0f); g_vecBullet_Pos = D3DXFROMWINEVECTOR3(fX, fY, 0.0f); bullet.SetPosition(g_vecBullet_Pos.x, g_vecBullet_Pos.y, 0); // Initial bullet velocity D3DXFROMWINEMATRIX mtxRotate; D3DXFROMWINEVECTOR3 vecVelDir = D3DXFROMWINEVECTOR3(-1.0f, 0.0f, 0.0f); D3DXFROMWINEMatrixRotationZ( &mtxRotate, angleRadians); D3DXFROMWINEVec3TransformNormal( &vecVelDir, &vecVelDir, &mtxRotate ); g_vecBullet_Velocity = vecVelDir * BULLET_SPEED; // Show blast! g_fMuzzleFlashTimer = 0.05f; muzzleFlash.SetPosition(g_vecBullet_Pos.x, g_vecBullet_Pos.y, 0); g_bBulletDead = false; // Make sound! (no sound lib hooked up but this is where you would do it. STX_Service::GetAudioInstance()->Play("tankfire1"); } // Update the single bullet if (!g_bBulletDead) { bullet.SetShow(true); Bullet_Update( fElapsedTime, &bullet ); bullet.SetPosition(g_vecBullet_Pos.x, g_vecBullet_Pos.y, 0); } else { bullet.SetShow(false); } //--------------------------- // Render muzzle flash effect //--------------------------- g_fMuzzleFlashTimer -= fElapsedTime; if (g_fMuzzleFlashTimer > 0.0f) { muzzleFlash.SetShow(true); } else { muzzleFlash.SetShow(false); g_fMuzzleFlashTimer = 0.0f; } //----------------- // Render the scene //----------------- mI->Render->BeginScene (); mI->Render->ClearViewPort (160, 160, 160); mI->Render->SetViewPort2d (0, 0, mI->Window->GetWidth(), mI->Window->GetHeight()); mI->Entity2dManager->RenderEntities2d ( ); // Render GUI layer mI->Entity2dManager->RenderEntities2d (1); //???mI->Render->ShowFpsInWindowTitle(); // MUST call this to update FMOD STX_Service::GetAudioInstance()->Update(); mI->Render->EndScene (); STX_CATCH; return 0; }
void GameManage_UpdateWorldEntities(GameManager* gm, World* world) { Vector* bullets_vector = &world->bullets_vector; Vector* bonus_vector = &world->bonus_vector; Vector* monsters_vector = &world->monsters_vector; Vector* explosions_vector = &world->explosions_vector; Vector* decals_vector = &world->decals_vector; Vector* props_vector = &world->props_vector; for(int i = 0 ; i < world->map_size ; i++) { if(world->map[i] != NULL) { // Entity_CalculateVisibility(world->map[i], world); if(world->map[i]->t == Cat_Door) { Door_Update(world->map[i], world); } if(!world->map[i]->alive) { free(world->map[i]);//walls don't have any compotent, no need to destroy them world->map[i] = NULL; } } } for(int i = 0 ; i < Vector_Count(bullets_vector) ; i++) { if(Vector_Get(bullets_vector, i) != NULL) { Entity* projectile = (Entity*)Vector_Get(bullets_vector, i); Entity_CalculateVisibility(projectile, world); if(!bullet_time_g) { if(projectile->t == Cat_Bullet) { Bullet_Update(projectile, world); } else if(projectile->t == Cat_Grenade) { Grenade_Update(projectile, world); if(!projectile->alive) { Vector_Push(explosions_vector, Explosion_Create(projectile->x - 64, projectile->y - 64) ); } } if (projectile->alive == false) { Entity_Destroy(projectile); Vector_Delete(bullets_vector, i); } } } else { printf("Error during update of bullets vector : bullet = NULL"); } } if(gm->ai_on) { for(int i = 0 ; i < Vector_Count(monsters_vector) ; i++) { Entity* mob = (struct Entity*)Vector_Get(monsters_vector, i); if(Entity_CheckDistance(mob, &world->player, 800)) { Entity_CalculateVisibility(mob, world); } if(mob->zombieC->aggressive || Entity_CheckDistance(mob, &world->player, 400)) { Zombie_Update(mob, world); } if (mob->alive == false) { Zombie_Die(mob, bonus_vector, decals_vector); Entity_Destroy(mob); Vector_Delete(monsters_vector, i); } } } for(int i = 0 ; i < Vector_Count(bonus_vector) ; i++) { if(Vector_Get(bonus_vector, i) != NULL) { Entity* bonus = (Entity*)Vector_Get(bonus_vector, i); if(Entity_CheckDistance(bonus, &world->player, 800)) { if(!bullet_time_g) { Bonus_Update(bonus, &world->player); } Entity_CalculateVisibility(bonus, world); } if (bonus->alive == false) { Entity_Destroy(bonus); Vector_Delete(bonus_vector, i); } } else { printf("Error during update of bonus vector : bonus = NULL"); } } for(int i = 0 ; i < Vector_Count(decals_vector) ; i++) { Entity* decal = (Entity*)Vector_Get(decals_vector, i); if(Entity_CheckDistance(decal, &world->player, 800)) { Entity_CalculateVisibility(decal, world); } if(Vector_Count(decals_vector) > 200) { if(decal->is_ennemy) { Vector_Delete(decals_vector, i); } } } for(int i = 0 ; i < Vector_Count(props_vector) ; i++) { Entity* prop = (Entity*)Vector_Get(props_vector, i); if(Entity_CheckDistance(prop, &world->player, 800)) { Entity_CalculateVisibility(prop, world); } if (!prop->alive) { Entity_Destroy(prop); Vector_Delete(props_vector, i); } } for(int i = 0 ; i < Vector_Count(explosions_vector) ; i++) { Entity* exp = (Entity*)Vector_Get(explosions_vector, i); if(!bullet_time_g) { Explosion_Update(exp, world); } Entity_CalculateVisibility(exp, world); if (!exp->alive) { Entity_Destroy(exp); Vector_Delete(explosions_vector, i); } } }