Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro, C++] petla while(speed>0)

Ostatnio zmodyfikowano 2010-01-30 00:34
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
[Allegro, C++] petla while(speed>0)
» 2010-01-28 21:08:38
witam, mam pytanie dotyczace tej petli, poniewaz mam taki problem:

1.program z ta petla wykonuje sie bez problemu - timer 60 frames/sek, zmienna int licznik, zmienna int sekundy
2.do programu(kodu) dopisalem funkcje, ktora trwa az do wcisniecia klawisza enter, czyli
while(speed>0) petlaB
{ kod.... licznik++;speed--;
}
kod... if(licznik==60)
{
sekundy++;
licznik=0;

do tej pory smiga dobrze, obraz wyswietla sie ok, sekundy sie dodaja itd

3. problem pojawia sie, kiedy dopisze do kodu na dole

while(!key[KEY_ENTER])petlaC
{kod}

wszystko niby dziala, bo wykonuje sie petlaB i petlaC,
oczywiscie problem nie jest zauwazalny od razu (znalazlem dopiero wyswietlajac tekst ze zmienna licznik i sekundy)
a dzieje sie tak, ze podczas wykonywania sie tej petliC, zmienna licznik dodaje sie jakby w tle, bo po wyjsciu z petliC przez enter - licznik nagle ma grubo ponad 100 (zalezy jak dlugo sie jest w petliC), natomiast sekundy sie nie dodaja, inny przyklad, ze platforma ruchoma w gore i w dol (ma warunki ustalone, ze np powyzej y=300 ma isc do gory, kiedy 0, ma isc w dol - i tak dziala bez tej petliC, ale z ta petla, po wyjsci z niej, platforma znajduje sie duzo nizej niz warunek graniczny, i ucieka po chwili z ekranu

czyli taki wniosek, ze instrukcje w petliB tej ze speed, wykonuja sie mimo, ze program tkwi w petliC??

mam nadzieje, ze polapiecie sie o co mi chodzi, bo na szybko napisalem
P-13357
malan
» 2010-01-29 09:26:07
Nie jestem pewien, ale prawdopodobnie to wina timerów allegro ;p. Ktoś już kiedyś pisał o tym, że do zmiennej dodawały się wartości itp - spróbuj poszukać tego tematu.

//edit:
http://forum.ddt.pl/?Tid=1805
P-13370
dmx81
Temat założony przez niniejszego użytkownika
» 2010-01-29 23:34:09
ok, ale w tamtym temacie sa uzyte 2 timery, mi chodzi tylko o ten while(speed>0)
tam problem rozwiazany byl, ze w drugim timerze zamiast while, uzyto if,
w moim przypadku chyba to nie da rady, chyba ze powinienem stworzyc drugi timer, jeden tylko dla poruszania ludzikiem z klawiatury, a drugi dla "reszty swiata" czyli animacji, ruchomych obiektow itd, co o tym myslisz?

bo jeszcze jest mozliwosc zatrzymania tych zmiennych na czas wykonywania sie innej petli, ze

if(petla_w_ruchu==true)
{
zmienna1=zmienna1;
zmienna2=zmienna2;
...
zmiennax=zmiennax;
}


tylko bedzie to troszke zajmowalo i miejsca i czasu, a chyba chodzi o szukanie rozwiazac jak najbardziej optymalnych ?;) dopoki takich nie mam, stosuje te, ktore poprostu spelniaja oczekiwanie
P-13396
dmx81
Temat założony przez niniejszego użytkownika
» 2010-01-30 00:34:09
dziala :) nie wiem jakie beda dalsze wyniki tej zmiany, ale zmienilem while speed>0 na if speed>0, przez co osiagnalem oczekiwany efekt, pytanie tylko, jakie beda efekty uboczne???? bo jesli "tak jest lepiej", to dlaczego od razu nie stosuje sie if, tylko while?

ps. mam juz pierwsza odpowiedz, otoz gra dziala duzo szybciej przez jakis czas, z 10sek, dopiero pozniej lapie timera i zwalnia, a to dlaczego??

to wlasnie dlatego kiedys pytalem o mechanizm pracy tego timera, ale nie dostalem odpowiedzi, a chcialem wiedziec, co dokladnie dzieje sie "w srodku", oczywiscie w miare przystepnym jezyku, bo fachowego pewnie bym nie pojal

ok juz tez znalazlem, wyswietlilem sobie poprostu zmienna speed - im dluzej zwlekalem z wyjsciem z menu poczatkowego - tym wieksza wartosc speed byla na starcie, pozniej opadala az do  - czyli inicjacje musze przeniesc w odpowiednie miejsce, zobaczymy ;) ewentualnie moze "wyzeruje" zmienna speed w odpowiednim momencie


hmm, efekty coraz dziwniejsze ;)

wczesniej byla
petla while(speed>0){...licznik++...}

jakis kod... if(licznik==60) sekundy++;

na dole funkcja jakies_info(){while(!enter){...} }

a wiec program przelatuje kod i wchodzi do funkcji jakies_info i siedzi tam az nacisne enter, obraz stoi w miejscu, wyswietla sie tylko info zadane przez ta funkcje, wychodze enterem.... i cuda sie dzieja na ekranie, licznik ma ponad kilkaset, sekundy stoja w miejscu, ruchome obiekty nie przestrzegaly kolizji i uciekaja za ekran - czyli wykonywalo sie wszytsko co w petli while(speed>0)
natomiast nie przestrzegalo zasad umieszczonych ponizej tej petli - nie dodaly sie sekundy, nie dzialaly if'y...

teraz po jakies_info dodalem speed=0(nie doslownie, bo zeruje referencje na speed, wiec na jedno wychodzi)

i co dziwne, dziala, wszytskie ruchome elementy zamarzly na czas wykonywania sie tej petli, licznik stal w miejscu, sek tez, po wyjsciu wszytsko ruszylo jak trzeba

ale calkowicie nie rozumiem dlaczego, przeciez zerowanie speed bylo dopiero PO wyjsciu z petli, wiec te nieprzewidziane ruchy powinny i tak sie wykonywac, a jednak nie??

bo jak np wrzuce speed=0 do petli while(!enter) w funkcji jakies_info, to powinno niby dzialac dobrze, bo speed jest zerowane w tej petli i nic nie powinno sie wykonac, a jednak - to wyjscie nie dziala wcale, licznik po wyjsciu z tej petli i funkcji grubo ponad 500, ruchome elementy uciekaja...
P-13400
« 1 »
  Strona 1 z 1