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

[Allegro, C++ ] Skok postacia

Ostatnio zmodyfikowano 2011-10-06 20:50
Autor Wiadomość
Przemok123
Temat założony przez niniejszego użytkownika
[Allegro, C++ ] Skok postacia
» 2011-10-04 18:39:28
Witam

Mam sobie jakiegoś ludka, który się rusza za pomocą strzałek w prawo i w lewo wraz z animacją. Chciałbym aby on wykonywał także skok, tylko nie wiem jak za to się zabrać.

Oto kod tego mojego ludka z poruszaniem prawo, lewo + animacja:




C/C++
#include <allegro.h>

struct Cpostac
{
   
    int x, y;
    short int kierunek, klatka;
};
// Zmienna naszej struktury
Cpostac ludek;

// Inicjowanie timera
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

// Funkcja Główna
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) );
   
    BITMAP * bufor = NULL;
    BITMAP * tlo = NULL;
    BITMAP * ludekb = NULL;
    // Wgrywanie tla
    tlo = load_bmp( "tlo.bmp", default_palette );
    if( !tlo )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogę załadować obrazka tlo !" );
        allegro_exit();
        return 0;
    }
    // Tworzenie bufora
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    // Ładowanie grafiki
    ludekb = load_bmp( "animacja.bmp", default_palette );
   
    // Ustalanie początkowej pozycji ludzika
    int frame = 0;
    ludek.x = 380;
    ludek.y = 380;
    ludek.klatka = 0;
    ludek.kierunek = 0;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            ludek.kierunek = 0;
            if( key[ KEY_LEFT ] ) { ludek.kierunek = 1; ludek.x -= 2; }
            if( key[ KEY_RIGHT ] ) { ludek.kierunek = 2; ludek.x += 2; }
            //if( key[KEY_UP]) { ludek.kierunek = 1; ludek.y-=2; }
            //if( key[KEY_DOWN]) { ludek.kierunek = 3; ludek.y+=2; }
            speed--;
           
            frame++;
            if( frame > 40 ) frame = 0;
           
        }
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        blit( tlo, bufor, 0, 0, 0, 0, tlo->w, tlo->h );
        // Sterowanie animacją
        if( frame < 20 ) { ludek.klatka = 0; }
        else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; }
       
        //Wyświetlanie ludzika
        masked_blit( ludekb, bufor, ludek.kierunek * 176, ludek.klatka * 209, ludek.x, ludek.y, 176, 209 );
        blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
    }
    // Usuwanie wszystkiego z pamięci.
    remove_int( increment_speed );
    destroy_bitmap( ludekb );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-41699
SeaMonster131
» 2011-10-04 19:04:39
Kod niepotrzebny, bo wątpie, żeby ktoś Ci napisał całą gre za Ciebie. To tak..na samym początku możesz poszukać tutaj na forum tematów takich, bo było ich naprawdę bardzo dużo. Później możesz sam coś napisać. Skocz i zobacz co się dzieje: najpierw podnosisz się do góry do pewnego momentu, a później spadasz - coraz szybciej. Na początku możesz zrobić "sztywne" spadanie (czyli takie, w którym spadasz ruchem jednostajnym, czyt. z taką samą prędkością), a później zgodnie z prawami fizyki (czyli im dłużej spadasz tym szybciej lecisz), aczkolwiek to drugie też łatwo napisać. Pomyśl - napisz w kodzie i kombinuj :) Tak się zawsze najwięcej nauczysz, logicznego myślenia :)
P-41703
TenNewbie
» 2011-10-05 23:59:30
Hehe, ja też miałem spore problemy z skakaniem, na szczęście znalazłem sposób:
Stwórz zmienną np. int licznik = 0;, potem w głównej pętli zrób tak że jeżeli zostanie wciśnięta strzałka do góry to licznik = 100;
potem nadal w pętli zrób coś takiego if(licznik>0 && kolizja = true) /*oczywiście najpierw trzeba napisać kolizje*/
a w tym "IFie" napisz coś takiego ludek_y--; licznik--; + w pętli głównej musisz oczywiście mieć coś w rodzaju grawitacji, tak aby ludek ciągle opadał ludek_y++;
Jeżeli chcesz aby ludek podczas skoku wznosił się coraz wolniej, musisz stworzyć zmienną np. double licznik2 = 0; a w "IFie" zamiast ludek_y--; zrób ludek_y = ludek_y - licznik2; w głównej pętli musisz zrobić tak aby licznik2 ciągle się pomniejszał licznik2 = licznik2 - 0.25;  A i oczywiście w kolizji trzeba zresetować liczniki.   Nie wiem czy coś zrozumiałeś, ale mam nadzieje że tak :D
P-41774
akwes
» 2011-10-06 00:13:08
@TenNewbie,
nie łatwiej użyć po prostu wzoru? Lub ewentualnie ax^2 + bx + c ?
P-41775
SeaMonster131
» 2011-10-06 15:49:51
a w tym "IFie" napisz coś takiego ludek_y--; licznik--; + w pętli głównej musisz oczywiście mieć coś w rodzaju grawitacji, tak aby ludek ciągle opadał ludek_y++;
@TenNewbie: To Ci nie zadziała :P Bo postać ma np cały czas spadać, aż tam coś napotka. Więc, przy skoku postać po prostu zatrzyma się :) Bo grawitacja będzie ciągnęła go w dół z taką samą siłą jak ludek będzie skakać (czyli siły równoważą się, wypadkowa jest równa 0 ;p) :P Więc trzeba dać, że ludek ma spadać do napotkania czegoś i kiedy skok=false ;)
P-41780
TenNewbie
» 2011-10-06 16:35:29
Albo ludek_y= ludek_y -2
Straci minimalnie na płynności, raczej tego się na zauważy ;]
Nie jest ekspertem od allegro, sam w tym siedzę od niedawna, ale kilka razy już wykorzystałem mój sposób, efekt jest bardzo fajny.
P-41781
akwes
» 2011-10-06 16:40:21
Jeżeli platformówka ma cały czas jeden poziom to będzie działać :P
P-41782
wojtu111
:)
» 2011-10-06 20:28:59
A ja Ci proponuje zastosować rzut ukośny ( takie cuś z fizyki, wzory do niego łatwo znaleźć ) hymm sam na tym zrobiłem i nawet byłem zadowolony. I nie koniecznie będzie działać tylko w jednej płaszczyźnie ale można napisać że jeżeli jest kolizja bo na "coś" upadł to po prostu "wyłączyć" skok i zostawić na tej wysokości ;) Namieszałem ale może coś to pomoże. Nic nie jest łatwo, spróbuj coś napisać a my nakierujemy Cie jak dalej nie będzie działać ;)

Pozdrawiam
wojtu111
P-41795
« 1 » 2
  Strona 1 z 2 Następna strona