Skocz do zawartości

Grafika izometryczna, postać wyższa od kafelka


ammate

Polecane posty

Napisałem sobie wyświetlanie grafiki izometrycznej opisaną w wątku Teraz chciałem sobie dorobić ustawienie/poruszanie postaci po warstwie pierwszej. Wymyśliłem chyba słusznie :), że postać to nic innego jak kafelek i trzeba ją tak samo wyświetlać. No i jeśli postać ma takie same rozmiary jak kafelek to działa :) Jest tylko jeden problem. Jeśli kafelek ma rozmiar 36x36 a postać 36x54 to źle ją pokazuje. Wymyśliłem takie coś. Dziele postać na dwie części i wyświetlam dolną część przy Z = 1 a górną dla Z = 2. Działa ok, mam jednak pytanie czy może jest jakiś inny sposób?

Link do komentarza
Udostępnij na innych stronach

tak jest bardzo prosto zamiast dzielić postać na 2 obrazki wyświetlasz 1 przesunięty odpowiednio a jest na to prosty sposób zawsze wyświetlasz Y wierszy kafelków i X kolumn wiec postać musisz wyświetlić w pozycji :

 

ypos := (y*wysokosc_kafelka\2)-wysokosc_postaci;

 

druga pozycje analogicznie

 

oczywiście to jest wzór dla rzutu prostego nie izometrycznego ale łatwo jest go przerobić ;)

 

@krajew4

chodzi tu o to ze mu sie postac przesowa w dol ;)

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

tak jest bardzo prosto zamiast dzielić postać na 2 obrazki wyświetlasz 1 przesunięty odpowiednio a jest na to prosty sposób zawsze wyświetlasz Y wierszy kafelków i X kolumn wiec postać musisz wyświetlić w pozycji :

 

ypos := (y*wysokosc_kafelka\2)-wysokosc_postaci;

 

druga pozycje analogicznie

 

oczywiście to jest wzór dla rzutu prostego nie izometrycznego ale łatwo jest go przerobić ;)

 

@krajew4

chodzi tu o to ze mu sie postac przesowa w dol ;)

 

Przyznam, że nie za bardzo to rozumiem. Moje wzory na wyświetlenie kafelków/postaci:

 

// sx = ((x-y) * (width/2)) - mx

// sx - Współrzędna x pola na ekranie.

// x - Współrzędna x pola na mapie.

// y - Współrzędna y pola na mapie.

// width - Szerokość (width) kafelka (grafiki)

// mx - Pozycja mapy (współrzędna x)

int widthTile = 36;

 

int width = widthTile / 2;

 

int mx = 180;

 

int sx = ((x - y) * width) + mx;

 

// sy = ((x + y) * (height/2)) - my

// sy - Współrzędna y pola na ekranie.

// x - Współrzędna x pola na mapie.

// y - Współrzędna y pola na mapie.

// height - Wysokość (height) kafelka (grafiki)

// my - Pozycja mapy (współrzędna x)

int heightTile = 18;

 

int height = heightTile / 2;

 

int my = 100 - (heightTile * layer);

 

int sy = ((x + y) * height) + my;

 

Czy byłbyś wstanie wytłumaczyć i napisać jak to poprawić ? Jest to rzut izometryczny.

Link do komentarza
Udostępnij na innych stronach

ehh

 

zakladamy ze wyswietlasz postac w pkt (X,Y)

 

i twoj problem polega na tym ze postac jest za "nisko"

 

wiec po prostu odejmiej wysokosc postaci od zmiennej Y

 

pkt (X,Y-wysokosc_postaci+wysokosc_kafla)

 

u ciebie to bedzie (X,Y-54+36)

 

wzor ktory ja podalem dziala wtedy jesli postac ma byc caly czas na srodku ekranu (ten z wczesniejszego posta, w tym moze byc w dowolnym miejscu). Nie wiem ja ci to prosciej wytlumaczyc...

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

ehh

 

zakladamy ze wyswietlasz postac w pkt (X,Y)

 

i twoj problem polega na tym ze postac jest za "nisko"

 

wiec po prostu odejmiej wysokosc postaci od zmiennej Y

 

pkt (X,Y-wysokosc_postaci+wysokosc_kafla)

 

u ciebie to bedzie (X,Y-54+36) <-- liczby z twojego 1 posta

 

wzor ktory ja podalem dziala wtedy jesli postac ma byc caly czas na srodku ekranu (ten z wczesniejszego screenposta, w tym moze byc w dowolnym miejscu). Nie wiem ja ci to prosciej wytlumaczyc...

 

Chyba opiszę to szerzej bo Twoja wskazówka nie działa u mnie :)

 

Mam czytanie mapy:

 

                
               for (int z = 0; z < 10; ĘĘB
[HfCĄ((                         int number = reader.ReadInt32() - 1XLVKHH[X$ŹśzźŹŁ')B
[^YH^Y     L^YĘĘBf\"BfC\0(ĄąŹŹ(              {
                       // Rysowanie  kafelkK[[^HXXLVK^YpFĆRF
ĆRFĆTĆ7EśćFWÓźźĄĄŃź                            // sx - Współrzędna x pola na ekX[YKH<HH&Rw7;7'ŚFćń(źźŃM(width) kafelka (grafiki)
                           // mxHXHXH
<H
BgBvGFFĆR3cB
ŃŃĄQąź((                      int sx = ((x - y) * width) + mx;

  HH


JH

ZYJHH^B7w7;7'ŚFćĆćV(źź]ąĄ mapie.
                           // y - Współrzędna y poXHHXYKZYHVvBśfVĆśw& amp;fśAĄ(
t heightTile = 18;

                           int height ZY[H [^HHZYFĆRĆW#B7
ĄĄŹ((ŃąĄcs, new Point(sx, sy));
                       }

       [YHXK7F2w&72ĆW\"\0(($qnj,ŁĄśĘŁzvŁŚ'hŹ,(2jvśŹaś0źek?vDWJ?OW)BXXYXĘX[[K[VW\& quot;bb333łF2b333łF((
Ń(((         if (layer > 2 || layer == 0)
               re]H

^JH

YJHH^7w7;7'ŚFćĆćV&ćRą(źź]pola na mapie.
           // width - Szerokość (width) kaf[H
YZJB^HXHXH
& lt;HBvGFFĆR3cBvGFeŃĄQąź((
(((int)(this.x - this.y) * width) + mx;

           // sy = 

JH

ZYJHH^BHH<HGĆćV&ćRw7;7'ŚFćĆć(źź]ą(   // height - Wysokość (height) kafelka (grafiki)
       ^HHXHXH
<H
B[ZYEFĆRBVvBVvEFĆR#\0ĄĄĄŃQąĄą(( = (int)((this.x + this.y) * height) + my;

           if ^YOHJB<rG& amp;tvRr77b!ą((źź
(     g.DrawImage(img, sx, sy);
           }
       }
$ĄśśĘŁyĆZw)k7Śś^aś0źek?ęĘ<RcOW)BY
     HH       HHb333łĆW\"&WGW&\0((źźĄĄŃź(   // sx - Współrzędna x pola na ekranie.
           // x <HHHXYKHH<GĆćRvGF7ŚW&śnbvGFśąĄ(źźAĄx)
           int widthTile = 36;

           int width =Y[H[^H [bF2F2vGF7ĄŹĄĄĄ
ź(źź] pola na ekranie.
           // x - Współrzędna x pola na XYKHH<HHHHXYKVvBw6śnbVvBśfVĆśw&fś\0źźAĄ(ĄhtTile = 18;

           int height = heightTile / 2;

  [^HH
ZY[H

[
[^YN[7BF2F2VvBrŃ%Ą(

 

Jakieś sugestie ?

Link do komentarza
Udostępnij na innych stronach

Po prostu bez komentarza mam ci 3 raz napisać to samo ?

w Metodzie która rysuje cala postać zamień ostatnia linijkę na

 

g.DrawImage(img, sx, sy-54+36);

 

jeśli wymiary postaci podałeś dobre to postać powinna się wyświetlać poprawnie.

I na Boga zacznij myśleć!!! A nie czekaj na gotowce

"Bogowie to bugi ludzkich umysłów" Gifanonim ®

Link do komentarza
Udostępnij na innych stronach

Po prostu bez komentarza mam ci 3 raz napisać to samo ?

w Metodzie która rysuje cala postać zamień ostatnia linijkę na

 

g.DrawImage(img, sx, sy-54+36);

 

jeśli wymiary postaci podałeś dobre to postać powinna się wyświetlać poprawnie.

I na Boga zacznij myśleć!!! A nie czekaj na gotowce

 

Napisałem jeszcze raz bo Twoja odpowiedź nie jest dobra :) Postać przy "sx, sy-54+36" jest rysowana tak:

Link

a powinna być rysowna tak:

Link

Pobawiłem się trochę sx, sy odejmując wartości i udało się mi mniej więcej ustawić tą postać:

"sx-3, sy-54+33"

Link

Jednak nie jest ona idealnie rysowana. Poprawnie rysowana jest jak rysuje najpierw górę potem dół:

Link

 

Jakieś sugestie?

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...