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

[Allegro] Losowanie wartości

Ostatnio zmodyfikowano 2011-05-09 00:58
Autor Wiadomość
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); }}}
P-32698
SeaMonster131
» 2011-05-05 18:49:00
C/C++
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ę :)
P-32700
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.
P-32701
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?
P-32703
pekfos
» 2011-05-05 19:10:01
C/C++
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 :)
P-32704
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ł).
P-32705
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 ;)
P-32706
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.

C/C++
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.
    
P-32707
« 1 » 2 3 4
  Strona 1 z 4 Następna strona