Example #1
0
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;
}