Warsztat - Programowanie gier komputerowych :: Opis prostego sposobu na uzyskanie rzutu izometrycznego
Strona główna Forum Szukaj Lista użytkowników
Grupy
Zarejestruj Zaloguj
Artykuły
Kliknij na kategorię żeby dodać artykuł Szukaj
Programowanie gier » Artykuły » Grafika 2D [Wersja do
drukowania]
Opis prostego sposobu na uzyskanie rzutu izometrycznego
Opis Implementacja map izometrycznych - Część 1
Autor Piotr Zięzio Data Czw 07 Paź, 2004 9:34 pm Typ ***
Słowa klucze
Kategoria Grafika 2D
Odsłony 741
Opis prostego sposobu na uzyskanie rzutu izometrycznego
Implementacja map izometrycznych - Część 1
Witam. To mój pierwszy tekst na temat programowania
gier. Chciałbym opisać rzecz bardzo użyteczną w wielu
rodzajach gier - mapy izometryczne. Ostatnio rozpocząłem
prace nad prostą grą strategiczną i stąd ten pomysł.
1. Pola
Polami izometrycznej mapy są najczęściej równoległoboki.
Przy renderowaniu budynków i wszystkich innych obiektów
należy przejść do widoku Front, a następnie je obrócić
wokół osi pionowej (Y) o 45 stopni, a wokół osi poziomej
(X) o 30 stopni.
Ja używam pól o wymiarach 98x49 pikseli (to czerwone
powyżej) takich jak w Age Of Empires, można używać też
pól o rozmiarze, np. : 32x16.
Przy wybieraniu rozmiaru pól należy pamiętać by krawędź
miała kształt schodów po 2 piksele w poziomie i 1 w
pionie. Znacznie wygładza to kształt pól i polepsza
ogólny efekt.
2. Mapa
Sposób zapisu mapy izometrycznej niczym nie różni się o
innych rodzajów map. Również wszystkie operacje
wykonywane na takiej mapie (odnajdywanie drogi, itp.) są
identyczne jak w normalnej.
type TMapa = record
Tytul : string;
szerokosc, wysokosc : integer;
Teren : array[0..width,0..height] of byte;
end;
3. Rysowanie
Analizując gry z izometryczną mapą zauważyłem dwa
sposoby jej rysowania:
- Cała mapa jest równoległobokiem, np. Age Of Empires
- Cała mapa jest prostokątem, np. Fallout
Sposób 1: (Kod w Delphi dla pól 98x49)
procedure Wyswietl_teren(var mapa : TMapa; przesx,przesy
: integer);
var a,b : integer;
begin
for a:=0 to Mapa.wysokosc do
for b:=0 to Mapa.szerokosc do
DXImageList.Items[Mapa.Teren[a,b]].Draw(dxdraw.surface,(48*przesx)-b*48+a*48,(24*przesy)+b*24+a*24,0);
end;
// przesx, przesy - przesunięcie mapy na ekranie
Wyjaśnienie :
Współrzędna X = (0.5 szerokości pola * przesx)- b * 0.5
szerokości pola + a * 0.5 szerokości pola
Współrzędna Y = (0.5 wysokości pola * przesy)+ b * 0.5
wysokości pola + a * 0.5 swysokości pola
Liczby w procedurze (48,24) należy samemu dopasować do
rozmiarów swoich pól, tak by pola były prawidłowo
połączone. Można też połączyć je tak by zostały pomiędzy
polami puste linie (jak w The Sims).
Sposób 2: (Kod w Delphi dla pól 98x49)
Gdy mapa jest prostokątem sprawa znacznie się upraszcza.
procedure Wyswietl_teren(var mapa : TMapa; przesx,przesy
: integer);
var a,b : integer;
begin
for a:=0 to Mapa.wysokosc do
for b:=0 to Mapa.szerokosc do
if a mod 2 = 1 then
DXImageList.Items[Mapa.Teren[a,b]].Draw(dxdraw.surface,(48*przesx)+a*98,(24*przesy)+b*49,0)
else
DXImageList.Items[Mapa.Teren[a,b]].Draw(dxdraw.surface,(48*przesx)+a*98+48,(24*przesy)+b*49,0);
end;
Rysujemy jak normalną mapę z kwadratów,a co drugi wiersz
przesuwamy o pół szerokości pola.
4. Rysowanie obiektów
Obiekty gry takie jak drzewa czy budynki rysujemy
podobnie pola mapy.
Wszystkie obrazki są prostokątami więc musimy je
dodatkowo przesunąć - odjąć jakieś wartości od obu osi.
5. Przesuwanie
Przesuwając mapę odwrotnie przekształcamy zmienne, gdyż
co dopiero podczas pracy z izometrycznymi mapami
zauważyłem, gdy naciskamy strzałkę w lewo tak naprawdę
mapę przesuwamy w prawo.
Pseudokod:
if Left przesx:=przesx+1;
if Right then przesx:=przesx-1;
if Up then przesy:=przesy+1;
if Down then przesy:=przesy-1;
if mouse.x=0 then przesx:=przesx+1;
if mouse.x=799 then przesx:=przesx-1;
if mouse.y=0 then przesy:=przesy+1;
if mouse.y=599 then przesy:=przesy-1;
6. Rozbudowa
To oczywiście dopiero początek mechanizmu izometrycznej
mapy w twojej grze. Nie opisałem tu np. tworzenia
animowanych pól (woda). Warto również dodać drugą
tablicę z tzw. Mgłą wojny (Fog of War) - zaciemnienie
niepoznanych obszarów.
7. Zakończenie
Ten sposób implementacji izometrycznych map wymyśliłem
sam i wiem, że nie jest on najlepszy, ale działa szybko
i do podstawowych zastosowań wystarcza.
Jestem w fazie testów więc jak coś wymyślę to pojawi się
część druga. Myślę właśnie nad funkcjami pozwalającymi
na sprawdzenie które pole/obiekt został kliknięty.
Wszelkie uwagi dotyczące tego tekstu proszę słać na
adres PiotrZiezio@poczta.onet.pl
Autor: Piotr Zięzio
Skocz do: Wybierz forumWarsztat - Programowanie
gier komputerowych|--Szkółka| |--Szkółka -
języki| |--Szkółka - grafika| |--Szkółka -
inne|--Programowanie gier| |--Ogólnie|
|--Dźwięk| |--Sztuczna Inteligencja|
|--Inne|--Programowanie grafiki|
|--Programowanie grafiki| |--OpenGL|
|--DirectX|--Produkcja| |--Pomysły|
|--Projektowanie| |--Projekty| |--Grafika|
|--Ogłoszenia|--O czym innym| |--Konferencje,
spotkania| |--Warsztat| |--Aktualności|
|--Artykuły| |--Wykłady| |--Compo|
|--Lepperlandia|--Śmietnik| |--Z odrzutu
Powered by Knowledge Base, wGEric (C) 2002 PHPBB.com MOD
This script (Knowledge Base - MX Addon v. 1.03e) is modified
by Haplo
W1.5b (C) 2004
[admin: ayufan, g[R]eK, Goliatus, mikael_, Regedit]
Wszystkie czasy w strefie CET (Europa)
Powered by phpBB2 Plus 1.52 based on phpBB 2.0.10 © 2001, 2002 phpBB
Group :: FI Theme :: Mody i Podziękowania
Wyszukiwarka
Podobne podstrony:
Jednominutowy Negocjator Proste sposoby na korzystniejsze kontrakty jednegPoznaj proste sposoby na pozbycie się pajączkówZen To Done Proste sposoby na zwiekszenie efektywnosciProste sposoby na brzydkie zapachySposob na wlasny pradTalizman Venus lub sposób na kobietęKIJAK M Stres 15 najskuteczniejszych sposobów na radzenie sobie ze stresemDomowe sposoby na piękne dłonie i paznokcieJak złamać hasło na Onet poczte działa rewelacyjnie sposób na hasla password hack haker haslo10 sposobów na pozbycie się stresuwięcej podobnych podstron