Level::Level( int which ) { Starfield starfield( 350 ); Hud hud; Timer *timer = Timer::Instance(); Video *video = Video::Instance(); SpriteList *spriteList = SpriteList::Instance(); Ship *player = new Ship(); // the player sprite bool quit = false; SDL_Event event; camera = Camera::Instance(); camera->Follow( player ); player->UseAI( false ); player->IsPlayer( true ); player->SetThrust( 5. ); // add player spriteList->Add( player ); Ship *test = new Ship( 15, 15 ); spriteList->Add( test ); if( SDL_Init( SDL_INIT_JOYSTICK ) != 0 ) cout << "massive joystick error" << endl; // move to an input class timer->Reset(); hud.Message( HUD_MSG_COMMAND, "Good morning, pilot." ); while( !quit ) { // erase video->Blank(); // update // get user input while( SDL_PollEvent( &event ) ) { switch( event.type ) { case SDL_QUIT: quit = true; break; case SDL_JOYAXISMOTION: cout << "joystick motion!" << endl; if(event.jaxis.which == 0) player->Turn( (float)-20 * 0.15f ); break; case SDL_KEYDOWN: switch( event.key.keysym.sym ) { case SDLK_ESCAPE: quit = true; break; case SDLK_w: player->ThrottleUp(); break; case SDLK_s: player->ThrottleDown(); break; default: break; } break; case SDL_MOUSEMOTION: if(( event.motion.xrel ) && ( event.motion.xrel != 160 )) { if( abs(event.motion.xrel) > 20 ) if(event.motion.xrel < 0) player->Turn( (float)-20 * 0.15f ); else player->Turn( (float)20 * 0.15f ); else player->Turn( (float)event.motion.xrel * 0.15f ); } break; case SDL_MOUSEBUTTONDOWN: if( event.button.button == 1) player->Fire(); if( event.button.button == 4) player->ThrottleUp(); if( event.button.button == 5) player->ThrottleDown(); break; default: break; } } for( int n = timer->GetLoops(); n ; --n ) { // update various systems camera->Update(); starfield.Update(); spriteList->Update(); hud.Update(); } // draw starfield.Draw(); spriteList->Draw(); hud.Draw(); video->Update(); timer->Delay(); } }
void DialogCharacter::Update(int delta, string &emotionId, bool finishOneTimeEmotions, bool isInBackground) { if (emotionId.length() == 0) { emotionId = defaultEmotionId; } if (characterOneTimeEmotions.count(emotionId) > 0) { OneTimeEmotion *pOneTimeEmotion = characterOneTimeEmotions[emotionId]; Video *pVideo = pOneTimeEmotion->GetVideo(); if (finishOneTimeEmotions) { pVideo->Finish(); } else { pVideo->Update(delta); } if (pVideo->IsFinished() && pOneTimeEmotion->GetTransitionToEmotion().length() > 0) { pVideo->Reset(); emotionId = pOneTimeEmotion->GetTransitionToEmotion(); } else { return; } } vector<Animation *> *pForegroundLayers = GetForegroundLayersForEmotion(emotionId); if (pForegroundLayers != NULL) { for (unsigned int i = 0; i < pForegroundLayers->size(); i++) { Animation *pAnimation = (*pForegroundLayers)[i]; pAnimation->Update(delta); } } // If this emotion is currently in the background (e.g., if the character is currently zoomed), // then we won't bother updating the eye frame duration list. if (isInBackground || characterEmotionEyeSpriteIds.count(emotionId) == 0) { return; } if (eyeFrameDurationList.size() == 0 || eyeFrameDurationList.size() != characterEmotionEyeSpriteIds[emotionId].size()) { PopulateEyeFrameDurationList(emotionId); } msElapsedCurrentEyeFrame += delta; while (msElapsedCurrentEyeFrame > eyeFrameDurationList[currentEyeFrame]) { msElapsedCurrentEyeFrame -= eyeFrameDurationList[currentEyeFrame]; currentEyeFrame++; // If we've reached the end, then we'll wrap back around and get a // new random number representing the time until the next eye blink. if (currentEyeFrame >= eyeFrameDurationList.size()) { currentEyeFrame = 0; eyeFrameDurationList[0] = (int)(rand() % 2001) + 2000; } } }