Hallo, Ich hab hier mal eine Feldbasierende Karte zusammengecodet. Die Daten sind in einem Strukturierten Array abgespeichert. Die Karte kann gezoomt und in 45° Schritten rotiert werden.
Das Rotieren ist recht einfach. Rotate ist die Rotation (von 0 bis 3). Seh dir einfach Zeile 113 bis 121 an. Gedreht wird mit den Tasten x und y. Wenn du unförmige Felder hast (also nicht wie hier die bei allen rotatioen gleich ausehen) müsstes du noch die Felder rotieren.
Das Zoomen ist etwas komplexer. Hier wird in Zoom.f der Zoomfaktor gespeichert (ist ein Float fals du gennauer zoomen möchtes). Alle Bildgrößen werden durch diesen Faktor dividiert um die größe zu erhalten. Die Feldpositionen auf dem Bildschirm ist (X-viewX)/Zoom. Also die X-Kordinate (wird im Code mit a*50 berechnet) minus viewX. viewX gibt an wo sich deine "Kamera" befindet. Das ganze wird zum Schluss nochmal durch den Zoomfaktor dividiert.
Die Mausposition wird MouseX()*Zoom+viewX berechnet.
Ich hoffe du hast alles verstanden und bist jezt wunschlos glücklich. Hier der Code:
PS:
Wird bei größeren Felder leider etwas langsam.
Code: Alles auswählen
#MapX=50
#MapY=50
InitSprite()
InitSprite3D()
InitMouse()
InitKeyboard()
Structure Map
typ.b
EndStructure
Dim Map.Map(#MapX,#MapY)
OpenScreen(1024,768,32,"Map-Test")
CreateSprite(1,50,50,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Box(0,0,50,50,0)
Box(1,1,48,48,$00FF00)
StopDrawing()
CreateSprite3D(1,1)
CreateSprite(2,50,50,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(2))
Box(0,0,50,50,0)
Box(1,1,48,48,$0000FF)
StopDrawing()
CreateSprite3D(2,2)
CreateSprite(3,10,20)
StartDrawing(SpriteOutput(3))
Line(0,0,0,20,$FF0000)
Line(0,0,10,20,$FF0000)
StopDrawing()
viewX=-100
viewY=-100
Zoom.f=1
Repeat
If IsScreenActive()
ClearScreen(0):ExamineKeyboard():ExamineMouse()
If KeyboardReleased(#PB_Key_Escape)
End
EndIf
If KeyboardPushed(#PB_Key_Left)
viewX-5*Zoom
EndIf
If KeyboardPushed(#PB_Key_Right)
viewX+5*Zoom
EndIf
If KeyboardPushed(#PB_Key_Up)
viewY-5*Zoom
EndIf
If KeyboardPushed(#PB_Key_Down)
viewY+5*Zoom
EndIf
If KeyboardReleased(#PB_Key_Y)
rotate-1
If rotate<0
rotate+4
EndIf
EndIf
If KeyboardReleased(#PB_Key_X)
rotate+1
If rotate>3
rotate-4
EndIf
endif
Start3D()
If MouseWheel()
Debug MouseWheel()
Debug "Zoom:"+Str(Zoom)
If MouseWheel()<0
Zoom*2
Else
Zoom/2
EndIf
If Zoom<1
Zoom=1
ElseIf Zoom>16
Zoom=16
EndIf
ZoomSprite3D(1,50/Zoom,50/Zoom)
ZoomSprite3D(2,50/Zoom,50/Zoom)
EndIf
MouseMapX=MouseX()*Zoom+viewX
MouseMapY=MouseY()*Zoom+viewY
If MouseMapX>0 And MouseMapY<#MapX*50 And MouseMapY>0 And MouseMapY<#MapY*50
If MouseButton(2)
Map(MouseMapX/50,MouseMapY/50)\Typ=1
ElseIf MouseButton(1)
Map(MouseMapX/50,MouseMapY/50)\Typ=0
EndIf
EndIf
For a=0 To #MapX
For b=0 To #MapY
If rotate=0
c=Map(a,b)\Typ
ElseIf rotate=1
c=Map(#MapX-a,b)\Typ
ElseIf rotate=2
c=Map(#MapX-a,#MapY-b)\Typ
ElseIf rotate=3
c=Map(a,#MapX-b)\Typ
EndIf
Select c
Case 0
DisplaySprite3D(1,(a*50-viewX)/Zoom , (b*50-viewY)/Zoom)
Case 1
DisplaySprite3D(2,(a*50-viewX)/Zoom , (b*50-viewY)/Zoom)
EndSelect
Next b
Next a
Stop3D()
DisplayTransparentSprite(3,MouseX(),MouseY())
EndIf
FlipBuffers()
ForEver