[c++, allegro]jak zrobić ściany

Odpowiedz Nowy wątek
2010-11-25 23:36

Rejestracja: 9 lat temu

Ostatnio: 8 lat temu

0

witam, od niedawna bawię się w allegro i zacząłem robić jakąś prostą grę
i mam z nią mały problem: jak zrobić taką ścianę przez którą nie da się przechodzić
mój programik:

 #include <allegro.h>

int main()
{
allegro_init();
install_keyboard();

set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,800,0,0);
clear_to_color(screen, makecol(128,128,128));  

install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"");
set_volume(255,255); 

BITMAP *bufor = NULL;
BITMAP *ludek = NULL;  
SAMPLE *dzwiek = NULL;
dzwiek = load_sample("muzyka.wav");
play_sample(dzwiek, 255,127,1000,1);

bufor = create_bitmap(800,800);

ludek = load_bmp("ludek.bmp",default_palette);

int ludek_x = 100, ludek_y = 100;  

while( !key[KEY_ESC])
{

if( key[KEY_LEFT]) ludek_x--;
if( key[KEY_RIGHT]) ludek_x++;
if( key[KEY_UP]) ludek_y--;
if( key[KEY_DOWN]) ludek_y++;
clear_to_color(bufor, makecol(150,150,150));

masked_blit( ludek, bufor, 0,0, ludek_x, ludek_y, ludek->w, ludek->h);  
blit( bufor, screen, 0,0,0,0, 800,800);
}  
destroy_bitmap(ludek);
destroy_bitmap(bufor);
allegro_exit();
return 0;
}
END_OF_MAIN();  

Będę bardzo wdzięczny za pomoc

edytowany 3x, ostatnio: Allucard, 2010-11-26 01:10

Pozostało 580 znaków

2010-11-26 10:08

Rejestracja: 11 lat temu

Ostatnio: 5 godzin temu

Lokalizacja: Redmond, WA

0

jak piszesz program to nie ma czegos takiego jak sciana przez ktora nie da sie przejsc. sa tylko wspolrzedne ludka i wspolrzedne sciany ktora jest de facto prostokatem. jak sprawdzic czy ludek znajduje sie w prostokacie? powinienes wiedziec z matematyki


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2010-11-26 13:46

Rejestracja: 9 lat temu

Ostatnio: 8 lat temu

0

Byłbym bardzo wdzięczny jak by ktoś napisał ten kod
bo ja nawet nie wiem jak za to się zabrać

Pozostało 580 znaków

msm
2010-11-26 14:20
msm
Administrator

Rejestracja: 11 lat temu

Ostatnio: 4 tygodnie temu

0

Pisanie całej gry w jednej funkcji? Daleko nie zajedziesz... Spróbuj wprowadzić poniższe poprawki.

// wcześniej
struct rectangle
{
    int x;
    int y;
    int w; // width
    int h; // height
};

// w main:
rectangle rects[3];
// wypełnianie prostokątów

// przed pętlą główną:
int new_ludek_x;
int new_ludek_y;

W pętli głównej zmienić 4 ify na
if( key[KEY_LEFT]) new_ludek_x = ludek_x-1;
if( key[KEY_RIGHT]) new_ludek_x = ludek_x+1;
if( key[KEY_UP]) new_ludek_y = ludek_y-1;
if( key[KEY_DOWN]) new_ludek_y = ludek_y+1;

for (int i = 0; i < 3; i++)
{
    rectangle rect = rects[i]
    if (new_ludek_x > rect.x && new_ludek_x < rect.X + rect.w
        && new_ludek_y > rect.y && new_ludek_y < rect.Y + rect.h)
    { ludek_x = new_ludek_x; ludek_y = new_ludek_y; }
}

// rysowanie prostokątów czyli ścian
edytowany 1x, ostatnio: msm, 2010-11-26 14:28

Pozostało 580 znaków

2010-11-26 20:13

Rejestracja: 9 lat temu

Ostatnio: 8 lat temu

0

próbowałem zrobić to co napisał MSM ale niestety wyskoczył taki błąd:

------ Build started: Project: Allegro_testrun, Configuration: Debug Win32 ------
1> main.cpp
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(17): error C3646: 'rectangle' : unknown override specifier
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(17): error C3646: 'rects' : unknown override specifier
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(17): error C2090: function returns array
1>c:\documents and settings\admin\moje dokumenty\allegro_testrun\allegro_testrun\allegro_testrun\main.cpp(19): error C2447: '{' : missing function header (old-style formal list?)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

edytowany 3x, ostatnio: Allucard, 2010-11-26 20:14

Pozostało 580 znaków

msm
2010-11-27 10:19
msm
Administrator

Rejestracja: 11 lat temu

Ostatnio: 4 tygodnie temu

0
#include <allegro.h>

struct rectangle
{
        int x;
        int y;
        int w; // width
        int h; // height
};

int main()
{
    rectangle rects[3];

    for(int i = 0; i < 3; i++)
    {
        rects[i].x = rand() % 800;
        rects[i].y = rand() % 800;
        rects[i].h = rand() % 300;
        rects[i].w = rand() % 300;
    }

    allegro_init();
    install_keyboard();

    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,800,0,0);
    clear_to_color(screen, makecol(128,128,128));  

    install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"");
    set_volume(255,255);

    BITMAP *bufor = NULL;
    BITMAP *ludek = NULL; 
    int ludek_sizex = 100;
    int ludek_sizey = 100;

    bufor = create_bitmap(800,800);

    ludek = load_bmp("ludek.bmp",default_palette);

    int ludek_x = 100, ludek_y = 100;  
    int new_ludek_x;
    int new_ludek_y;

    while( !key[KEY_ESC])
    {
        new_ludek_x = ludek_x;
        new_ludek_y = ludek_y;
        if( key[KEY_LEFT]) new_ludek_x = ludek_x-1;
        if( key[KEY_RIGHT]) new_ludek_x = ludek_x+1;
        if( key[KEY_UP]) new_ludek_y = ludek_y-1;
        if( key[KEY_DOWN]) new_ludek_y = ludek_y+1;

        bool intersection = false;
        for (int i = 0; i < 3; i++)
        {
            rectangle rect = rects[i];
            if (new_ludek_x > rect.x && new_ludek_x < rect.x + rect.w
                && new_ludek_y > rect.y && new_ludek_y < rect.y + rect.h)
            { intersection = true; }
        }
        if (!intersection)
        { ludek_x = new_ludek_x; ludek_y = new_ludek_y; }

        clear_to_color(bufor, makecol(150,150,150));

        for(int i  = 0; i < 3; i++)
        {
            rectfill(bufor, rects[i].x, rects[i].y, rects[i].x + rects[i].w, rects[i].y + rects[i].h, 0);
        }

        masked_blit( ludek, bufor, 0,0, ludek_x, ludek_y, ludek->w, ludek->h);  
        blit( bufor, screen, 0,0,0,0, 800,800);
    }

    destroy_bitmap(ludek);
    destroy_bitmap(bufor);
    allegro_exit();
    return 0;
}
END_OF_MAIN(); 

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0