Esempio n. 1
0
static void PONG_RunMachine(void) {
  switch(PONG_gameState) {
    case PONG_GAME_STATE_INIT:
      PONG_InitGame();
      PONG_gameState = PONG_GAME_STATE_WAIT_FOR_START;
      break;

    case PONG_GAME_STATE_WAIT_FOR_START:
    #if PL_HAS_MP3
      if (!MUSIC_IsPlaying()) {
        MUSIC_PlayTheme(MUSIC_THEME_JACK1);
        FRTOS1_vTaskDelay(20/portTICK_RATE_MS);
      }
    #endif
      if (EVNT1_GetClearEvent(EVNT1_BTN_LEFT_PRESSED)) {
#if PL_HAS_MP3
        MUSIC_Stop();
#endif
        PONG_StartGame();
        PONG_gameState = PONG_GAME_STATE_RUNNING;
      }
      break;

    case PONG_GAME_STATE_RUNNING:
      if (PONG_UpdateBalls()) {
        PONG_GameOver();
        FRTOS1_vTaskDelay(1000/portTICK_RATE_MS);
        PONG_gameState = PONG_GAME_STATE_OVER;
      }
      break;

    case PONG_GAME_STATE_PAUSE:
      /* stay in current state */
      break;

    case PONG_GAME_STATE_OVER:
      if (EVNT1_GetClearEvent(EVNT1_BTN_LEFT_PRESSED)) {
        PONG_gameState = PONG_GAME_STATE_INIT;
      }
      break;

    default:
      break;
  }
}
Esempio n. 2
0
void GegnerBigFish::DoKI(void)
{
	static bool IsKugel = false;

	KugelCount -= 1.0f SYNC;

	if (KugelCount <= 0.0f)
	{
		int LeftOrRight = 1;
		int Art = 2;
		KugelCount = 80.0f;

		if (Energy > 500)
			Art = 1;

		if (Energy > 1500)
			Art = 0;

		if (rand()%2 == 0)
			LeftOrRight *= -1;

		if (IsKugel)
			pGegner->PushGegner((float)pTileEngine->XOffset + 300.0f + 300 * LeftOrRight,
								(float)pTileEngine->YOffset + 200, KUGELKLEIN + Art, 5, 0, false);
		else
			pGegner->PushGegner((float)pTileEngine->XOffset + 300.0f + 320 * LeftOrRight,
								(float)pTileEngine->YOffset + 350, SWIMWALKER, 5, 0, false);
		IsKugel = !IsKugel;

	}

	// Schwimmbewegung
	SinOff += 0.2f SYNC;

	if (SinOff > 2*PI)
		SinOff = 0.0f;

	// Energie anzeigen
	if (Handlung != GEGNER_INIT && Handlung != GEGNER_EXPLODIEREN)
		pHUD->ShowBossHUD(2000, Energy);

	// Levelausschnitt auf den Boss zentrieren, sobald dieser sichtbar wird
	if (Active == true &&
		Handlung != GEGNER_EXPLODIEREN &&
		pTileEngine->Zustand == ZUSTAND_SCROLLBAR &&
		Energy > 0.0f)
	{
		pTileEngine->ScrollLevel((float)Value1,
								 (float)Value2, ZUSTAND_SCROLLTOLOCK);		// Level auf die Faust zentrieren
		pSoundManager->FadeSong(MUSIC_STAGEMUSIC, -2.0f, 0, true);  // Ausfaden und pausieren
		xPos  += 400;
	}

	// Zwischenboss blinkt nicht so lange wie die restlichen Gegner
	if (DamageTaken > 0.0f)
		DamageTaken -= 100 SYNC;				// Rotwerden langsam ausfaden lassen
	else
		DamageTaken = 0.0f;						// oder ganz anhalten

	// Schon schwer angeschlagen ? Dann blutet der Fish
	if (Energy < 1000 &&
		rand()%20 == 0)
		pPartikelSystem->PushPartikel(xPos + rand()%200+40, yPos + 50 + rand()%100, PIRANHABLUT);

	// Hat der Boss keine Energie mehr ? Dann explodiert er
	if (Energy <= 100.0f && Handlung != GEGNER_EXPLODIEREN)
	{
		// Endboss-Musik ausfaden und abschalten
		pSoundManager->FadeSong(MUSIC_BOSS, -2.0f, 0, false);

		// zum Spieler scrollen
		ScrolltoPlayeAfterBoss();

		Handlung  = GEGNER_EXPLODIEREN;
		xSpeed    = 0.0f;
		ySpeed    = 2.0f;
		xAcc      = 0.0f;
		yAcc      = 1.0f;
		AnimCount = 50.0f;

		Moving = false;
	}

	// Je nach Handlung richtig verhalten
	if (Moving == true)
		DoMove();
	else
	switch (Handlung)
	{
		case GEGNER_NOTVISIBLE:			// Warten bis der Screen zentriert wurde
		{
			if (pTileEngine->Zustand == ZUSTAND_LOCKED)
			{
				// Zwischenboss-Musik abspielen, sofern diese noch nicht gespielt wird
				if (MUSIC_IsPlaying(pSoundManager->its_Songs[MUSIC_BOSS]->SongData) == false)
					pSoundManager->PlaySong(MUSIC_BOSS, false);

				// Und Boss erscheinen lassen
				Handlung = GEGNER_EINFLIEGEN;
			}
		} break;

		case GEGNER_EINFLIEGEN:		// Gegner kommt DAS ERSTE MAL in den Screen geflogen
		{
			Energy = 2000;
			DamageTaken = 0.0f;

			NewAction();
			MoveTo((float)Value1 + 450, yPos);
		} break;

		case GEGNER_LAUFEN:
		{
			MoveTo((float)Value1 + 50 + rand()%300, (float)Value2 + 50 + rand()%200);
			ShotCount--;

			if (ShotCount <= 0)
				NewAction();
		} break;

		// einzelne Fische ausspucken
		case GEGNER_SCHIESSEN:
		{
			static bool shot = false;

			// und Maulbewegung
			MaulWinkel += 0.6f SYNC;

			if (MaulWinkel > PI &&
				shot == false)
			{
				shot = true;
				pGegner->PushGegner(xPos + 80.0f, yPos + 90.0f, PIRANHA, 99, 1, true);
				ShotCount--;
			}

			if (MaulWinkel > 2*PI)
			{
				shot = false;
				MaulWinkel = 0.0f;
				pSoundManager->PlayWave(50, 128, 6000 + rand()%500, SOUND_KLONG);

				if (ShotCount <= 0)
					NewAction();
			}

		} break;

		// mehrere Fische ausspucken
		case GEGNER_SPECIAL:
		{
			static bool shot = false;

			// und Maulbewegung
			MaulWinkel += 0.1f SYNC;

			if (MaulWinkel > PI &&
				shot == false)
			{
				shot = true;

				for (int i = 0; i < 9; i++)
					pGegner->PushGegner(xPos + 80.0f, yPos + 90.0f, PIRANHA, 98, i-4, true);

				ShotCount--;
			}

			if (MaulWinkel > 2*PI)
			{
				shot = false;
				MaulWinkel = 0.0f;
				pSoundManager->PlayWave(50, 128, 6000 + rand()%500, SOUND_KLONG);

				if (ShotCount <= 0)
					NewAction();
			}

		} break;

		// Boss fliegt in die Luft
		case GEGNER_EXPLODIEREN:
		{
			Energy = 100;
			if (yPos > Value2 + 300.0f)
				Energy = 0.0f;
		} break;

		default : break;
	} // switch

	// Testen, ob der Fisch den Spieler berührt hat
	GegnerRect[BIGFISH].left   = 60;
	GegnerRect[BIGFISH].right  = 280;
	GegnerRect[BIGFISH].top    = 28   + (int)(sin(SinOff) * 5.0f);
	GegnerRect[BIGFISH].bottom = 156 + (int)(sin(SinOff) * 5.0f);

	TestDamagePlayers(8.0f SYNC);

	// Normales Cliprect setzen
	GegnerRect[BIGFISH].left   = 0;
	GegnerRect[BIGFISH].right  = 17;
	GegnerRect[BIGFISH].top    = 28 + (int)(sin(SinOff) * 5.0f);
	GegnerRect[BIGFISH].bottom = 50 + (int)(sin(SinOff) * 5.0f);
}
Esempio n. 3
0
void GegnerBratklops::DoKI(void)
{
	D3DXMATRIX swap;

	/*// TODO
	static float c = 480.0f;
	static float d = 40.0f;

	c += d SYNC;
	if ((d > 0.0f && c > 480.0f)||
		(d < 0.0f && c < 0.0f))
		d *= -1.0f;

	D3DXMatrixOrthoOffCenterLH(&swap, 0, RENDERWIDTH, c, 480 - c, 0.0f, 1.0f);
	lpD3DDevice->SetTransform(D3DTS_PROJECTION, &swap); */

	// Schneller wabbeln
	//
	AnimSpeed = Energy / 8000.0f * 1.8f;

	if (AnimEnde > 0)						// Soll überhaupt anmiert werden ?
	{
		AnimCount += SpeedFaktor;			// Animationscounter weiterzählen
		if (AnimCount > AnimSpeed)			// Grenze überschritten ?
		{
			AnimCount = 0;					// Dann wieder auf Null setzen
			AnimPhase++;					// Und nächste Animationsphase
			if (AnimPhase >= AnimEnde)		// Animation von zu Ende	?
				AnimPhase = AnimStart;		// Dann wieder von vorne beginnen
		}
	} // animieren

	// Energie anzeigen
	if (Handlung != GEGNER_NOTVISIBLE && Handlung != GEGNER_EXPLODIEREN)
		pHUD->ShowBossHUD(8000, Energy);

	// Boss aktivieren und Mucke laufen lassen
	//
	if (Active == true && pTileEngine->Zustand == ZUSTAND_SCROLLBAR)
	{
		pTileEngine->ScrollLevel((float)Value1,
								 (float)Value2, ZUSTAND_SCROLLTOLOCK);		// Level auf den Boss zentrieren
		xPos -= 232;												// und Boss aus dem Screen setzen

		pSoundManager->FadeSong(MUSIC_STAGEMUSIC, -2.0f, 0, true);  // Ausfaden und pausieren
	}

	// Zwischenboss blinkt nicht so lange wie die restlichen Gegner
	if (DamageTaken > 0.0f)
		DamageTaken -= 50 SYNC;					// Rotwerden langsam ausfaden lassen
	else
		DamageTaken = 0.0f;						// oder ganz anhalten

	// Hat der Boss keine Energie mehr ? Dann explodiert er
	if (Energy <= 100.0f && Handlung != GEGNER_EXPLODIEREN)
	{
		Handlung   = GEGNER_EXPLODIEREN;
		FlareDelay = 0.0f;

		// Endboss-Musik ausfaden und abschalten
		pSoundManager->FadeSong(MUSIC_BOSS, -2.0f, 0, false);
	}

// Je nach Handlung richtig verhalten
	switch (Handlung)
	{
		case GEGNER_NOTVISIBLE:			// Warten bis der Screen zentriert wurde
		{
			//xPos = Value1 - 232;

			if (pTileEngine->Zustand == ZUSTAND_LOCKED)
			{
				// Zwischenboss-Musik abspielen, sofern diese noch nicht gespielt wird
				//
				if (MUSIC_IsPlaying(pSoundManager->its_Songs[MUSIC_BOSS]->SongData) == false)
				{
					pSoundManager->PlaySong(MUSIC_BOSS, false);

					// Und Boss erscheinen lassen
					//
					Handlung = GEGNER_EINFLIEGEN;
				}


			}
		} break;

		case GEGNER_EINFLIEGEN:		// Gegner kommt in den Screen geflogen
		{
			Energy = 8000;
			DamageTaken = 0.0f;

			xPos += 4.0f SYNC;

			if (xPos > Value1)
			{
				xPos = float (Value1);
				Handlung = GEGNER_STEHEN;
			}
		} break;

		case GEGNER_STEHEN:
		{
			static int oldaction = 0;

			// Auf nächste Aktion warten
			//
			ActionDelay -= 1.0f SYNC;
			if (ActionDelay <= 0.0f)
			{
				int j;

				// Keine Aktion doppelt
				//
				do
				{
					j = rand()%6;
				} while (j == oldaction);

				oldaction = j;

				// Ballern
				//
				if (j == 0)
				{
					Handlung = GEGNER_BOMBARDIEREN;
					ActionDelay = 8.0f;
					pProjectiles->PushProjectile (xPos + 146, yPos + 186, BRATKLOPSSHOT);
					pSoundManager->PlayWave (100, 128, 8000, SOUND_GRANATE);
					Shots = rand()%3 + 3;
				}

				// Kotzen
				//
				else
				if (j == 1)
				{
					Handlung = GEGNER_SCHIESSEN;
					ShotDelay = 1.0f;
					pSoundManager->PlayWave (100, 128, 11025, SOUND_KOTZEN);
				}
				else

				// Laser
				//
				if (j == 2)
				{
					Handlung = GEGNER_SPECIAL;
					FlareDelay = 0.0f;
					pSoundManager->PlayWave (100, 128, 8000, SOUND_SPIDERSCREAM);
				}
				// FettBoller
				//
				else
				if (j == 3)
				{
					Handlung = GEGNER_SPECIAL2;
					FlareDelay = 0.0f;
					pSoundManager->PlayWave (100, 128, 8000, SOUND_SPIDERSCREAM);
				}

				// Laser von Rechts nach Links
				//
				else
				if (j == 4)
				{
					Handlung = GEGNER_SPECIAL3;
					FlareDelay = 800.0f;
					pSoundManager->PlayWave (100, 128, 8000, SOUND_SPIDERSCREAM);
				}

				// Pause
				//
				else
				if (j == 5)
				{
					ActionDelay = 16.0f;
				}
			}
		} break;

		// Gegner ballert grüne Rotzbollen
		//
		case GEGNER_BOMBARDIEREN:
		{
			ActionDelay -= 1.0f SYNC;

			if (ActionDelay <= 0.0f)
			{
				ActionDelay = 8.0f;
				pProjectiles->PushProjectile (xPos + 146, yPos + 186, BRATKLOPSSHOT);
				pSoundManager->PlayWave (100, 128, 8000, SOUND_GRANATE);
				Shots--;
				if (Shots == 0)
					Handlung = GEGNER_STEHEN;
			}
		}
		break;

		// Laser schiessen, der am Boden entlang wandert (von links nach rechts)
		//
		case GEGNER_SPECIAL:
		{
			FlareDelay += (10000.0f - Energy) / 1000.0f SYNC;
		}
		break;

		// Laser schiessen, der am Boden entlang wandert (von rechts nach links)
		//
		case GEGNER_SPECIAL3:
		{
			FlareDelay -= (10000.0f - Energy) / 750.0f SYNC;
			if (FlareDelay < 210.0f)
			{
				FlareDelay = 0.0f;
				Handlung = GEGNER_STEHEN;
				ActionDelay = 8.0f;
			}
		}
		break;

		// Laser aufladen und dann drei Fett Boller schiessen
		//
		case GEGNER_SPECIAL2:
		{
			FlareDelay += (10000.0f - Energy) / 1000.0f SYNC;
			if (FlareDelay > 255.0f)
			{
				FlareDelay = 0.0f;
				Handlung = GEGNER_STEHEN;
				ActionDelay = 8.0f;

				pProjectiles->PushProjectile (xPos +  60, yPos + 50,  BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos +  84, yPos + 80,  BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos + 108, yPos + 115, BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos + 130, yPos + 150, BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos + 145, yPos + 185, BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos + 130, yPos + 220, BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos + 108, yPos + 255, BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos +  84, yPos + 290, BRATKLOPSSHOT);
				pProjectiles->PushProjectile (xPos +  60, yPos + 320, BRATKLOPSSHOT);

				pSoundManager->PlayWave (100, 128,  8000, SOUND_GRANATE);
				pSoundManager->PlayWave (100, 128, 11025, SOUND_GRANATE);
				pSoundManager->PlayWave (100, 128, 11025, SOUND_BRATLASER);
			}
		}
		break;

		case GEGNER_EXPLODIEREN:
		{
			Energy = 100.0f;

			// Explodieren
			//
			if (rand()%5 == 0) pPartikelSystem->PushPartikel(xPos + rand()%180, yPos + rand()%500, EXPLOSION_GREEN);
			if (rand()%3 == 0) pPartikelSystem->PushPartikel(xPos + rand()%150, yPos + rand()%200 + 100, MADEBLUT);
			if (rand()%8 == 0) pSoundManager->PlayWave(100, 128, 8000 + rand()%4000, SOUND_EXPLOSION1);

			xPos -= 3.0f SYNC;

			// Fertig explodiert ? Dann wird der Spacko ganz zerlegt
			//
			if (xPos - pTileEngine->XOffset <= - 300)
				Energy = 0.0f;
		} break;

		case GEGNER_SCHIESSEN:
		{
			// Aktion vorbei ?
			//
			if (pSoundManager->its_Sounds [SOUND_KOTZEN]->isPlaying == false)
			{
				ActionDelay = 10.0f;
				Handlung    = GEGNER_STEHEN;
			}

			// Made kotzen
			//
			ShotDelay -= 1.0f SYNC;
			if (ShotDelay <= 0.0f)
			{
				if (Skill == 0) ShotDelay = 0.40f; else
				if (Skill == 1) ShotDelay = 0.30f; else
								ShotDelay = 0.20f;

				pGegner->PushGegner (xPos + 121 + rand ()%6, yPos + 105 + rand ()%6, MADE, 0, 0, false);
			}
		} break;

		default : break;
	} // switch

	// Testen, ob der Spieler den Bratklops berührt hat
	// dafür nehmen wir ein anderes Rect, weil das normale GegnerRect nur das Grüne Auge ist, wo man den Gegner treffen kann
	//
	RECT rect;

	rect.top    = 100;
	rect.left   = 0;
	rect.bottom = 340;
	rect.right  = 60;

	TestDamagePlayers(4.0f SYNC);

	rect.top    = 100;
	rect.left   = 0;
	rect.bottom = 300;
	rect.right  = 120;

	TestDamagePlayers(4.0f SYNC);
}