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 |
|
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. |
|
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 |
|
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. |
|
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: 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 |
|
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. |
|
maciejo Temat założony przez niniejszego użytkownika |
» 2010-08-25 20:28:08 ciagle nie rozumiem 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 ); 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 ] ) { if( key[ KEY_RIGHT ] ) { ludek_x += 2; } if( key[ KEY_LEFT ] ) { ludek_x -= 2; } 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? |
|
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 |
|
« 1 » 2 |