Laut einem Tutorial soll ich den falschen Wandabstand mit cos(beta) multiplizieren. beta stellt hiebei den Winkel dar, der zwischen dem aktuellen Winkel des zu zeichnenden Rays und dem Blickwinkel des Spielers besteht (das ist logischerweise die Mitte des Sichtfeldes). Doch nun sagt mir bitte- wie soll ich das hier integrieren
Code: Alles auswählen
Global mapx.l, mapy.l, mapz.l
Global fps.l, time.l
Global playerx.l, playery.l, playerz.f
Global playerfov.l, playermove.l, playerturn.l
#PI = 3.141592
Procedure.f atosin(angle.w)
s.f = (#PI / 180) * angle
ProcedureReturn s
EndProcedure
mapz = 32
mapx = 10*mapz
mapy = 10*mapz
playerx = 1*mapz
playery = 1*mapz
playerz = atosin(85)
playerfov = atosin(45)
playermove = mapz / 5
playerturn = 5
Dim map.l(mapx,mapy)
#color_wall = $999999
Debug "playerfov: " + Str(playerfov)
Debug "playerz: " + Str(playerz)
Debug ""
Debug ""
Procedure cast(z,distlen,correction) ;"correction" ist die korrekturvariable der perspektive
Protected pix.f
pix.f = mapz / distlen * 277
pix.f * correction
Box(z,120-Int(pix)/2, 1,Int(pix), #color_wall)
EndProcedure
Procedure render()
Protected angle.f, dist.l
Protected rx.l, ry.l, z.l
Protected pfovhalf.f, astep.f
pfovhalf.f = playerfov / 2
astep.f = playerfov / 320
angle = playerz - pfovhalf
For z=0 To 319
angle + astep
dist=0
Repeat
dist+1
rx = playerx + Sin(angle) * dist
ry = playery + Cos(angle) * dist
If rx>=0 And ry>=0 And rx<mapx And ry<mapy
If map(rx,ry) = 1
If z <= 149
c = Cos(playerz - Int(angle))
ElseIf z>=150
c = Cos(Int(angle) - playerz)
EndIf
cast(z, dist, c)
Break
EndIf
Else
Break
EndIf
ForEver
Next
EndProcedure
Procedure load()
For zy=0 To mapy
For zx=0 To mapx
If zy=0 Or zy=mapx-1 Or zx=0 Or zx=mapy-1
map(zx, zy) = 1
EndIf
Next
Next
EndProcedure
load()
InitSprite()
InitKeyboard()
;OpenWindow(0,0,0,320,240,#PB_Window_SystemMenu, "rm3")
;OpenWindowedScreen(WindowID(), 0,0, 320,240, 0,0,0)
OpenScreen(320,240,16,"rm3")
Repeat
;event = WindowEvent()
ClearScreen(0,0,0)
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
playerz - atosin(playerturn)
ElseIf KeyboardPushed(#PB_Key_Right)
playerz + atosin(playerturn)
EndIf
If KeyboardPushed(#PB_Key_Up)
playerx + (Sin(playerz) * playermove)
playery + (Cos(playerz) * playermove)
ElseIf KeyboardPushed(#PB_Key_Down)
playerx - (Sin(playerz) * playermove)
playery - (Cos(playerz) * playermove)
EndIf
If KeyboardReleased(#PB_Key_PageUp)
playerfov + 5
ElseIf KeyboardPushed(#PB_Key_PageDown)
playerfov - 5
EndIf
StartDrawing(ScreenOutput())
time=ElapsedMilliseconds()
render()
Debug ElapsedMilliseconds()-time
DrawText(Str(playerz/(#PI/180)))
StopDrawing()
; Debug CpuUsage()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape); Or event=#PB_Event_CloseWindow