Ĺadny brzuch
A więc mam zamiar zmodyfikować trochę kod mojej gry RPG.
Chodzi mi o wyświetlanie postaci. Jak najlepiej to zrobić?
Oto mój przykładowy kod:
for i:=0 to mapa.rozmiar.X do for j:=0 to mapa.rozmiar.Y do begin // obliczanie rzeczywistej pozycji kafli real_pos[i,j].X:=PozycjaKafli[i,j].X-mapa.pos.X; real_pos[i,j].Y:=PozycjaKafli[i,j].Y-mapa.pos.Y; // rysowanie mapy if (real_pos[i,j].X>-128) and (real_pos[i,j].X<640) and (real_pos[i,j].Y>-64) and (real_pos[i,j].Y<400) then begin // rysowanie tekstur Img.ImageList.Find(inttostr(mapa.Tex[i,j])+'.bmp').Draw(real_pos[ i,j].X,real_pos[i,j].Y,0); if (Mapa.Obj[i,j]<>0) and (real_pos[i,j].Y<200) and (real_pos[i,j].Y+64>0) then begin Img.ImageList.Find('obj'+inttostr(Mapa.obj[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr( Mapa.obj[i,j])+'.bmp').ImageHeight-64),0); end; // rysowanie postaci if ilewrogow>0 then for k:=0 to ilewrogow-1 do begin if (wrog[k].Pozycja.X>PozycjaKafli[i,j].X-64) and (wrog[k].pozycja.X<PozycjaKafli[i,j].X+72) and (wrog[k].pozycja.Y>PozycjaKafli[i,j].Y-100) and (wrog[k].pozycja.Y<PozycjaKafli[i,j].Y-36) then begin Img.ImageList.Find('on'+inttostr(wrog[k].kto)+'_'+inttostr(wrog[ k].kier)+'_'+inttostr(wrog[k].anim)+'.bmp').Draw(wrog[ k].Pozycja.X-mapa.pos.X,wrog[k].Pozycja.Y-mapa.pos.Y,0); end; end; end; end; // rysowanie postaci Img.ImageList.Find('ja'+inttostr(ja.kto)+'_'+inttostr(ja.kier)+' _'+inttostr(ja.anim)+'.bmp').Draw(270,150,0); // rysowanie obiektów za postacią for i:=0 to mapa.rozmiar.X do for j:=0 to mapa.rozmiar.Y do begin if (real_pos[i,j].X>-128) and (real_pos[i,j].X<640) and (real_pos[i,j].Y>=200) then begin if (Mapa.Obj[i,j]<>0) and ((real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr(Mapa.obj[ i,j])+'.bmp').ImageHeight-64))<400) then begin if (real_pos[i,j].X>160) and (real_pos[i,j].X<380) and (real_pos[i,j].Y<380) then Img.ImageList.Find('obj'+inttostr(Mapa.obj[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr( Mapa.obj[i,j])+'.bmp').ImageHeight-64),0,0,0,1,1,255,255,255,128,0) else Img.ImageList.Find('obj'+inttostr(Mapa.obj[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr( Mapa.obj[i,j])+'.bmp').ImageHeight-64),0); end; end; end; // rysowanie dachów for i:=0 to mapa.rozmiar.X do for j:=0 to mapa.rozmiar.Y do begin if (real_pos[i,j].X>-128) and (real_pos[i,j].X<640) and (real_pos[i,j].Y-146>-64) and (real_pos[i,j].Y-146<400) and (Mapa.Dach[i,j]<>0) then begin if (real_pos[i,j].X>100) and (real_pos[i,j].X<412) and (real_pos[i,j].Y>140) and (real_pos[i,j].Y<400) then Img.ImageList.Find('roof'+inttostr(Mapa.Dach[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-146,0,0,0,1,1,255,255,255,128,0) else Img.ImageList.Find('roof'+inttostr(mapa.Dach[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-146,0); end; end;
Przykładowy błąd w rysowaniu wynikający z tego sposobu rysowania:
http://www.kempa65.y...1_gfx_error.jpg
Podłoże, ściany, obiekty i dachy rysują się w jednakowy sposób względem pozycji danego kafla izometrycznego (wszystkie są rysowane przez pętle for), a postacie znajdujące się w grze powinny być rysowane niezależne od nich, aby mogły zajmować dowolną pozycję na mapie i przy tym nie zdażało się, że jakaś postać na mapie zostaje zasłonięta przez ścianę, która nie powinna jej zasłaniać, itp.
Chciałbym zrobić to tak, aby wszystko się prawidłowo wyświetlało.
Czy jest jakiś lepszy sposób na rozrysowanie mapy?
http://www.unit1.pl/224,idx
http://www.unit1.pl/224,idx
Przeglądałem tamte arty, ale tamte wyświetlanie niestety jest złe.
Często występuje rysowanie postaci, która powinna być za drzewem, na drzewie <_<.
A poza tym to moja gra wykorzystuje mapę izometryczną.
No i oczywiście w swoim kodzie nie używam Spritów.
Już to poprawiłem. Pobawiłem się trochę w kodzie i zrobiłem tak, że nie ma żadnych błędów w grafice :D
Użytkownik Demon64 edytował ten post 02 listopad 2007, 15:03
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Chodzi mi o wyświetlanie postaci. Jak najlepiej to zrobić?
Oto mój przykładowy kod:
for i:=0 to mapa.rozmiar.X do for j:=0 to mapa.rozmiar.Y do begin // obliczanie rzeczywistej pozycji kafli real_pos[i,j].X:=PozycjaKafli[i,j].X-mapa.pos.X; real_pos[i,j].Y:=PozycjaKafli[i,j].Y-mapa.pos.Y; // rysowanie mapy if (real_pos[i,j].X>-128) and (real_pos[i,j].X<640) and (real_pos[i,j].Y>-64) and (real_pos[i,j].Y<400) then begin // rysowanie tekstur Img.ImageList.Find(inttostr(mapa.Tex[i,j])+'.bmp').Draw(real_pos[ i,j].X,real_pos[i,j].Y,0); if (Mapa.Obj[i,j]<>0) and (real_pos[i,j].Y<200) and (real_pos[i,j].Y+64>0) then begin Img.ImageList.Find('obj'+inttostr(Mapa.obj[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr( Mapa.obj[i,j])+'.bmp').ImageHeight-64),0); end; // rysowanie postaci if ilewrogow>0 then for k:=0 to ilewrogow-1 do begin if (wrog[k].Pozycja.X>PozycjaKafli[i,j].X-64) and (wrog[k].pozycja.X<PozycjaKafli[i,j].X+72) and (wrog[k].pozycja.Y>PozycjaKafli[i,j].Y-100) and (wrog[k].pozycja.Y<PozycjaKafli[i,j].Y-36) then begin Img.ImageList.Find('on'+inttostr(wrog[k].kto)+'_'+inttostr(wrog[ k].kier)+'_'+inttostr(wrog[k].anim)+'.bmp').Draw(wrog[ k].Pozycja.X-mapa.pos.X,wrog[k].Pozycja.Y-mapa.pos.Y,0); end; end; end; end; // rysowanie postaci Img.ImageList.Find('ja'+inttostr(ja.kto)+'_'+inttostr(ja.kier)+' _'+inttostr(ja.anim)+'.bmp').Draw(270,150,0); // rysowanie obiektów za postacią for i:=0 to mapa.rozmiar.X do for j:=0 to mapa.rozmiar.Y do begin if (real_pos[i,j].X>-128) and (real_pos[i,j].X<640) and (real_pos[i,j].Y>=200) then begin if (Mapa.Obj[i,j]<>0) and ((real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr(Mapa.obj[ i,j])+'.bmp').ImageHeight-64))<400) then begin if (real_pos[i,j].X>160) and (real_pos[i,j].X<380) and (real_pos[i,j].Y<380) then Img.ImageList.Find('obj'+inttostr(Mapa.obj[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr( Mapa.obj[i,j])+'.bmp').ImageHeight-64),0,0,0,1,1,255,255,255,128,0) else Img.ImageList.Find('obj'+inttostr(Mapa.obj[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-(Img.ImageList.Find('obj'+inttostr( Mapa.obj[i,j])+'.bmp').ImageHeight-64),0); end; end; end; // rysowanie dachów for i:=0 to mapa.rozmiar.X do for j:=0 to mapa.rozmiar.Y do begin if (real_pos[i,j].X>-128) and (real_pos[i,j].X<640) and (real_pos[i,j].Y-146>-64) and (real_pos[i,j].Y-146<400) and (Mapa.Dach[i,j]<>0) then begin if (real_pos[i,j].X>100) and (real_pos[i,j].X<412) and (real_pos[i,j].Y>140) and (real_pos[i,j].Y<400) then Img.ImageList.Find('roof'+inttostr(Mapa.Dach[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-146,0,0,0,1,1,255,255,255,128,0) else Img.ImageList.Find('roof'+inttostr(mapa.Dach[i,j])+'.bmp').Draw( real_pos[i,j].X,real_pos[i,j].Y-146,0); end; end;
Przykładowy błąd w rysowaniu wynikający z tego sposobu rysowania:
http://www.kempa65.y...1_gfx_error.jpg
Podłoże, ściany, obiekty i dachy rysują się w jednakowy sposób względem pozycji danego kafla izometrycznego (wszystkie są rysowane przez pętle for), a postacie znajdujące się w grze powinny być rysowane niezależne od nich, aby mogły zajmować dowolną pozycję na mapie i przy tym nie zdażało się, że jakaś postać na mapie zostaje zasłonięta przez ścianę, która nie powinna jej zasłaniać, itp.
Chciałbym zrobić to tak, aby wszystko się prawidłowo wyświetlało.
Czy jest jakiś lepszy sposób na rozrysowanie mapy?
http://www.unit1.pl/224,idx
http://www.unit1.pl/224,idx
Przeglądałem tamte arty, ale tamte wyświetlanie niestety jest złe.
Często występuje rysowanie postaci, która powinna być za drzewem, na drzewie <_<.
A poza tym to moja gra wykorzystuje mapę izometryczną.
No i oczywiście w swoim kodzie nie używam Spritów.
Już to poprawiłem. Pobawiłem się trochę w kodzie i zrobiłem tak, że nie ma żadnych błędów w grafice :D
Użytkownik Demon64 edytował ten post 02 listopad 2007, 15:03