void ClientGame::draw() { //print("begin draw\n"); if(has_shaders && draw_glow) { //print("drawing with shaders\n"); //print(format("%1% %2% %3%\n") % main_fb% framebuffers[0]% framebuffers[1]); glBindFramebuffer(GL_FRAMEBUFFER, main_fb); drawScene(); //glBindTexture(GL_TEXTURE_2D, main_fb_texture); //bind fb1 glBindFramebuffer(GL_FRAMEBUFFER, framebuffers[0]); glBindTexture(GL_TEXTURE_2D, main_fb_texture); glow_fx.SetParameter("framebuffer", main_fb_texture); glow_fx.SetParameter("factor", 0.5f); glow_fx.SetParameter("step", 1.0f/window->GetWidth(), 0.0f); glClear(GL_COLOR_BUFFER_BIT); window->Draw(glow_fx); glBindFramebuffer(GL_FRAMEBUFFER, framebuffers[1]); glBindTexture(GL_TEXTURE_2D, framebuffer_textures[0]); glow_fx.SetParameter("framebuffer", framebuffer_textures[0]); glow_fx.SetParameter("factor", 0.5f); glow_fx.SetParameter("step", 0.0f, 1.0f/window->GetHeight()); glClear(GL_COLOR_BUFFER_BIT); window->Draw(glow_fx); glBindFramebuffer(GL_FRAMEBUFFER, 0); glClear(GL_COLOR_BUFFER_BIT); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glBindTexture(GL_TEXTURE_2D, main_fb_texture); Draw::drawTexturedRect(0, 0, window->GetWidth(), window->GetHeight()); //glBindTexture(GL_TEXTURE_2D, framebuffer_textures[0]); //Draw::drawTexturedRect(0, 0, window->GetWidth(), window->GetHeight()); glBindTexture(GL_TEXTURE_2D, framebuffer_textures[1]); Draw::drawTexturedRect(0, 0, window->GetWidth(), window->GetHeight()); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); } else { //print("drawing without shaders\n"); drawScene(); } if(draw_names) drawShipNames(); if(draw_scores) drawScores(); //print("end draw\n"); }
void Pong::run(float timediff) { //--Spieler input verarbeiten und Spielerskelett Zeichnen for(std::vector<Player*>::iterator it = app->players.begin(); it != app->players.end(); it++) { Player* pl = *it; if(pl != 0) { pl->processInput(timediff); pl->draw(Player::SKELETON | Player::BAR); } } if(app->players[app->PLAYER_LEFT] != 0) { if(app->players[app->PLAYER_LEFT]->getExit()) { app->switchTo(app->GS_MENU); } } if(app->players[app->PLAYER_RIGHT] != 0) { if(app->players[app->PLAYER_RIGHT]->getExit()) { app->switchTo(app->GS_MENU); } } //--Ball einfügen if(spawnBall) { timeToSpawnBall -= timediff; if(timeToSpawnBall <= 0.0f) { doSpawnBall(); } } //--Spieler Verarbeiten if(app->playersActive == 2) { drawScores(app->players[app->PLAYER_LEFT]->getScore(), app->players[app->PLAYER_RIGHT]->getScore()); if(!inMatch) { clearBalls(); spawnBall = false; timeToMatch -= timediff; if(timeToMatch <= 0.0f) { startMatch(); } } if(Application::enableEasterEggs) { doEsterEgg(app->PLAYER_LEFT, app->players[app->PLAYER_LEFT]->getEsterEgg()); doEsterEgg(app->PLAYER_RIGHT, app->players[app->PLAYER_RIGHT]->getEsterEgg()); } } else { spawnBall = true; } if(calcForces(timediff)) //--bei Kollision sound ausgeben (nur wenn Spieler drin sind) { app->soundPlayer->effect("collision"); } }
//------------------------------------------------------------------------- void mainLoop() { beginFrame(); readKeys(); switch(m_gameState) { case GSTATE_PreFrontEnd: m_scrollText = 0; m_userKeyBits = 0; m_timer = 0; m_lives = 3; m_willy.position.x = 29*8; m_willy.position.y = 64+8; m_willy.direction = 1; m_score = 0; m_oldScore = 0; m_gameState = GSTATE_FrontEnd; renderFrontEnd(FERState_PreRender); drawScores(); case GSTATE_FrontEnd: { char feState; if(!m_userKeyBits) { if(++m_timer > FETime) { m_timer = 0; m_gameState = GSTATE_TextScroll; m_scrollText = (char*)szIntroText; feState = FERState_PreTextScroll; } else { feState = FERState_TitleFlash; } } else { m_gameState = GSTATE_PrePreIngame; feState = FERState_Cleanup; } renderFrontEnd(feState); break; } case GSTATE_TextScroll: { char feState = FERState_NOP; if(!m_userKeyBits) { if(++m_timer > ScrollTimer) { if(!*(++m_scrollText)) { m_gameState = GSTATE_PreDemo; feState = FERState_Cleanup; } m_timer = 0; } } else { m_gameState = GSTATE_PrePreIngame; feState = FERState_Cleanup; } renderFrontEnd(feState); break; } case GSTATE_PreDemo: m_timer = 0; m_level = LEVEL_Central_Cavern; prepLevel(); m_gameState = GSTATE_Demo; case GSTATE_Demo: { if(m_userKeyBits) m_gameState = GSTATE_PreFrontEnd; else { runGame(); if(++m_timer > DemoTime) { m_timer = 0; if(LEVEL_The_Final_Barrier < ++m_level) m_gameState = GSTATE_PreFrontEnd; else prepLevel(); } } break; } case GSTATE_PrePreIngame: m_level = LEVEL_Central_Cavern; m_gameState = GSTATE_PreIngame; case GSTATE_PreIngame: m_userKeyBits = 0; m_hMotion = 0; prepLevel(); m_gameState = GSTATE_Ingame; case GSTATE_Ingame: { char state = runGame(); if(ColDie == state) m_gameState = GSTATE_PreDied; else if(ColDoor == state) m_gameState = GSTATE_PreBeatLevel; break; } case GSTATE_PreBeatLevel: m_gameState = GSTATE_BeatLevel; case GSTATE_BeatLevel: m_score += 24; drawScores(); m_airAmount -= 2 * AirScaler; if(m_airAmount <= 0) { m_airAmount = 0; if(LEVEL_The_Final_Barrier != m_level) { ++m_level; m_gameState = GSTATE_PreIngame; } else { m_gameState = GSTATE_Won; } } renderFrame(); break; case GSTATE_PreDied: --m_lives; undrawLife(); renderFrontEnd(FERState_FlashColour); if(!m_lives) m_gameState = GSTATE_PreLost; else m_gameState = GSTATE_PreIngame; break; case GSTATE_PreLost: m_level = LEVEL_The_Final_Barrier+1; setupLostScreen(); prepLevel(); m_gameState = GSTATE_Lost; case GSTATE_Lost: if(renderLostScreen()) m_gameState = GSTATE_PreFrontEnd; break; case GSTATE_Won: m_gameState = GSTATE_PreFrontEnd; break; } syncEndFrame(); }
//------------------------------------------------------------------------- char checkCollision(char bufferValue) { switch(bufferValue) { case WorldEmpty: case WorldSwitchRight: return ColNoCol; case WorldSpecial: return ColSpecial; case WorldWall: return ColWall; case WorldCollapse1: case WorldCollapse2: case WorldCollapse3: case WorldCollapse4: case WorldCollapse5: case WorldCollapse6: case WorldCollapse7: case WorldCollapse8: return ColCollapse; case WorldBush: case WorldRock: return ColDie; case WorldConveyor: return ColConveyor; case WorldSwitchLeft2: case WorldSwitchLeft1: { int spClass; char i, maxExtend, y1, x1, y2, x2; char switchPos = bufferValue - WorldSwitchLeft1; char spriteIndex = level2Sprite[m_level].index; char spriteCount = level2Sprite[m_level].count + spriteIndex; if(!switchPos) { y1 = 11; x1 = 17; y2 = 12; x2 = 17; maxExtend = 24; spClass = SPClass_ExtendMaxX; } else { y1 = 2; x1 = 15; y2 = 2; x2 = 16; maxExtend = 104; spClass = SPClass_Kong; } setScreenRam(screenRowStart[y1]+x1, WorldEmpty); setScreenRam(screenRowStart[y2]+x2, WorldEmpty); setScreenRam(screenRowStart[switchPositions[switchPos].y]+switchPositions[switchPos].x, WorldSwitchRight); setColourRam(screenRowStart[y1]+x1, levelColour[m_level][COLOUR_Background]); setColourRam(screenRowStart[y2]+x2, levelColour[m_level][COLOUR_Background]); for(i = spriteIndex; i < spriteCount; ++i) { SpriteData *sprt = &spriteData[i]; if(spClass & sprt->spriteClass) { if(spClass & SPClass_ExtendMaxX) sprt->curLocalStorage = sprt->max; else sprt->curDirection = 1; sprt->max += maxExtend; break; } } return ColNoCol; } case WorldKey1: case WorldKey2: case WorldKey3: case WorldKey4: case WorldKey5: { int keyPos = bufferValue - WorldKey1; int offset = screenRowStart[keyPositions[m_level][keyPos].y]+keyPositions[m_level][keyPos].x; setScreenRam(offset, WorldEmpty); setColourRam(offset, levelColour[m_level][COLOUR_Background]); ++m_keysFound; m_score += 100; drawScores(); return ColNoCol; } default: return ColFloor; } return ColNoCol; }
void runGameplay(GameVars* gameVars) { //GAME //Draw the court drawCourt(); //Draw the scores drawScores(gameVars); //Game play states switch (gameVars->gameState) { case GSGameStart: { #ifdef DEBUG debugPrint("START\x80"); #endif //Draw Ready message drawReady(0x80); //Wait for a number of frames waitForFramesThenMoveOnToNextState(60, gameVars); } break; case GSWaitForServe: { #ifdef DEBUG debugPrint("SERVE\x80"); #endif //Score max? if (gameVars->player1.score >= maxScoreForPlayer || gameVars->player2.score >= maxScoreForPlayer) { //Served - move to next state moveToNextGameState(gameVars, GEWinner); return; } //Draw player paddles movePaddles(gameVars); //Inform who is about to serve drawServe(gameVars->player1ServeNext); //wait for user to start game with button 4 readButton(); //Player 1 Button 4 or P2 Button 4 if ( (gameVars->player1ServeNext && (_BTN_CUR_MASK & _JOY1_B4)) || (!gameVars->player1ServeNext && (_BTN_CUR_MASK & _JOY2_B4)) ) { //Position the ball and make visible serve(gameVars); //Served - move to next state moveToNextGameState(gameVars, GENone); } } break; case GSPlay: { #ifdef DEBUG debugPrint("PLAY\x80"); #endif //GAME PLAY ACTION drawCenterLine(gameVars); //Draw player paddles movePaddles(gameVars); //Only deal with visible balls if(gameVars->ball.visibility == false) return; //Move ball - check for goal moveBallSprite(gameVars); } break; case GSScored: { #ifdef DEBUG debugPrint("SCORED\x80"); #endif //Goal! drawPoint(!gameVars->player1ServeNext); waitForFramesThenMoveOnToNextState(60, gameVars); } break; case GSGameOver: { #ifdef DEBUG debugPrint("GAMEOVER\x80"); #endif //Display 'Game Over' drawGameOver(gameVars->player1.score > gameVars->player2.score); //wait for user to select replay or menu readButton(); //Player 1 Button 1 if (_BTN_CUR_MASK & _JOY1_B1) { //Reset scores resetPlayerScores(gameVars); //Replay - move to next state moveToNextGameState(gameVars, GEPlayAgain); } else if (_BTN_CUR_MASK & _JOY1_B2) { //Reset scores resetPlayerScores(gameVars); //Menu - move to next state moveToNextGameState(gameVars, GEBackToMenu); } } break; default: break; } }