void CConductor::followPlaying() { if ( m_playMode == PB_PLAY_MODE_listen ) return; if (m_wantedChord.length() == 0) fetchNextChord(); if (m_wantedChord.length() == 0) return; if (seekingBarNumber()) { if (deltaAdjust(m_chordDeltaTime) > -m_stopPoint ) fetchNextChord(); } else if ( m_playMode == PB_PLAY_MODE_followYou || m_playMode == PB_PLAY_MODE_rhythmTapping ) { if (deltaAdjust(m_chordDeltaTime) > -m_cfg_earlyNotesPoint ) m_followState = PB_FOLLOW_earlyNotes; if (deltaAdjust(m_chordDeltaTime) > -m_stopPoint ) { m_followState = PB_FOLLOW_waiting; // Throw away the time past the stop point (by adding a negative ticks) addDeltaTime( -m_stopPoint*SPEED_ADJUST_FACTOR - m_chordDeltaTime); } } else // m_playMode == PB_PLAY_MODE_playAlong { if (m_chordDeltaTime > m_cfg_playZoneLate ) { missedNotesColour(Cfg::playedStoppedColour()); fetchNextChord(); m_rating.lateNotes(m_wantedChord.length() - m_goodPlayedNotes.length()); setEventBits( EVENT_BITS_forceRatingRedraw); } } }
void CConductor::realTimeEngine(int mSecTicks) { int type; int ticks; // Midi ticks //mSecTicks = 2; // for debugging only ticks = m_tempo.mSecToTicks(mSecTicks); if (!m_followPlayingTimeOut) m_pianistTiming += ticks; while (checkMidiInput() > 0) expandPianistInput(readMidiInput()); if (getfollowState() == PB_FOLLOW_waiting ) { if (m_silenceTimeOut > 0) { m_silenceTimeOut -= mSecTicks; if (m_silenceTimeOut <= 0) { allSoundOff(); m_silenceTimeOut = 0; } } m_tempo.insertPlayingTicks(ticks); if (m_pianistTiming > m_cfg_playZoneLate) { if (m_followPlayingTimeOut == false) { m_followPlayingTimeOut = true; m_tempo.clearPlayingTicks(); m_rating.lateNotes(m_wantedChord.length() - m_goodPlayedNotes.length()); setEventBits( EVENT_BITS_forceRatingRedraw); missedNotesColour(Cfg::playedStoppedColour()); findImminentNotesOff(); // Don't keep any saved notes off if there are no notes down if (m_piano->pianistAllNotesDown() == 0) outputSavedNotesOff(); m_silenceTimeOut = Cfg::silenceTimeOut(); } } return; } m_silenceTimeOut = 0; if (m_playing == false) return; if (seekingBarNumber()) ticks = 0; m_tempo.adjustTempo(&ticks); ticks = m_bar.addDeltaTime(ticks); if (seekingBarNumber()) ticks = m_bar.goToBarNumer(); setEventBits( m_bar.readEventBits()); #if OPTION_DEBUG_CONDUCTOR if (m_realTimeEventBits | EVENT_BITS_newBarNumber) { ppDEBUG_CONDUCTOR(("m_savedNoteQueue %d m_playingDeltaTime %d",m_savedNoteQueue->space() , m_playingDeltaTime )); ppDEBUG_CONDUCTOR(("getfollowState() %d %d %d",getfollowState() , m_leadLagAdjust, m_songEventQueue->length() )); } #endif addDeltaTime(ticks); followPlaying(); while ( m_playingDeltaTime >= m_leadLagAdjust) { type = m_nextMidiEvent.type(); if (m_songEventQueue->length() == 0 && type == MIDI_PB_EOF) { ppLogInfo("The End of the song"); setEventBits(EVENT_BITS_playingStopped); m_playing = false; break; } if (type == MIDI_PB_tempo) { m_tempo.setMidiTempo(m_nextMidiEvent.data1()); m_leadLagAdjust = m_tempo.mSecToTicks( -getLatencyFix() ); } else if (type == MIDI_PB_timeSignature) { m_bar.setTimeSig(m_nextMidiEvent.data1(), m_nextMidiEvent.data2()); ppLogDebug("Midi Time Signature %d/%d", m_nextMidiEvent.data1(),m_nextMidiEvent.data2()); } else if ( type != MIDI_NONE ) // this marks the end of the piece of music { int channel = m_nextMidiEvent.channel(); // Is this this channel_muted if (!hasPianistKeyboardChannel(channel)) { if (getfollowState() >= PB_FOLLOW_earlyNotes && (m_playMode == PB_PLAY_MODE_followYou || m_playMode == PB_PLAY_MODE_rhythmTapping) && !seekingBarNumber() && m_followSkillAdvanced == false) { // Save up the notes until the pianist presses the right key if (m_savedNoteQueue->space()>0) m_savedNoteQueue->push(m_nextMidiEvent); else ppLogWarn("Warning the m_savedNoteQueue is full"); if (type == MIDI_NOTE_OFF) { if (m_savedNoteOffQueue->space()>0) m_savedNoteOffQueue->push(m_nextMidiEvent); else ppLogDebug("Warning the m_savedNoteOffQueue is full"); } } else { playTransposeEvent(m_nextMidiEvent); // Play the midi note or event ppDEBUG_CONDUCTOR(("playEvent() chan %d type %d note %d", m_nextMidiEvent.channel() , m_nextMidiEvent.type() , m_nextMidiEvent.note(), m_songEventQueue->length() )); } } } if (m_songEventQueue->length() > 0) m_nextMidiEvent = m_songEventQueue->pop(); else { ppDEBUG_CONDUCTOR(("no data in song queue")); m_nextMidiEvent.clear(); break; } m_playingDeltaTime -= m_nextMidiEvent.deltaTime() * SPEED_ADJUST_FACTOR; followPlaying(); } }
void Game::UpdateScene(float dt) { addDeltaTime(dt); theEnemies->update(dt); int levelColsize = LevelCollisions.size(); int tempOtherObject; //////updates the enemy collisions as they move std::vector <XNA::AxisAlignedBox> temp; //original value = 3 temp = theEnemies->getEnemyCollisions(); std::vector <XNA::AxisAlignedBox> tempObject; //original value = 5 tempObject = Objects->getObjectCollisions(); std::vector <XNA::AxisAlignedBox> tempLevel; //original value = 26 tempLevel = Level1->getLevelPartsCollisions(); tempOtherObject = tempObject.size() + temp.size() + tempLevel.size(); int tempSize = temp.size(); int sizeDifference = 0; sizeDifference = LevelCollisions.size() - tempOtherObject; if (sizeDifference > 0) { int something = 0; LevelCollisions.pop_back(); int j = 0; for (UINT i = tempLevel.size(); i < (tempLevel.size() + tempObject.size()); i++, j++) { LevelCollisions[i] = tempObject[j]; } if (temp.size() >= 0) { j = 0; for (UINT i = (tempLevel.size() + tempObject.size()); i < (tempLevel.size() + tempObject.size() + temp.size()); i++, j++) { LevelCollisions[i] = temp[j]; LevelCollisions[i].Center = temp[j].Center; } } } else { int j = 0; for (UINT i = tempObject.size() + tempLevel.size(); i < tempOtherObject; i++, j++) { LevelCollisions[i] = temp[j]; } } ///////////////////////////// PlayerOne->setLevelCollisions(LevelCollisions); ///////////////////////////// XMVECTOR desiredCharDir = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f); XMVECTOR playerPos = XMLoadFloat3(&mPlayerPosition); XMVECTOR camRight = XMLoadFloat3(&mCam.GetRight()); XMVECTOR camForward = XMLoadFloat3(&mCam.GetLook()); XMVECTOR camUp = XMLoadFloat3(&mCam.GetUp()); XMVECTOR multiply = XMVectorSet(0.0f, 2.0f, 0.0f, 0.0f); camUp = XMVectorAdd(camUp, multiply); bool jumpChar = false; bool moveChar = false; if (GetAsyncKeyState('W') & 0x8000) { desiredCharDir += (camForward); moveChar = true; } if (GetAsyncKeyState('S') & 0x8000) { desiredCharDir += -(camForward); moveChar = true; } if (GetAsyncKeyState('A') & 0x8000) { desiredCharDir += (camRight); moveChar = true; } if (GetAsyncKeyState('D') & 0x8000) { desiredCharDir += -(camRight); moveChar = true; } if (GetAsyncKeyState('Q') & 0x8000) { float dy = 1.5 * dt; mCam.RotateY(-dy); } if (GetAsyncKeyState('E') & 0x8000) { float dy = 1.5 * dt; mCam.RotateY(dy); } if (GetAsyncKeyState('R') & 0x8000) { float dy = 0.25 * dt; mCam.Pitch(dy); } if (GetAsyncKeyState('F') & 0x8000) { float dy = 0.25 * dt; mCam.Pitch(-dy); } if (PlayerOne->getOnGround() == true) { if (GetAsyncKeyState( VK_SPACE )) { desiredCharDir += camUp; moveChar = true; SoundSystem::Play(QUACK); } } XMVECTOR addGravity = XMVectorSet(0.0f, -30.f * DeltaTimeF, 0.0f, 0.0f); XMFLOAT3 tGrav; XMStoreFloat3(&tGrav, addGravity); XMVECTOR tGravity = XMLoadFloat3(&tGrav); if (PlayerOne->getOnGround() == true) { } else if (PlayerOne->getOnGround() == false) { desiredCharDir += addGravity; } // // Switch the number of lights based on key presses. // if (GetAsyncKeyState('0') & 0x8000) { mLightCount = 0; } if (GetAsyncKeyState('1') & 0x8000) mLightCount = 1; if (GetAsyncKeyState('2') & 0x8000) mLightCount = 2; if (GetAsyncKeyState('3') & 0x8000) mLightCount = 3; ////send player information to the camera mCam.getPlayerPos(PlayerOne->getPlayerPosition()); mCam.getDeltaTime(dt); mCam.moveCam(); PlayerOne->move(dt, desiredCharDir, theEnemies, Objects); PlayerOne->update(); }