ISO-Tile => Position

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

ToeB

Betreff: ISO-Tile => Position

BeitragSa, Okt 13, 2007 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie berechne ich die Position von einem Isotile ?

Mein Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()
AppTitle ""

Global TileSet = LoadAnimImage("gfx\TileSet.bmp",58,29,0,1)
MaskImage TileSet,255,0,255

Global TileWidth = 58,TileHeight = 29


Type map
Field x,y,frame
End Type

Global m.map

For x = 1 To 10
For y = 1 To 10
m.map = New map
m\x = x
m\y = y
m\frame = 0
Next
Next
Repeat
For m.map = Each map
DrawImage TileSet,(m\x*2-m\y*2)*13.75,(m\y*2+m\x*2)*8,m\frame
Next
Flip
Cls
Until KeyHit(1)
End


(Das image ist -> 58*29 groß...)

thx und mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Okt 13, 2007 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn dir jemand erzählt, dass Types gut sind und vom ''besserem programmieren'' zeugen, dann heisst es nicht, dass Types generell für alles besser sind. Aber wenn du denoch bestehst, musst du erstmal die breite deiner Tilemap speichern um beim durchlauf der Tilemap die Abschnitte zerlegen zu können. Denn Rest (das verschieben der zweiten Tilereihe bei Isodarstellung) kannst du mithilfe von ql:Mod machen, was die Types bei der Sache auch nicht grad einfacher machen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Matthias

BeitragSa, Okt 13, 2007 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Da ich mich selbst schon mit ISO Tiles beschäftigt habe, will ich dich darauf aufmerksamm machen, das das Pfadfinding fals du eins einbauen willst sehr schwer ist. Aber auch selbst wenn du es denoch schafst die Pfadfinding kordinaten auf das ISO Tiles Map zu übertragen, und deine Einheiten/Figuren dann diese Wegepunkte abfahren/ablaufen wirst du merken das sie immer im ZickZack kurs fahren weil ja jede 2te ISOTileReihe um die hälfte verschoben ist.
Das fand ich nicht so lustig und habe auch über eine Woche nach eine Lösung gesucht aber habe leider keine gefunden. Bis zum heutigen Tag.

D2006

Administrator

BeitragSo, Okt 14, 2007 2:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Pathfinding und ISO hat keinerlei zusammenhang.

Denn die ISO-Perspektive ist nur eine andere Darstellungsform einer Matrix (=einem zweidimensionalem Array). Anders ausgedrückt: Pathfinding für Topdown funktioniert genauso wie für ISO. Wenn nicht, hast du was grundlegendes falsch verstanden.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

Omenaton_2

BeitragMo, Okt 15, 2007 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig, wie D2006 es schreibt,
auch wenn die Darstellung ISO ist, intern rechnest du bei allen KI-Sachen (wie Pathfinding, Aggro-Range Check, Schußposition aussuchen, etc) wie bei einer simplen 2D-Karte.
Stell dir die Welt wie ein normales, liegendes Quadrat vor. So berechnest du alles. Bei der Darstellung wird die Welt auf die Spitze gekippt.

Was etwas schwierig ist, bis du nicht dahinter kommst wie es geht, ist zu sagen, über welchem ISO-Feld gerade der Mauszeiger liegt. Damit habe ich anfangs ernste Schwierigkeiten gehabt.

SpionAtom

BeitragMo, Okt 15, 2007 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch an dieser Stelle möchte ich nochmal auf diese Seite hinweisen. Leider ists auf Englisch. Aber gut erklärt und mit vielen Beispielen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

Matthias

BeitragMo, Okt 15, 2007 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube ihr habt hier alle sammt keine Ahnung von ISO.

Ich habe hier jetzt mal ein Beispiel gemacht. Um euch das Problem mal zu demonstrieren.

Wie ihr sehen könnt sind die Wegpunkte als ZickZack Pfad zu erkennen.
Und nun stellt euch einen Panzer vor der dieses Wegpunkte abfährt.

Ich wäre natürlich total glücklich wenn jemand dieses Problem lösen könnte. Und der Pfad gerade wäre.



Linke Maustaste drücken um Pfad suchen zu lassen.

Code: [AUSKLAPPEN]



Global ISOScreenX=800
Global ISOScreenY=600
Graphics ISOScreenX,ISOScreenY,32,2

Const tilewidth = 64
Const tileheight = 32
Dim Map(100,100)

Global tileA=CreateImage(64,32)
Global tileB=CreateImage(64,32)
Global MausImg=CreateImage(3,3)
Global MausX,MausY


Global StartX=5,StartY=25,ZielX,ZielY

Global mapwidth=99,mapheight=99;"Wichtig für Pfadfinding"

Dim PfadMap(mapwidth,mapheight)
;"----------Pfadfinding Vorbereitung----------------"
Dim sqrmap(100,100),nodemap(0,0),dirx(7),diry(7),dirz(7)
For i=0 To 7:Read dirx(i):Read diry(i):Read dirz(i):Next
Type node
Field parent.node,cost,x,y
End Type

Type open
Field node.node
End Type

Type path
Field node.node
End Type
Data 0,-1,0,  -1,0,0,  1,0,0,  0,1,0
Data -1,-1,1,  1,-1,1,  -1,1,1,  1,1,1
;---------------Vorbereitung beendet----------------



;Tiles Erstellen
SetBuffer ImageBuffer(TileA)
Color 0,200,0:Rect 0,0,100,100:Color 0,0,0
For I=0 To 32:Line 32-I,0,0-I,16:Line 32-I,32,0-I,16
Line 32+I,0,64+I,16:Line 32+I,32,64+I,16:Next

SetBuffer ImageBuffer(TileB)
Color 100,100,100:Rect 0,0,100,100:Color 0,0,0
For I=0 To 32:Line 32-I,0,0-I,16:Line 32-I,32,0-I,16
Line 32+I,0,64+I,16:Line 32+I,32,64+I,16:Next

MidHandle TileA:MidHandle TileB:MidHandle MausImg
MaskImage MausImg,255,0,0




;-----Hindernisse--------
For I=2 To 10:Map(I,11)=1:Map(I,12)=1:Next




SetBuffer BackBuffer()
;-----------MainLoop------------

Repeat
MausX=MouseX():MausY=MouseY()

If MouseHit(1)=1 Then pathfinding():PfadInMap()

funcDrawMap()

Flip
Until KeyDown(1)=1
End







Function PfadInMap()

Dim PfadMap(mapwidth,mapheight)
For path.path=Each path :WegPkt=WegPkt+1:Next


For path.path=Each path
WegPkt=WegPkt-1
      If path=Last path Then Exit
   
        x0=path\node\x
        y0=path\node\y
 
   
     PfadMap(X0,Y0)=WegPkt
Next
End Function


Function funcDrawMap()
   
   tltilex = (0 + mapx) / tilewidth
   tltiley = ((0 + mapy) / tileheight) * 2
   
   brtilex = ((ISOScreenX + mapx) / tilewidth)+1
   brtiley = (((ISOScreenY + mapy) / tileheight) * 2)+1
   

   
   For y = tltiley To brtiley
      For x = tltilex To brtilex
         plotx = (x * tilewidth + (y And 1) * (tilewidth / 2)) - mapx
         ploty = (y * (tileheight/2)) - mapy
         
         If map(x, y) =  0 Then
            DrawImage tileA, plotx, ploty
         Else
            DrawImage tileB, plotx, ploty
         End If
         
         If PfadMap(X,Y)>0 Then Text plotX,PlotY,PfadMap(X,Y),1,1
         If StartX=X And StartY=Y Then STX=plotX:STY=plotY
            
           If ImagesCollide (MausImg,MausX,MausY,0,TileA,plotX,plotY,0) Then
           ZielX=X:ZielY=Y:TX=plotX:TY=plotY
   
   
          
         End If
                  
         
      Next
   Next
   Color 255,255,255:Text TX,TY,"Z",1,1
   Text STX,STY,"S",1,1
End Function



Function pathfinding()
  endX=ZielX:endY=ZielY
  Delete Each node
  Delete Each open
  Delete Each path
  Dim nodemap(mapwidth,mapheight)
  If startx=endx And starty=endy Then Return

  node.node=New node
  node\x=startx
  node\y=starty
  open.open=New open
  open\node=node
  nodemap(startx,starty)=1

  .again2
  node=Null
  cost=2147483647
  For open=Each open
    delta=sqrmap(Abs(open\node\x-endx),Abs(open\node\y-endy))
    If open\node\cost+delta<cost Then
      cost=open\node\cost+delta
      node=open\node
      tempopen.open=open
    EndIf
  Next
  If node=Null Then Return
  Delete tempopen

  For i=0 To 7
    x=node\x+dirx(i)
    y=node\y+diry(i)
    If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then
      If map(x,y)=0 And nodemap(x,y)=0 Then
        If dirz(i)=1 Then
          If map(x,node\y)=1 And map(node\x,y)=1 Then Goto jump2
        EndIf
        tempnode.node=New node
        tempnode\parent=node
        tempnode\cost=node\cost+1+dirz(i)
        tempnode\x=x
        tempnode\y=y
        open.open=New open
        open\node=tempnode
        nodemap(x,y)=1
        If x=endx And y=endy Then finish=1:Exit
        .jump2
      EndIf
    EndIf
  Next
  If finish=0 Then Goto again2

  While tempnode\parent<>Null
    path.path=New path
    path\node=tempnode
    tempnode=tempnode\parent
  Wend
  path.path=New path
  path\node=tempnode
End Function


 

Dreamora

BeitragMo, Okt 15, 2007 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein du hast keine Ahnung.

Iso ist nur eine der möglichen visuellen Repräsentationen von einem 2 Dimensionalen Tileset mit mehreren Ebenen.

Wenn du das verstanden hast, dann weisst du auch wie du das Problem mit "Gerade" und "Zick Zack" löst, nämlich gleich wie du bei Tilemap Wegfindealgorithmen keine 90 Grad Kurven reinbaust (was in Iso ein Zick-Zack ergibt). Nämlich indem du diagonal gehst oder spline / cat-mull-rom nimmst um den Weg zu "glätten"
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Matthias

BeitragMo, Okt 15, 2007 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora
Also Fazit. ISOMap Pfandfinding und Standart Pfadfinding ist doch nicht das gleiche. Mann muß also bei ISO noch eine Glättung vornehemen.

Also das mit Spliner bekomme ich ja noch hin (Löst aber nicht das Problem) aber das mit cat-mull-rom das bekomme ich nicht hin.

Und wenn du willst kannst du ja mal dieses Beispiel so verändern das es als Vorlage für alle anderen ISO Interessen dienen kann.

Denn ich habe schon viel im Codearchiv rum geschaut und bis jetzt gibt es keinen Code der Pfadfinding auf einem ISO Map demonstriert.
 

Dreamora

BeitragMo, Okt 15, 2007 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du verstehst es falsch.

ISO und Tilemap ist exakt das gleiche.

Beides hat nen zick zack wenn du nicht glättest, nur das es dir als mensch bei ISO mehr auffällt, weil du an rechte winkel gewohnt bist, an 45° winkel wie in Iso jedoch nicht.


Das mit dem anpassen braucht Zeit, das sind nicht 2 Zeilen und gut ist. Da ich es nicht brauche lohnt sich das für mich nicht.
Darüber hinaus lernt man mit Copy Paste nichts, deswegen gibts von mir bestenfalls zu ganz grundlegendem eine Code Lösung. Ansonsten nur Pseudo Code auf einem Niveau der dennoch voraussetzt, dass du dich mit der Materie auseinander gesetzt hast, wie es bei Programmierern normal ist.

In diesem Fall wurden dir bereits mehrere Stichworte genannt, nach denen du Recherchieren kannst.
Ein guter Startpunkt für "runde Pfade" ist sicher die deutsche und englische Spline Wiki Page.
Auch gibt es verschiedene AI Seiten die sich mit Bewegungspfaden und wie man sie "echter" aussehen lässt, beschäftigen.

Und im Endeffekt brauchst du garkeine Splines wenn du nur den Zickzack raus haben willst, dazu musst du nur schauen ob der Ecken auch diagonal abgekürzt werden kann ohne kollision, nachdem du mit A* oder wie auch immer den grundlegenden Pfad errechnet hast.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group