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; } }
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); }
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); }