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

[Allegro] Kilka rzeczy do platformówki

Ostatnio zmodyfikowano 2010-08-29 12:56
Autor Wiadomość
maciejo
Temat założony przez niniejszego użytkownika
[Allegro] Kilka rzeczy do platformówki
» 2010-08-25 18:34:51
Znalazłem na tym forum temat w którym Julian miał problem skopiowałem kod z tego tematu usunalem kilka rzeczy i dodalem mape kafelkowa
-pytania:
1.Czy takie scrollowanie mapy jak zastosował easykoder będzie tu odpowiednie?
2.Jak pobierać kolizje z mapy kafelkowej przy skoku i ruchu(chyba wiadomo o co chodzi)?
Proszę o jak najszybszą odpowiedź i niezamykanie tematu jak będę jeszcze czegoś potrzebował to tu napiszę.
Link do tamtego tematu : http://forum.ddt.pl/?Tid=126&p=1
P-21204
DejaVu
» 2010-08-25 20:03:54
Temat kolizji był wielokrotnie omawiany na niniejszym forum. Jest wiele problemów związanych z kolizją obiektów będących w ruchu. Scrollowanie czy będzie odpowiednie czy też nie - zależy od tego co sobie założy programista.

Twoje pytania sugerują, że wiesz co chcesz mniej więcej zrobić, ale z punktu technicznego brakuje Ci wiedzy. Najpierw zobacz jak zrealizować kolizję dwóch prostokątów, a potem zrealizuj kolizje na dwóch prostokątach będących w ruchu. Następnie przeskaluj ten problem do n' obiektów. Na początek wystarczy Ci złożoność kwadratowa - będzie stosunkowo proste do zrobienia i będziesz mógł się skupić na pozostałych elementach gry.
P-21213
maciejo
Temat założony przez niniejszego użytkownika
» 2010-08-25 20:06:57
wiem jak zrobic kolizje prostokatow ale tylko jesli mam ich pozycje ustalona , nie wiem jak pozyskac x i y z tablicy
P-21215
DejaVu
» 2010-08-25 20:17:12
Skoro nie wiesz jak odczytywać wartości z tablicy to przeczytaj lekcję omawiającą tablice. Proponuję również na początek zrobić również program, którym będziesz sterował za pomocą strzałek np. prostokąt (czytaj: będzie się przemieszczał, jeżeli wciśniesz klawisz). Jeżeli nie wiesz jak coś takiego zrobić to znaczy, że masz braki w podstawach i powinieneś się douczyć jeszcze podstaw C++. Jak umiesz coś takiego zrobić i umiesz wykrywać kolizje między 2 prostokątami to połączenie tych dwóch rzeczy powinno być również dla Ciebie proste.
P-21221
maciejo
Temat założony przez niniejszego użytkownika
» 2010-08-25 20:21:00
Mozna mi to jakos wytlumaczyc bo nie rozumiem a lekcje o tablicach czytalem kilka razy
mam tablice:
C/C++
short int mapka[ 12 ][ 20 ] =
{
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
kafle maja rozmiar(na razie) 40x40 nie mam pomyslu jak pozyskac pozycje
P-21223
DejaVu
» 2010-08-25 20:25:13
W zasadzie pozycję na mapie możesz obliczyć bez posiadania tej tablicy. Kafel o (X,Y) będzie się mieścił na pozycji (X*40,Y*40), a długości boków będą wynosiły 40px, czyli: (X*40,Y*40,Y*40+39,Y*40+39).

/edit:
poza tym tablica ta nie zawiera informacji o pozycji tylko o obiekcie jaki znajduje się na danej pozycji.
P-21224
maciejo
Temat założony przez niniejszego użytkownika
» 2010-08-25 20:28:08
ciagle nie rozumiem
C/C++
bool kolizja( float x1, float y1, float s1, float w1,
float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};

#include <allegro.h>
BITMAP * ludek = NULL;
BITMAP * bufor = NULL;
BITMAP * teren = NULL;
short int mapka[ 12 ][ 20 ] =
{
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
void wys_mape()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 20; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 20; licznik_y++ )
        {
            blit( teren, bufor,
            ( mapka[ licznik_y ][ licznik_x ] % 4 ) * 40,
            ( mapka[ licznik_y ][ licznik_x ] / 4 ) * 40,
            licznik_x * 40, licznik_y * 40, 40, 40 );
        }
    }
};

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
   
    //clear_to_color(screen, makecol(300,300,300));
   
    bufor = create_bitmap( 640, 480 );
   
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc bufora !" );
        allegro_exit();
        return 0;
    }
    ludek = load_bmp( "grafika/gracz/ludeklewo.bmp", default_palette );
    teren = load_bmp( "grafika/plansza/teren.bmp", default_palette );
   
    if( !ludek )
    {
       
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge zaladowac obrazka Ludek !" );
        allegro_exit();
        return 0;
    }
    int klocki_x = 0, klocki_y = 400;
    float ludek_ruch_y = 0;
    float ludek_y = 370, ludek_x = 100;
    while( !key[ KEY_ESC ] )
    {
        //obsluga klawiszy;
        if( key[ KEY_RIGHT ] )
        {
            ludek_x += 2;
        }
        if( key[ KEY_LEFT ] )
        {
            ludek_x -= 2;
        }
       
        //obsługa osi Y
        if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_ruch_y == 0 ) &&( ludek_y == klocki_y ) ) ludek_ruch_y =- 10;
       
        ludek_y += ludek_ruch_y;
        if(( ludek_y + ludek_ruch_y >= klocki_y ) &&( ludek_y <= klocki_y ) )
        {
            ludek_ruch_y = 0;
            ludek_y = klocki_y;
        } else
        {
            ludek_ruch_y += 0.3;
        }
       
        rest( 10 );
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        wys_mape();
        masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y - ludek->h, ludek->w, ludek->h );
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
    destroy_bitmap( bufor );
    destroy_bitmap( teren );
    destroy_bitmap( ludek );
    allegro_exit();
    return 0;
}

END_OF_MAIN();
gdzie i co trzeba zmienic?
P-21225
ison
» 2010-08-25 20:30:40
nikt raczej za ciebie gry nie napisze... uwierz mi że jeśli takich rzeczy nie potrafisz zrobić teraz to tym bardziej nie poradzisz sobie z problemami napotkanymi w dalszej części kodzenia tej gry. Moja propozycja: odpuść sobie pisanie tej gry na jeden lub kilka dni i powtórz sobie podstawy, wtedy będzie ci znacznie łatwiej
P-21226
« 1 » 2
  Strona 1 z 2 Następna strona