void CCutScene1::RunCutScene (void) { static float yscroll = 0.0f; BackGround->RenderSprite (0, 0, 0xFFFFFFFF); for (int i = 0; i < 15; i++) { int a; a = 255; // CutScene Text anzeigen, sofern ausgefüllt // if (strcmp (TextArray [TEXT_CUTSCENE1_1 + i], "-") != 0) // pDefaultFont->DrawText (20, 480 - m_fYScroll + i * 12, TextArray [TEXT_CUTSCENE1_1 + i], D3DCOLOR_RGBA (255, 255, 255, a)); } // Schwarzes Rechteck zum Faden anzeigen? // if (m_iFading != 0) { m_fFadeAlpha += 20.0f * m_iFading SYNC; int a = int (m_fFadeAlpha); // Stop Fading if (m_iFading == -1 && a < 0) m_iFading = 0; // Stop Scene else if (m_iFading == 1 && a > 255) m_bIsDone = true; else RenderRect (0, 0, 640, 480, D3DCOLOR_RGBA (0, 0, 0, a)); } m_fYScroll += 1.0f SYNC; } // RunCutScene
void IntroClass::DoIntro(void) { // Hintergrund rendern DirectGraphics.SetColorKeyMode(); int a = (TextOff - 1) / 4; if (a < 0) a = 0; if (a > 5) a = 5; Background[a].RenderSprite(0, 0, 0, 0xFFFFFFFF); // nächstes Bild überblenden? if ((TextOff - 1) % 4 == 3 && a < 5) { D3DCOLOR fadecol = D3DCOLOR_RGBA(255, 255, 255, (int)(Counter / 1300.0f * 255.0f)); Background[a+1].RenderSprite(0, 0, 0, fadecol); } // Balken unten RenderRect4(0, 360, 640, 60, 0x00000000, 0x00000000, 0xFF000000, 0xFF000000); RenderRect(0, 420, 640, 60, 0xFF000000); // Intro laufen lassen switch(Zustand) { case INTRO_FADEIN : // Text scrollen { // Mucke spielen if (pSoundManager->InitSuccessfull && FMUSIC_IsPlaying(pSoundManager->its_Songs[MUSIC_INTRO]->SongData) == false) pSoundManager->PlaySong(MUSIC_INTRO, false); // und einfaden Counter += 10.0f SYNC; if (Counter > 255.0f) { Counter = 0.0f; Zustand = INTRO_RUN; } else { D3DCOLOR col = D3DCOLOR_RGBA(0, 0, 0, 255-int(Counter)); RenderRect(0, 0, 640, 480, col); } } break; case INTRO_FADEOUT : { // und ausfaden Counter -= 5.0f SYNC; if (Counter < 0.0f) { Counter = 0.0f; Zustand = INTRO_DONE; } D3DCOLOR col = D3DCOLOR_RGBA(0, 0, 0, 255-int(Counter)); RenderRect(0, 0, 640, 480, col); } break; // Scroller case INTRO_RUN: { Counter += 25.5f SYNC; if (Counter > 1300.0f) { Counter = 0.0f; TextOff++; if (TextOff > 23) { EndIntro(); break; } } // Text rendern float xr = Counter; if (xr > 700.0f) xr = 700.0f; DirectGraphics.SetAdditiveMode(); for (int t = 0; t <= 23; t++) { D3DCOLOR col; col = D3DCOLOR_RGBA(0, 255, 0, 255 - (TextOff - t) * 25); if (t <= TextOff && t - TextOff > -10) { int off = TEXT_INTRO1 + t; if (off == TEXT_INTRO1 + 22 && NUMPLAYERS == 2) off++; else if (off >= TEXT_INTRO1 + 23) off++; pDefaultFont->DrawText(10, (float)(465 + t * 12) - TextOff * 12, TextArray[off], col); // Teil des Textes verdecken if (t == TextOff) { DirectGraphics.SetColorKeyMode(); RenderRect(xr, 464, 640.0f, 17, 0xFF000000); } } } //grüne Rechtecke rendern if (TextOff <= 28) { DirectGraphics.SetAdditiveMode(); { int l = pDefaultFont->StringLength(TextArray[TEXT_INTRO1 + TextOff], 0) + 28; if (xr < l) { for (int i = 0; i < 5; i++) { D3DCOLOR col; switch(i) { case 0: col = D3DCOLOR_RGBA(255, 255, 255, 255); break; case 1: col = D3DCOLOR_RGBA(0, 255, 0, 255); break; case 2: col = D3DCOLOR_RGBA(0, 180, 0, 255); break; case 3: col = D3DCOLOR_RGBA(0, 90, 0, 255); break; case 4: col = D3DCOLOR_RGBA(0, 50, 0, 255); break; } RenderRect(xr - i * 12 - 12, 464, 12, 12, col); } } else { xr = (float)l; // blinken lassen if ((int)(Counter / 100.0f) % 2 == 0) RenderRect(xr - 12, 464, 12, 12, 0xFFFFFFFF); } } } } break; default : break; } // switch }
void GegnerBratklops::DoDraw() { // Gegner rendern // Animation existiert nur von 1-5, danach läuft sie rückwärts // int a; a = AnimPhase; if (a > 5) a = 10 - a; pGfx[a]->RenderSprite (float (xPos - pTileEngine->XOffset), float (yPos - pTileEngine->YOffset), 0xFFFFFFFF); // Laser rendern ? // if (FlareDelay > 0.0f) { int c = int (FlareDelay); if (c > 128.0f) c = 128; if (FlareDelay > 544) c = int (128 - (FlareDelay - 544) / 2.0f); DirectGraphics.SetAdditiveMode(); D3DCOLOR Color = D3DCOLOR_RGBA (255, 255, 255, c); pFlare->RenderSpriteRotated (float (xPos - pTileEngine->XOffset) + 64.0f, float (yPos - pTileEngine->YOffset) + 122.0f, FlareDelay*2, Color); pFlare->RenderSpriteRotated (float (xPos - pTileEngine->XOffset) + 64.0f, float (yPos - pTileEngine->YOffset) + 122.0f, FlareDelay*2, Color); // Laser rendern // if (FlareDelay > 150.0f && ((Handlung == GEGNER_SPECIAL && int (FlareDelay) % 90 < 60) || Handlung == GEGNER_SPECIAL3)) { if (pSoundManager->its_Sounds[SOUND_BRATLASER]->isPlaying == false) pSoundManager->PlayWave (100, 128, 11025, SOUND_BRATLASER); VERTEX2D TriangleStrip[4]; // Strip für ein Sprite int Winkel; Winkel = int ((FlareDelay - 128.0f) / 4.5f) - 20; while (Winkel < 0) Winkel += 360; float l, r, o, u; // Vertice Koordinaten float tl, tr, to, tu; // Textur Koordinaten l = float (xPos - pTileEngine->XOffset + 140.0f-0.5f); // Links o = float (yPos - pTileEngine->YOffset + 215.0f-0.5f); // Oben r = float (xPos - pTileEngine->XOffset + 170.0f+0.5f); // Rechts u = float (yPos - pTileEngine->YOffset + 800.0f+0.5f); // Unten tl = 0.0f; tr = 1.0f; to = 0.0f; tu = 1.0f; TriangleStrip[0].z = TriangleStrip[1].z = TriangleStrip[2].z = TriangleStrip[3].z = 0.0f; TriangleStrip[0].color = TriangleStrip[1].color = TriangleStrip[2].color = TriangleStrip[3].color = 0xFFFFFFFF; TriangleStrip[0].x = l; TriangleStrip[0].y = o; TriangleStrip[0].tu = tl; TriangleStrip[0].tv = to; TriangleStrip[1].x = r; TriangleStrip[1].y = o; TriangleStrip[1].tu = tr; TriangleStrip[1].tv = to; TriangleStrip[2].x = l; TriangleStrip[2].y = u; TriangleStrip[2].tu = tl; TriangleStrip[2].tv = tu; TriangleStrip[3].x = r; TriangleStrip[3].y = u; TriangleStrip[3].tu = tr; TriangleStrip[3].tv = tu; // Textur setzen // #if defined(PLATFORM_DIRECTX) lpD3DDevice->SetTexture (0, pLaser->itsTexture); #elif defined(PLATFORM_SDL) DirectGraphics.SetTexture( pLaser->itsTexture ); #endif // Blitz rotieren lassen // D3DXMATRIX matRot, matTrans, matTrans2; D3DXMatrixRotationZ (&matRot, DegreetoRad[360 - Winkel]); // Rotationsmatrix D3DXMatrixTranslation(&matTrans, -l-15, -o, 0.0f); // Transformation zum Ursprung D3DXMatrixTranslation(&matTrans2, l+15, o, 0.0f); // Transformation wieder zurück D3DXMatrixMultiply (&matWorld, &matTrans, &matRot); // Verschieben und rotieren D3DXMatrixMultiply (&matWorld, &matWorld, &matTrans2); // und wieder zurück #if defined(PLATFORM_DIRECTX) lpD3DDevice->SetTransform(D3DTS_WORLD, &matWorld); #elif defined(PLATFORM_SDL) g_matModelView = matWorld * g_matView; #if defined(USE_GL1) load_matrix( GL_MODELVIEW, g_matModelView.data() ); #endif #endif DirectGraphics.SetFilterMode (true); // Blitzstrahl zeichnen // DirectGraphics.RendertoBuffer (D3DPT_TRIANGLESTRIP, 2, &TriangleStrip[0]); DirectGraphics.SetFilterMode (false); // Normale Projektions-Matrix wieder herstellen // D3DXMatrixRotationZ (&matWorld, 0.0f); #if defined(PLATFORM_DIRECTX) lpD3DDevice->SetTransform(D3DTS_WORLD, &matWorld); #elif defined(PLATFORM_SDL) g_matModelView = matWorld * g_matView; #if defined(GL1) load_matrix( GL_MODELVIEW, g_matModelView.data() ); #endif #endif DirectGraphics.SetColorKeyMode(); // Kollisionsabfrage mit Spieler durch rotierte Rechtecke (wie beim Spielerblitz) // RECT Rect; // Rechteck für die Kollisionserkennung // ein Laser-Stück wird grob durch Rect.left = 0; // ein 24x24 Rechteck abgeschätzt Rect.top = 0; Rect.right = 24; Rect.bottom = 24; float xs, ys; float xstart = float (xPos + 145.0f); float ystart = float (yPos + 203.0f); // Rechtecke für die Kollisionsabfrage rotieren lassen for (int i=0; i<25; i++) { // Zum anzeigen der Rects, die geprüft werden if (DebugMode == true) RenderRect(float(xstart-pTileEngine->XOffset), float(ystart-pTileEngine->YOffset), 24, 24, 0x80FFFFFF); // Laser auf Kollision mit dem Spieler prüfen // xs = float (xstart); ys = float (ystart); for (int i = 0; i < NUMPLAYERS; i++) if (SpriteCollision (pPlayer[i]->xpos, pPlayer[i]->ypos, pPlayer[i]->CollideRect, xs, ys, Rect) == true) { pPlayer[i]->DamagePlayer (10.0f SYNC); } // Und nächstes Rechteck // xstart += float(24*cos(PI * (360 - Winkel + 90) / 180)); ystart += float(24*sin(PI * (360 - Winkel + 90) / 180)); if (pTileEngine->BlockUnten (xs, ys, xs, ys, Rect) & BLOCKWERT_WAND) { // Funken und Rauch am Boden // if (rand()%2 == 0) pPartikelSystem->PushPartikel (xs + rand()%24, ys + rand()%24, FUNKE2); if (rand()%2 == 0) pPartikelSystem->PushPartikel (xs + rand()%24 - 15, ys + rand()%8 - 40, SMOKE2); } } } else pSoundManager->StopWave (SOUND_BRATLASER); if (FlareDelay > 800.0f) { FlareDelay = 0.0f; Handlung = GEGNER_STEHEN; } } }
void RenderWorld(void) { glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE ); glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, pyramidTex); // 在纹理矩阵中移动纹理 glMatrixMode(GL_TEXTURE); glLoadIdentity(); // glTranslatef(0.0f, -tex_y, 0.0f); // glScalef(0.0f, tex_y, 0.0f); glMatrixMode(GL_MODELVIEW); #if 0 for (int i=0; i<1; i++) { glPushMatrix(); #if 0 glColor3f(0.0f, 1.0f, 1.0f); glBegin(GL_TRIANGLE_FAN); { glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.1f, 1.1f, 0.1f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.1f, 1.1f, 0.1f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.1f, 1.1f,-0.1f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.1f, 1.1f,-0.1f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.1f, 1.1f, 0.1f); } glEnd(); glScalef(-1.0, -1.0, -1.0); glColor3f(1.0f, 1.0f, 0.0f); glBegin(GL_TRIANGLE_FAN); { glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.1f, 1.1f, 0.1f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.1f, 1.1f, 0.1f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.1f, 1.1f,-0.1f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.1f, 1.1f,-0.1f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.1f, 1.1f, 0.1f); } glEnd(); #else glColor3f(0.0f, 1.0f, 1.0f); // DrawCone(1.1, 0.13, 4); glScalef(-1.0, -1.0, -1.0); glColor3f(1.0f, 1.0f, 0.0f); // DrawCone(1.1, 0.13, 4); #endif glPopMatrix(); } #else #if 0 //glDisable(GL_TEXTURE_2D); // glColor3f(0.0f, 1.0f, 1.0f); // ConeDraw(&sCone); // glScalef(-1.0, -1.0, -1.0); // // glColor3f(1.0f, 1.0f, 0.0f); // glColor3f(1.0f, 1.0f, 1.0f); ConeDraw(&sCone); #else // glDisable(GL_TEXTURE_2D); // glDisable(GL_BLEND); RenderRect(); #endif #endif // 重置纹理矩阵 glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glEnable(GL_DEPTH_TEST); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); tex_y += 0.001f; }