예제 #1
0
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 );
	}
}
예제 #2
0
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;


	}
예제 #3
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);
        }
    }
}