thamiar Temat założony przez niniejszego użytkownika |
[Allegro] Losowanie wartości » 2011-05-05 18:44:27 Witam :) Otóż mam następujący problem. Stworzyłem planszę po której ludzika gracza goni przeciwnik. Gdy nastąpi kolizja, po wciśnięciu action button, na przeciwniku pojawia się chmurka (Symbolizująca atak). Chciałbym jednak by postać raz trafiała (jakaś animacja) a raz nie (inna animacja). Chciałem to zrobić na prostej zasadzie znanej z C++, niestety (O dziwo, tutaj się nie sprawdza...) Nie wstawiam całego kodu, bo sądzę, że nie potrzeba. Kiedy w Ifie usunę "hit=(rand()%1);", dymek pojawia się po wciśnięciu Z... problem więc jedynie w losowaniu. //zainicjalizowanie generatora liczb pseudolosowych czasem srand(int(time(NULL))); int hit=1;
[...] if( kolizja( player.x, player.y, player.s, player.w, enemy.x, enemy.y, enemy.s, enemy.w)==true){if(key[KEY_Z]) { hit=(rand()%1); if(hit==1){masked_blit( dymek, bufor, 0, 0, enemy.x+10, enemy.y+10, enemy.s, enemy.w); }}}
|
|
SeaMonster131 |
» 2011-05-05 18:49:00 int CzyAtakUdany;
if( kolizja ) { CzyAtakUdany = rand() % 100; if( CzyAtakUdany <= 50 ) Atak(); else NieMaAtaku(); } Gdy nastąpi kolizja, w tym wypadku jest ~50% szansy że atak powiedzie się :) |
|
szyx_yankez |
» 2011-05-05 18:57:06 hit =( rand() % 1 )
Reszta z dzielenia przez 1 to zawsze 0, więc warunek Ci się nigdy nie spełni.
Musisz obliczyć reszte z dzielenia przez 2.
A dodatkowo, aby to poprawnie działało, potrzebne Ci są informacje czy klawisz jest wciśnięty czy zwolniony. |
|
thamiar Temat założony przez niniejszego użytkownika |
» 2011-05-05 19:06:36 Znaczy, chodzi o to, żeby odpaliło dopiero wtedy, kiedy się wciśnie i puści tak?
Trzeba to robić przejmując inport klawiatury programowaniem nisko poziomowym, czy jest jakiś łatwiejszy sposób? |
|
pekfos |
» 2011-05-05 19:10:01 bool pr = false; if( key[ KEY_SPACE ] ) pr = true;
if( !key[ KEY_SPACE ] && pr ) { mr = false; } Trzeba to robić przejmując inport klawiatury programowaniem nisko poziomowym, |
przekombinowałeś.. wystarczy pomyśleć i w końcu znajdzie się proste i skuteczne rozwiązanie :) |
|
szyx_yankez |
» 2011-05-05 19:17:34 Znaczy, chodzi o to, żeby odpaliło dopiero wtedy, kiedy się wciśnie i puści tak? |
Nie!
Chodzi o to, że za "każdym" obiegiem pętli wartość zmiennej 'hit' będzie Ci się zmieniać w związku z tym obrazek będzie migał(wyświetlał/nie wyświetlał).
|
|
SeaMonster131 |
» 2011-05-05 19:32:18 @pekfos: kod(1)error: expected ',' or ';' before 'if' kod(4)error: 'mr' was not declared in this scope
hehe ;) |
|
thamiar Temat założony przez niniejszego użytkownika |
» 2011-05-05 19:34:33 Ogólnie wielkie dzięki za odzew i chęć pomocy :) Szyx_yankez Faktycznie, obraz znika po kolejnym kopiowaniu bufora i przy wciśniętym "Z" miga. Na początku pomyślałem, że można by dać jakąś zmienną, przy trafieniu ustawić jej wartość np. na 10, a potem wyświetlać ową chmurkę dla wartość>0 (Pod koniec każdej pętli dając wartość--. Ale posłucham rady mądrzejszych od siebie :) A więc wciskanie/zwalnianie klawisza. Pekfos Faktycznie, o czymś takim nie pomyślałem! Po prostu aktualnie na zajęciach z Computer Architecture mam Low level programming i tylko do wpadło mi do głowy. Rozumiem, że nagłe pojawienie się "mr" to literówka? Bo jeśli nie, niestety nie rozumiem. if( kolizja( player.x, player.y, player.s, player.w, enemy.x, enemy.y, enemy.s, enemy.w ) == true ) { bool pr = false; if( key[ KEY_Z ] ) pr = true; if( !key[ KEY_Z ] && pr ) { pr = false; if( hit == 1 ) { masked_blit( dymek, bufor, 0, 0, enemy.x + 10, enemy.y + 10, enemy.s, enemy.w ); } else; } } Niestety, przy takim kodzie, chmurka w ogóle się nie pojawia. Tak wiem, pewnie durny błąd, ale proszę o wybaczenie, dopiero zaczynam przygodę z programowaniem. |
|
« 1 » 2 3 4 |