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

[allegro] Niezależne przemieszczanie/animowanie obiektów na scenie

Ostatnio zmodyfikowano 2009-11-19 07:22
Autor Wiadomość
chesterr
Temat założony przez niniejszego użytkownika
[allegro] Niezależne przemieszczanie/animowanie obiektów na scenie
» 2009-11-13 22:11:51
Witam wszystkich

Odrazu problem. Pisze gre w ktorej leci statek i spuszcza bombe. Moj klopot polega na tym ze nie wiem jak zrobic aby lot statku i bomby byly nie zalezne. Moze troche takiego pseudo kodu:

C/C++
for( int i = 0; i < 800; i++ )
{
    rectfill( 20 + i, 20, 40 + i, 40 ) //rysuje statek
    clear_to_color( ekran ) // czyszcze ekran
   
    if( key[ KEY_ENTER ] ) bomba();
   
}

bomba()
{
    for( int i = 0; i < 400; i++ )
    {
        //...
        // rysuje malutki prostokat ktory porusza sie (spada) na podobnej zasadzie co  statek i czyszcze ekran
    }
}

Tutaj problem polega na tym ze gdy zaczynam spuszczac bombe czyli wchodze w funkcje bomba() to samolot znika co jest zreszta logiczne.

To tylko jedno z moich rozwiazan ktore jak reszta sie nie nadaje.
Myslalem o czyms takim jak nakladanie sie bitmap jak warstwy rodem z fotoshopa ;d

Jesli nie chce sie komus czytac calosci to:
Chcialbym sie dowiedziec jak mozna wprawic obiekty w ruch calkowicie niezalezny od siebie. Interesuje mnie algorytm. Ale bylo by tez super zobaczyc to na jakims przykladzie w allegro.

Z gory dziekuje za pomoc.
P-11550
chesterr
Temat założony przez niniejszego użytkownika
» 2009-11-14 16:17:01
chyba zem cos zabardzo pomotal ze nikt niechce pomoc ;d
nie spotkal sie ktos moze z programem gdzie np. odbijaja sie poprostu 2 pileczki od scian albo leci statek ,strzela, spuszcza bomby itp.
Interesowal by mnie fragmnet kodu (nieskomplikowanego zbytnio) jak to jest zrobione.
P-11569
DejaVu
» 2009-11-14 16:26:05
Dodałem Twój temat do kolejki oczekujących na mojej liście - nie chciało mi się czytać tej długiej treści - zobaczę później...

/edit:
Nie możesz robić animacji za pomocą zagnieżdżonych pętli. Musisz mieć natomiast zmienną do każdego obiektu, reprezentującą jego pozycję i prędkość. Niejednokrotnie ten temat był poruszany na forum i kilka razy już zdarzyło mi się dawać kod z wyjaśnieniem, więc możesz spróbować poszukać w googlach używając następującej frazy:
site:forum.ddt.pl xyz, gdzie xyz to hasło, którego szukasz.
P-11571
chesterr
Temat założony przez niniejszego użytkownika
» 2009-11-15 00:26:37
Przedewszystkim to dziekuje za czas ktory sie znalazl i dla mnie :)

hmm.. wygoglowalem ze mozna by to za pomoca switch'a zrobic na zasadzie:


zmienna++
switch(zmienna)
{
 case 0: ... //samolot w pozycji startowej
 case 1: ... //samolot w pozycji startowej+1
 itp.
}

wiele jest programow np. na gamedev gdzie moglbym podejrzec jakie ludziska maja na to sposoby ale prawie nikt kodu nie zalacza. W kazdym razie ja na dzis sie poddaje.
P-11582
DejaVu
» 2009-11-15 01:38:21
Switch to słaby pomysł ;p
P-11584
malan
» 2009-11-15 22:54:32
Może to Ci coś pomorze:
C/C++
int samolot_pozx = 0; // Pozycja 'x' samolotu
int samolot_pozy = 150; // Pozycja 'y' samolotu

bool bomba = false; // Czy mam zrzucić bombę
int bobma_pozx = 0; // Pozycja 'x' bomby
int bomba_pozy = 150; // Pozycja 'y' bomby

//...

while( !key[ KEY_ESC ] )
{
    // Przykładowe sterowanie samolotem
    if( key[ KEY_LEFT ] ) samolot_pozx--;
   
    if( key[ KEY_RIGHT ] ) samolot_pozx--;
   
    if( key[ KEY_UP ] ) samolot_pozy++;
   
    if( key[ KEY_DOWN ] ) samolot_pozy--;
   
    // Jeśli wciśnięto enter zrzuć bombę
    if( key[ KEY_ENTER ] ) if( !bomba ) bomba = true;
   
    if( bomba )
    {
        if( bomba_pozy >= 0 ) // Dopóki bomba nie doleci do ziemi...
        {
            bomba_pozy--; // ... zmniejsz jej pozycję
        } else
        {
            bomba = false; // Jeśli doleciała zakończ wyświetlanie...           
        }
       
        masked_blit( /* ... */, bomba_pozx, bomba_pozy, /* ... */ );
       
    } else
    {
        bomba_pozx = samolot_pozx;
        bomba_pozy = samolot_pozy;
    }
   
    masked_blit( /* ... */, samolot_pozx, samolot_pozy, /* ... */ );
   
    // Wyświetlanie bufora na ekran
}
P-11604
pompom
» 2009-11-16 16:45:35
Ogólnie to można zrobić tak:
masz kolejkę (albo listę bądź stos) z obiektami w grze, jest jedna pętla:
- pobierasz współrzędne obiektów i je rysujesz (albo wywołujesz metodę rysuj obiektu i on sam siebie rysuje... wszystko jedno)
- sprawdzasz, czy coś naciśnięto/ruszono się myszką/itd - jeśli tak, informujesz o tym zainteresowane obiekty, np. statek (zmieni później swoją pozycję)
- mówisz obiektom, żeby się ruszyły - czyli np. bomba spadnie trochę
- koniec pętli

Każdy krok to pętla przez całą kolejkę, dla wszystkich obiektów. Krok drugi można uprościć tworząć osobną strukturę zainteresowanych obiektów, ale jeśli jest ich mało i tak nie zrobi to różnicy.

Uwaga: jedna akcja na pętlę. Tzn - powiedzmy że bomba dotknęła ziemi - powinna wybuchnąć. Nie wybuchasz, ale zapisujesz sobie w obiekcie, że masz wybuchnąć i wybuchasz dopiero w następnej iteracji.
A jak bomba wybuchnie to usuwasz ją z kolejki (ona sama siebie usuwa) i tworzy nowy obiekt wybuchu.

Zostaje ci jeszcze problem kolizji. Najprostszy sposób - tablica vector<bool> dla wszystkich pikseli gry. Jeśli dany piksel jest zajęty, to jest true. Każdy obiekt przy ruchu sprawdza, czy nie ma kolizji, jeśli nie ma, najpierw usuwa siebie z tablicy (zwalniając pola, czyli ustawiając na false), a następnie wypełnia z nową pozycją.

Bardziej skomplikowanym rozwiązaniem jest struktura z informacją, co pod danym pikselem (niekoniecznie pikselem, po prostu jednostką przestrzeni, bo tą można różnie podzielić) jest. Czyli np. pustka to będzie powietrze, coś innego to budynek, ziemia itd. Umożliwia to bardziej skomplikowane interakcje - np. piłka spadająca na miękką powierzchnię może odbić się inaczej od twardej itd.
P-11608
chesterr
Temat założony przez niniejszego użytkownika
» 2009-11-18 18:44:41
O to chodzilo... dzieki za pomoc malan oraz pompom. Juz pracuje nad programem w ktorym odbijam pileczkami i wszystko zagniezdzam w if'ach tak by wykonywala sie wlasnie jedna akcja na jedna iteracje.

Jeszcze jeden problem mam gdy chce odbic pilczke od sciany pod takim katem z jakim na nia wleciala. Mysle ze bedzie trzeba pobrac jakos kat wtedy kiedy pileczka dotknie sciany i z takim samym katem ja wypuscic... to tak w teorii :d
P-11661
« 1 » 2
  Strona 1 z 2 Następna strona