Pierwsza gra w DELPHI... jak się zbarać

0

Witam, mam już jako takie doświadczenie w Delphi i brak pomysłów na małe programy, więc postanowiłem że chciałbym napisać coś w stylu Bloob Volley (chyba każdy wie o co chodzi - skacze się żelkami i odbija piłkę). Chciałem zapytać jak się do tego zabrać, jakie będę potrzebne komponenty, potrzebuję żeby ktoś poprowadził mnie w tych pierwszych krokach. Na początek gra mogłaby być bez tak "zaawansowanej fizyki" jak odbijanie piłki mogłby być na początku poruszanie "żelkami" góra dół lewo prawo.

Poradzi ktoś...? Z góry dziękuję ;)

0

Poruszanie odbywa się na zmianie pozycji obiektu o daną wartość w pionie, poziomie (ew. w 3D przestrzeni jeszcze dochodzi wektor "głębi"). Piszesz grę w Delphi, więc zapewne będziesz używać obrazków (TPicture tak?). Zmieniasz jego Left i Top w zależności jak ma się poruszać. Ustalasz wektor prędkości z jakim ma się poruszać żelek, np. x: 2, y: 2. I dodajesz do left x, a do top y albo podczas update'a lub obliczasz czas jaki minął od ostatniego update'a i wyznaczasz drogę jaką ma pokonać obiekt w tym czasie, skoro ma taką prędkość, a nie inną. Na razie napisz w ruchu jednostajnym, potem w miarę możliwości dodasz lekkie przyspieszanie i zwalnianie. Ale co ze skakaniem? Tu musisz uwzględnić grawitację, że jak skoczysz, to zaraz spadniesz, a nie będziesz sztywno się poruszał w górę i w dół strzałkami. Możesz na początek się pobawić i poćwiczyć, bo od razu nie napiszesz nie wiadomo czego, jak pierwszy raz piszesz grę. Tyle na temat ruchu.

Kolizje. W necie pełno procedur, którymi możesz posłużyć się do wykrywania kolizji prostokątów, jak jesteś trochę ambitny, to weź kartkę i sam sobie takową napisz. Przy kolizji następuje zatrzymanie obiektu ew. inne zdarzenia. Jeżeli chcesz pisać właśnie taką grę z odbijaniem piłki to musisz znać podstawy fizyki. Jak pójdziesz na chłopski rozum i to napiszesz to też coś z tego będzie, ale nie będzie to dokładne i rozgrywka może stać się nieciekawa.

Co do wykrywania kiedy ma obiekt iść - sprawdzasz czy dany klawisz (dla odpowiedniego gracza) jest wciśnięty - jak tak, to przesuwasz go, jak nie - stoi.

Oczywiście do tego wszystkiego będziesz musiał wykorzystać klasy w Delphi, bo inaczej chyba tego nie zrobisz. Czyli, klasa Player - odpowiada za ruch, kolizję itd., klasa Ball - odpowiada za piłkę, jej ruch, kolizję itd. Z tym, że tak jak mówię, na początek zrób se sam ruch TPicture'a. I każda klasa powinna mieć takie coś jak procedura "Update" i "Draw", Update odpowiada za odświeżanie obiektu - czyli w klasie Player, pobierasz wciśnięte klawisze i jak są odpowiednie to aktualizujesz pozycję. W Draw rysujesz to na ekranie, czyli przypisujesz TPicture odpowiednią pozycję, możesz sklecić te 2 procedury w jedną na takim etapie. W programie, w pętli głównej (taką ma każda gra, wykonuje się, aż użytkownik nie wyłączy programu/nie kliknie klawisza odpowiadającego za wyjście z gry) wywołujesz dla każdego obiektu Update i Draw. To chyba wszystko tak na początek.

Jak coś to pytaj jeszcze, myślę, że wspólnie ci pomożemy wiedzą teoretyczną.

0

da rade napisać to tylko na delphi bez direct'a czy delphiX ?

0

No tak, pisałem o TPicture'ach, ofc można na DelphiX or DirectX, ale czy dasz sobie radę?

0

ok, więc tak, kombinuje sobie kolizje i mam już coś takiego:

procedure TForm1.FormKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
    begin if Key = VK_LEFT then Shape1.left := Shape1.left - 5;
        if Key = VK_RIGHT then Shape1.left := Shape1.left + 5;
        if Key = VK_UP then Shape1.top := Shape1.top - 5;
        if Key = VK_DOWN then Shape1.top := Shape1.top + 5;
        end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if shape1.Left < image1.Left + image1.Width then showmessage('zderzenie');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
button1.Click;
end;

end.

czyli po prostu w on keydown poruszanie
a pod timera podpiętu button który sprawdza czy jest zderzenie i wyświetla komunikat że jest zderzenie ( na razie tak roboczo).

i teraz takie pytanko, jak to zrobić żeby zamiast showmessage robiło tak że nie można już dalej przsunąć shape1., czyli tak żeby program już nie wykonywał tej linii:

if Key = VK_LEFT then Shape1.left := Shape1.left - 5;
0
        if shape1.Left < image1.Left + image1.Width then
            if Key = VK_LEFT then Shape1.left := Shape1.left - 5;
        if Key = VK_RIGHT then Shape1.left := Shape1.left + 5;
        if Key = VK_UP then Shape1.top := Shape1.top - 5;
        if Key = VK_DOWN then Shape1.top := Shape1.top + 5;

Można tak. Ale można też dodać prędkości i jeżeli jest kolizja to zerujesz prędkość, a na końcu jakiejś procedury dodajesz wektor prędkości do pozycji.

0

google niewiele mi powiedziało o prędkościach w delphi

0

Po prostu albo trzymasz 2 zmienne w klasie speedX, speedY, albo tworzysz klasę Vector2 i w niej x, y. Ustalasz wektor prędkości początkowy czyli obydwie zmienne na 0.

if Key = VK_LEFT then speed.x := -5; // jeżeli kliknięto w lewo, to prędkość pozioma na -5 (ruch w lewo)
(...)
if shape1.Left <= 0 then speed.x := 0; // jak zawadza o lewą krawędź to ustaw prędkość pozioma na 0

Poza tym Left to brzeg lewy, nie musisz tu dodawać szerokości obrazka.

0

Z komponentów to:

Co do TPicture itp. to raczej odpada jeśli chcesz osiągnąc jaką taką wydajność.

0

Nie mieszajcie mu. Powiem tyle że jak pisałem grę na TTimer i komponencie dziedziczącym po TImage to po kilku niezbędnych dodatkach, takich jak przeciwnicy i drugi gracz, gra zaczęła strasznie się ciąć. Zacząłem optymalizować kod, poprzez usunięcie komponentów z formularza i tworzenie ich dynamicznie, a potem odwoływać się do tablicy (uznałem że tablica będzie szybsza niż FindComponent) i inne poprawki, niestety to nie pomogło.

Zdruzgotany porzuciłem projekt i zacząłem pisać od nowa w DelphiX, działa jak marzenie! Nie zacina się, nie ma żadnych błędów, a jak się zostawi FullScreenMode w spokoju, to nie będzie też żadnych nieprzyjemnych niespodzianek.

Nie porównujcie DelphiX do OpenGL, bo DX jest moim zdaniem dużo prostszy, wystarczy pobrać komponenty (jest gdzieś w sieci instalka, nie trzeba sie bawić w instalowanie ręczne) i poczytać dosłownie kilka, na prawdę przejżystych artykułów (np stąd) i można śmiało pisać grę. Oczywiście jeżeli zna się biegle podstawy delphi.

W pakiecie DelphiX jest 16 komponentów, z czego spokojnie można wykorzystać 6 (DXDraw, DXImageList, DXSound, DXInput, DXSEngine, DXTimer) i napisać całkiem pełnoprawną grę. Polecam.

0

Dzięki, już pobieram DelphiX....

@Edit pobrałem DelhpiX, zainstalowałem i... moim oczom ukazało sie12 takich samych (graficznie) komponentów, którymi nie bardzo wiem jak się posłużyć, szukam przykładów i jakiś podstaw na unit1 są dosyć ciężkie te poradniki. ;(

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