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

[Allegro] problem z kolizją ,działaniem klawiszy ,zły rozmiar obiektów , źle połorzony obiekt

Ostatnio zmodyfikowano 2012-06-24 11:50
Autor Wiadomość
dziadek94
Temat założony przez niniejszego użytkownika
[Allegro] problem z kolizją ,działaniem klawiszy ,zły rozmiar obiektów , źle połorzony obiekt
» 2012-06-23 17:45:46
Jest taki problem że gdy włączam grę ludek powinien chodzić po trawie o szerokości 250 i skakać po niej ,a spadać dopiero za trawą. Jest zupełnie inaczej bo chodzi kawałek po za trawą kawałek w trawie ,jeszcze kawałek nie da się skakać a jeszcze kawałek spada w dół ,proszę o pomoc :)
cały kod:

C/C++
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
# include <fstream>
#include <direct.h>
#include <allegro.h>

volatile long speed = 0;
bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 )
{
    if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true;
    else return false;
   
};
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
class Cpostac
{
public:
    int x, y;
    short int kierunek, klatka;
};
Cpostac ludeki;

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    clear_to_color( screen, makecol( 255, 0, 255 ) );
    BITMAP * bufor = NULL;
    BITMAP * ludek = NULL;
    BITMAP * pod = NULL;
    BITMAP * tlo = NULL;
    int sz = 0;
    int wy = 0;
    int podsz = 0;
    int podwy = 0;
    int szpostaci = 50;
    int wypostaci = 50;
   
   
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    tlo = load_bmp( "tlo1.bmp", default_palette );
    pod = load_bmp( "trawa1.bmp", default_palette );
    ludek = load_bmp( "heros.bmp", default_palette );
    int frame = 0;
    ludeki.x = 320;
    ludeki.y = 200;
    ludeki.klatka = 0;
    ludeki.kierunek = 0;
    int skok = 50;
   
    int vspeed = 0; //vertical speed
   
   
    while( !key[ KEY_ESC ] )
    {
       
       
        while( speed > 0 )
       
        {
           
            ludeki.kierunek = 0;
            if( key[ KEY_LEFT ] && ludeki.x > 0 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.kierunek = 4; ludeki.x -= 2; sz -= 2; }
            if( key[ KEY_RIGHT ] && ludeki.x < 640 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.kierunek = 2; ludeki.x += 2; sz += 2; }
            if( key[ KEY_ALT ] ) { ludeki.y -= 20; wy -= 20; }
            if( key[ KEY_UP ] && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { skok = 0; ludeki.y -= 5; wy -= 5; }
            if( skok != 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.y -= 2; wy -= 2; skok += 1; }
            if( kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 50, 50 ) == false && skok == 50 ) { ludeki.y += 2; wy = ludeki.y - 200; } //zatrzymujemy sie przy kolizji
            if( key[ KEY_DOWN ] && ludeki.y < 480 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == false ) { ludeki.kierunek = 3; ludeki.y += 2; wy += 2; }
            if( key[ KEY_LEFT ] && ludeki.x > 0 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { ludeki.kierunek = 4; ludeki.x -= 2; sz -= 2; }
            if( key[ KEY_RIGHT ] && ludeki.x < 640 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { ludeki.kierunek = 2; ludeki.x += 2; sz += 2; }
            if( key[ KEY_DOWN ] && ludeki.y < 480 - 50 && kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 ) == true ) { ludeki.kierunek = 3; ludeki.y -= 2; wy -= 2; }
           
           
            speed--;
           
            frame++;
            if( frame > 40 ) frame = 0;
           
        }
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        //rest(10);
        kolizja( ludeki.x, ludeki.y, szpostaci, wypostaci, 320, 290, 250, 50 );
        if( frame < 20 ) { ludeki.klatka = 0; }
        else if( frame >= 20 && frame < 40 ) { ludeki.klatka = 1; }
        masked_blit( tlo, bufor, 0, 0, 0, 0, 640, 480 );
        masked_blit( ludek, bufor, ludeki.kierunek * 50, ludeki.klatka * 50, ludeki.x, ludeki.y, szpostaci, wypostaci );
        masked_blit( pod, bufor, 0, 0, 320, 290, 250, 50 );
        blit( bufor, screen, sz, wy, 0, 0, 640, 480 );
       
    }
    remove_int( increment_speed );
    destroy_bitmap( pod );
    destroy_bitmap( ludek );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-58983
msz2001
» 2012-06-23 18:15:58
Najpierw naucz się ortografii:)
Zacząłem programować w wieku 10 lat, ale w szkole nie dostałem żadnej czwóry.
P-58985
dziadek94
Temat założony przez niniejszego użytkownika
» 2012-06-23 18:35:53
Dziękuje Ci za taką pomoc :) to chyba nie strona ortograficzna a programistyczna :)
ktoś inny chętny jest mi pomóc ale nie tak jak pan wyżyj? ^^
P-58991
dziadek94
Temat założony przez niniejszego użytkownika
» 2012-06-24 11:50:42
Problem rozwiązany, troszkę mniej spałem niż powinienem ale napisałem lepsza kolizje :)
kod:
C/C++
int kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 )
{
    if( x1 == x2 + s2 && y1 <= y2 + w2 && y1 >= y2 ) return( true ); //zamiast true może być 1 ,czyli kwadracik1 dotyka jednym z dwóch kątów o prawą ścianę kwadratu2
   
    if( x1 == x2 + s2 && y1 + w1 <= y2 + w2 && y1 + w1 >= y2 ) return( true ); //zamiast true może być 1 ,czyli kwadracik1 dotyka jednym z dwóch kątów o prawą ścianę kwadratu2
   
    if( x1 <= x2 + s2 && x1 >= x2 && y1 == y2 + w2 ) return( true ); //zamiast true może być 2 ,czyli kwadracik1 dotyka jednym z dwóch kątów o dolną ścianę kwadratu2
   
    if( x1 + s1 <= x2 + s2 && x1 + s1 >= x2 && y1 == y2 + w2 ) return( true ); //zamiast true może być 2 ,czyli kwadracik1 dotyka jednym z dwóch kątów o dolną ścianę kwadratu2
   
    if( x1 + s1 == x2 && y1 >= y2 && y1 <= y2 + w2 ) return( true ); //zamiast true może być 3 ,czyli kwadracik1 dotyka jednym z dwóch kątów o lewą ścianę kwadratu2
   
    if( x1 + s1 == x2 && y1 + w1 >= y2 && y1 + w1 <= y2 + w2 ) return( true ); //zamiast true może być 3 ,czyli kwadracik1 dotyka jednym z dwóch kątów o lewą ścianę kwadratu2
   
    if( x1 >= x2 && x1 <= x2 + s2 && y1 + w1 == y2 ) return( true ); //zamiast true może być 4 ,czyli kwadracik1 dotyka jednym z dwóch kątów o górną ścianę kwadratu2
   
    if( x1 + s1 >= x2 && x1 + s1 <= x2 + s2 && y1 + w1 == y2 ) return( true ); //zamiast true może być 4 ,czyli kwadracik1 dotyka jednym z dwóch kątów o górną ścianę kwadratu2
   
    return( false );
};
:)
P-59018
« 1 »
  Strona 1 z 1