fizyka wzory prawa zadania teoria, chemia teoria zadania wzory, modelarstwo szkutnicze

 
omega

Pobierz kod DWA EKARNY

 
Jak zrobić podział ekranu dla dwóch graczy w grze 2D?

Witam wszystkich czytających ten artykuł, w którym chciałbym podzielić się pewnym pomysłem, jaki można zastosować do gry 2D w przypadku, jeśli chcemy podzielić się monitorem. Spodziewany efekt końcowy widoczny jest na poniższym zrzucie działającego przykładu.
 
 Tworzenie gier 2D: dwa ekrany 1
 
Oczywiście omawiane rozwiązanie jest przedstawione w DELPHI plus OMEGA. Grafika do przykładu została pobrana z www.strefatg.be. Komponenty jakie będą potrzebne są widoczne na poniższym rysunku
 
 Tworzenie gier 2D: dwa ekrany 2

 
Za podział ekranu na dwie części odpowiedzialne są te zaznaczone- czyli OmegaSurface.

Ale po kolei.

1. Ustawiamy parametry podziału ekranu.

przyjmujemy rozdzielczość na 800x600 (ustawiamy to w Object Inspektor komponentu OmegaScreen), stąd każdy z graczy będzie mieć do dyspozycji ekran o wymiarach 400x600 pikseli. Załatwimy to w tej procedurze


 



procedure TForm1.FormCreate(Sender: TObject);
begin
OmegaScreen1.Init;
OmegaScreen1.SetHWnd(self.handle);
//parametry ekranu lewego
OmegaSurface1.SethWnd(self.handle);
OmegaSurface1.Width :=400;
OmegaSurface1.Height:=600;
OmegaSurface1.x:=0;
OmegaSurface1.y:=0;
//parametry ekranu prawego
OmegaSurface2.SethWnd(self.handle);
OmegaSurface2.Width :=400;
OmegaSurface2.Height:=600;
OmegaSurface2.x:=401;//przesuń o 1 piksel aby powstała linia graniczna
OmegaSurface2.y:=0;

OmegaFont1.Init;
OmegaFont1.CreateFont('Arial',9,[]);
OmegaFont1.Color:=OmegaColor(255,0,0);
end;

 


Tu chciałbym zwrócić uwagę, że linię podziału uzyskamy w możliwie prosty sposób- współrzędną prawego ekranu ustawimy nie na 400 ale na 401, czyli: OmegaSurface2.x:=401;
O jej kolorze zadecydują parametry czyszczenia głównego (całego) ekranu :

OmegaScreen1.ClearScreen(0,0,0,0), którą wywołujemy w "zegarze" aplikacji.

2 Algorytm rysowania pojedynczego ekranu można wykonać według kroków:

Czyść ekran
Ustaw świat dla gracza
Rysuj świat

Rysowanie na obu ekranach odbywa się w tej procedurze (pełna postać w kodzie przykładu):


 


procedure TForm1.OmegaTimer1Timer(Sender: TObject);
begin
.....
....
OmegaScreen1.BeginRender;
OmegaScreen1.ClearScreen(0,0,0,0);
......
......
//Ekran GraczA
OmegaSurface1.BeginRender;
OmegaScreen1.ClearScreen(0,0,0,0);
UstawSwiatWedlugGracza(GraczA);
OmegaSprite1.Draw;
OmegaSurface1.EndRender;

//Ekran GraczB
OmegaSurface2.BeginRender;
OmegaScreen1.ClearScreen(0,0,0,0);
UstawSwiatWedlugGracza(GraczB);
OmegaSprite1.Draw;
OmegaSurface2.EndRender;
......
......
OmegaScreen1.EndRender;
end;

 



Dlaczego OmegaSprite1.Draw? a to tylko dla tego, że nasz świat oparty jest na kostkach (20x20) klasy TSprite. Jeśli to rozwiązanie zastosujemy, to nie musimy w pętli rysować naszego świata (załatwi to za nas procedura Draw komponentu OmegaSprite) i mamy bazę wyjściową do testowania kolizji (której w tym przykładzie nie uwzględniam). Oczywiście możemy zastosować komponent OmegaMap na podobnych zasadach lub możemy obsłużyć rysowanie świata w pętli korzystając z OmegaImageList...Te problemy są na inny temat.
Ważnym elementem w naszych rozważaniach jest ta procedura:

UstawSwiatWedlugGracza(). Jak ona działa?

3 Działanie procedury: UstawSwiatWedlugGracza()

Zadaniem tej procedury jest odpowiednio przesuwać świat w ekranach obu graczy z uwzględnieniem zmiany pozycji gracza pierwszego względem gracza drugiego. Inaczej mówiąc typowe zastosowanie transformacji Galileusza- znajdź współrzędne poruszającego się układu w innym poruszającym się układzie...

Ciało wspomnianej procedury


 


procedure TForm1.UstawSwiatWedlugGracza(Gracz:TGracz);
var
k,w:integer;//to kolejne kolumny i wiersze
begin
for w:=0 to high(Warstwa0)do
for k:=0 to high(Warstwa0[0])do begin
//wartswa gruntu
Warstwa0[k,w].x:=Gracz.EkranX+Gracz.xMapy+k*OmegaImageList1.ImageList.Items[0].ImageWidth;
Warstwa0[k,w].y:= Gracz.yMapy+w*OmegaImageList1.ImageList.Items[0].ImageHeight;
..... //wartswa krzaków itp.
.....Warstwa1[k,w].x:=Warstwa0[k,w].x;
Warstwa1[k,w].y:=Warstwa0[k,w].y;
end;
if Gracz.Name='GraczA'then begin
Gracz.x:=Gracz.X0;
Gracz.y:=Gracz.Y0;
GraczB.X:=GraczB.X0+Gracz.xMapy-GraczB.XMapy;
GraczB.Y:=GraczB.Y0+Gracz.yMapy-GraczB.YMapy;
end;
if Gracz.Name='GraczB'then begin
Gracz.x:=Gracz.X0+Gracz.EkranX;
Gracz.y:=Gracz.Y0;
GraczA.X:=GraczA.X0+Gracz.EkranX+Gracz.xMapy-GraczA.XMapy;
GraczA.Y:=GraczA.Y0+Gracz.yMapy-GraczA.YMapy;
end;
end;

 



Na uwagę zasługują te linie


 
Warstwa0[k,w].x:=Gracz.EkranX+Gracz.xMapy+k*OmegaImageList1.ImageList.Items[0].ImageWidth;
Warstwa0[k,w].y:= Gracz.yMapy+w*OmegaImageList1.ImageList.Items[0].ImageHeight;

 



Gdzie zmienna Gracz.EkranX to stała wartość względnego przesunięcia obu ekranów. Wynosi ona 400 pikseli wzdłuż osi X. Na osi Y - to 0. Jest ona ustalana w momencie tworzenia graczy. Dla gracza lewego podajemy zero a dla gracza prawego 400 (patrz do procedury tworzenia gracza w kodzie programu). Zmienne Gracz.xMapy i Gracz.yMapy przechowują informację o ile pikseli przesuną się każdy z graczy w swoim świecie. Ponadto należy zwrócić uwagę na to, że gracz w swoim ekranie wyświetlany jest na środku, to świat jest przesuwany względem "duszka" gracza. Jako, że ta sama procedura została zastosowana dla dwóch graczy użyłem najprostszego pomysłu ich rozróżnienia- po nazwie własnej (GraczA, GraczB). Omawiana procedura jest wywołana dwa razy, podczas odświeżania ekranu lewego a następnie ekranu prawego.

I to by było na tyle o tworzeniu dwóch ekranów. Pozostałe elementy kodu programu to procedury tworzenia losowej mapy świata, duszków graczy i klawiszologia . Omawiany przykład nie uwzględnia zmiany współrzędnej "Z" duszka, kolizji, pilnowania dopuszczalnej granicy ruchu itp. Problemy te są przedstawione w przykładach dołączonych do komponentu Omegi.

Na zakończenie mogę jeszcze wspomnieć, że ten pomysł można zastosować do rysowania mapy świata gry. Tylko należy utworzyć jeden pomocniczy mały ekran o wymiarach przeskalowanego świata (gra byłaby rysowana w OmegaScreen1 zaś mapka w OmegaSurface). Choć myślę, że nie jest to jedyne rozwiązanie...ale, od czego są pomysły. No i oczywiście jak się pomyśli to można znacznie przyśpieszyć rysowanie światów i to ogromnych światów.

Koniec



Zobacz przepisprzepis na gofry

Zobacz przepis na wyśmienite gofry

Zobacz przepisprzepis na gofry

Zobacz przepis na bitą smietanę

Zobacz przepisprzepis na naleśniki

Zobacz przepis na naleśniki. Pyszne naleśniki

Zobacz przepisprzepis na ciasto malinowa chmurka

Malinowa chmurka- zobacz przepis

Zobacz przepisprzepis na ciasto murzynek

Murzynek- zobacz przepis

Zobacz przepisprzepis na ciasto karpatka

Karpatka- zobacz przepis

Zobacz przepisprzepis na placki ziemniaczane

Placki ziemniaczane- zobacz przepis

Zobacz przepisprzepis na placek po węgiersku

Placek po węgiersku- zobacz przepis

Zobacz przepisprzepis na burrito

Zobacz przepis na burrito meksykańskie

Zobacz przepisprzepis na burrito

Tortilla placki z indykiem- zobacz przepis