Cześć
Eksperymentuje obecnie z synchronizacją prostych efektów z muzyką. Muzyka jest napisana w postaci modułu trackerowego. API playera muzyki zwraca wiersz patternu, co można wykorzystać do synchronizacji. W patternie jest 64 wiersze (numerowane od 0 do 63). W związku z tym mam dwa zagadnienia:
1. Zależy mi, aby w przypadku zwrócenia przez API, że grany jest wiersz o numerze 8, 16, 32 i tak dalej dodając 8 aż do 63 na ekranie pojawił się biały błysk. Warunek sprawdzający mam skonstruowany tak (rowNumber to numer aktualnie granego wiersza):
if (rowNumber % 8 == 0 ||
rowNumber % 8 == 2 ||
rowNumber % 8 == 3 ||
rowNumber % 8 == 4 ||
rowNumber % 8 == 5 ||
rowNumber % 8 == 6 ||
rowNumber % 8 == 7 ||
rowNumber % 8 == 8)
{
whiteFlash();
}
Można jakoś tą rozbudowaną logikę sprawdzającą w nawiasie uprościć i zastąpić bardziej czytelnym kodem? Muzyka ma paręset wierszy w pattermach i oprogramowanie synchronizacji białego błysku do tych wierszy zajmie bardzo dużo sprawdzających warunków logicznych:)
2. Przejście pomiędzy jednym efektem a drugim ma odbyć się w postaci białego błysku. Kod rysujący figury w zależności od tego jaki wiersz modułu muzycznego jest grany przedstawia się następująco:
if ((rowNumber >= 0) && (rowNumber <=127))
{
drawFigure1();
}
if (rowNumber == 128)
whiteFlash();
if ((rowNumber >= 129) && (rowNumber <=256))
{
drawFigure2();
}
Gdy odgrywany jest 128 wiersz ma być biały błysk pomiędzy jednym efektem a drugim, a niestety tego białego błysku nie ma. Kod dotyczący białego błysku działa na 100% poprawnie, ponieważ jak się wywoła biały błysk w czasie trwania jakiegoś efektu to jest ładnie widoczny. Co może być przyczyną tego, że biały błysk nie jest widoczny pomiędzy jednym a drugim efektem? Oto poniżej kod odpowiedzialny za biały błysk:
void whiteFlash()
{
glLoadIdentity();
glTranslatef (0.0f, 0.0f, -5.0f);
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);
glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);
if (alpha <= 1)
{
glColor4f(1.0, 1.0, 1.0, alpha);
glBegin(GL_QUADS);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
alpha += 0.025;
}
else
{
glColor4f(1.0, 1.0, 1.0, alpha_inv);
glBegin(GL_QUADS);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
alpha_inv -= 0.025;
}
glDisable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
return;
}
Dziękuję z góry za odpowiedzi