//---------------------------------------------------------------------------------------------------- bool EEVideo::Play() { m_isRunning = true; m_startTime = EEGetTotalTime(); m_currentPacket = -1; m_music.Play(); // X return true; }
bool DIVAGame::Start() { // load music files auto music = m_noteMap.GetMusicPaths(); for (auto it = music.begin(); it != music.end(); ++it) { m_music[it->first] = new EEMusic(); m_music[it->first]->AsyncLoadMusic(it->second.c_str()); m_music[it->first]->SetVolume(0.5); } m_startTime = EEGetTotalTime(); m_isStart = true; return true; }
//---------------------------------------------------------------------------------------------------- bool EEVideo::Update() { if (m_isRunning) { double deltaTime = (EEGetTotalTime() - m_startTime) / m_timeBase; // handle the packets int nextPacket = m_currentPacket + 1; //int currentFrame = int(deltaTime * m_frameRate); while (nextPacket < (int)m_packets.size()) { if (m_packets[nextPacket]->dts < deltaTime) { DecodePacket(nextPacket++); } else { if (m_currentPacket != nextPacket - 1) m_currentPacket = nextPacket - 1; break; } } // handle the frames while (!m_frames.empty()) { if (m_frames.front().first < deltaTime) { m_screen.SetTexture(m_frames.front().second); m_frames.pop(); } } // the end if ((int)m_packets.size() <= m_currentPacket && m_frames.empty()) { m_isRunning = false; } return m_screen.Update(); } return false; }
bool DIVAGame::Process() { if (m_isStart) { double currentTime = EEGetTotalTime() - m_startTime; double deltaTime = currentTime - m_currentTime; m_currentTime = currentTime; // handle all notes for (auto ptr = m_notes.begin(); ptr != m_notes.end(); ) { ptr->Update(deltaTime); // Normal if (ptr->m_type == NOTETYPE_NORMAL) { switch (ptr->m_state) { case DIVA_NOTE_DEFAULT: break; case DIVA_NOTE_COOL: m_emitter.Emit(ptr->GetPosition()); ptr = m_notes.erase(ptr); continue; case DIVA_NOTE_FINE: break; case DIVA_NOTE_SAFE: break; case DIVA_NOTE_SAD: break; case DIVA_NOTE_WORST: ptr = m_notes.erase(ptr); continue; default: ptr = m_notes.erase(ptr); continue; } } // strip else { switch (ptr->m_state) { case DIVA_NOTE_DEFAULT: break; case DIVA_NOTE_COOL: m_emitter.Emit(ptr->GetPosition()); break; case DIVA_NOTE_FINE: break; case DIVA_NOTE_SAFE: break; case DIVA_NOTE_SAD: break; case DIVA_NOTE_WORST: ptr = m_notes.erase(ptr); continue; case DIVA_NOTE_STRIP_DEFAULT: break; case DIVA_NOTE_STRIP_COOL: m_emitter.Emit(ptr->GetPosition()); ptr = m_notes.erase(ptr); continue; case DIVA_NOTE_STRIP_FINE: break; case DIVA_NOTE_STRIP_SAFE: break; case DIVA_NOTE_STRIP_SAD: break; case DIVA_NOTE_STRIP_WORST: ptr = m_notes.erase(ptr); continue; default: ptr = m_notes.erase(ptr); continue; } } ++ptr; } // handle new frames while (m_noteTime <= m_currentTime) { Frame* frame = m_noteMap.GetFrame(); if (frame) { if (frame->isSetBPM) { m_singleTime = frame->GetSingleTime(); } // load files, play music for (int i = 0; i < BGS_NUM; i++) { if (frame->music[i] >= 0) m_music[frame->music[i]]->Start(); } m_noteTime = frame->timePos; } else break; } // handle notes forward (192 frames) while (true) { Frame* frame = m_noteMap.GetFrameForward(); if (frame) { for (int i = 0; i < frame->noteNum; ++i) { switch (frame->notes[i].key) { case 0: case 8: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, circleTex, stripBlueTex)); break; case 1: case 9: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, squareTex, stripBlueTex)); break; case 2: case 10: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, crossTex, stripBlueTex)); break; case 3: case 11: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, triangleTex, stripBlueTex)); break; case 4: case 12: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, rightTex, stripBlueTex)); break; case 5: case 13: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, leftTex, stripBlueTex)); break; case 6: case 14: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, downTex, stripBlueTex)); break; case 7: case 15: m_notes.push_back(DIVANote(frame->notes[i], frame->timePos - currentTime, m_singleTime, upTex, stripBlueTex)); break; } } m_noteTimeForward = frame->timePos; } else break; } m_emitter.Process(); } return true; }