Advertisement
Guest User

Broken raycaster in TIC-80

a guest
Apr 23rd, 2017
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.07 KB | None | 0 0
  1. -- title:  Ray-casting test
  2. -- desc:   Simple 3D test
  3. -- script: lua
  4. -- input:  gamepad
  5. screenWidth=240;screenHeight=136
  6. mapWidth=30;mapHeight=17
  7. player={x=0,y=0,angle=0,walkSpeed=1,angleSpeed=0.1}
  8. found=false
  9. for x=0,mapWidth-1 do
  10.     for y=0,mapHeight-1 do
  11.         if(mget(x,y)==5)then
  12.             player.x=x*8
  13.             player.y=y*8
  14.             found=true;break
  15.         end
  16.     end
  17.     if(found)then break end
  18. end
  19. function sget(x,y)
  20.     x=math.floor(x);y=math.floor(y)
  21.     local addr=0x4000+(x//8+y//8*16)*16
  22.     return peek4(addr*2+x%8+y%8*8)
  23. end
  24. function TIC()
  25.     --Player movement
  26.     if btn(2)then player.angle=player.angle-player.angleSpeed end
  27.     if btn(3)then player.angle=player.angle+player.angleSpeed end
  28.     if btn(0)then --Forwards
  29.         player.x=player.x+(math.cos(player.angle)*player.walkSpeed)
  30.         player.y=player.y+(math.sin(player.angle)*player.walkSpeed)
  31.     elseif btn(1)then --Backwards
  32.         player.x=player.x-(math.cos(player.angle)*player.walkSpeed)
  33.         player.y=player.y-(math.sin(player.angle)*player.walkSpeed)
  34.     end
  35.     --Drawing
  36.     cls()
  37.     maxRange=300
  38.     for x=0,screenWidth-1 do
  39.         rayX=player.x+(math.cos(player.angle+(math.pi/2))*5*((x/screenWidth)-.5))
  40.         rayY=player.y+(math.sin(player.angle+(math.pi/2))*5*((x/screenWidth)-.5))
  41.         rayAngle=player.angle+(((x/screenWidth)-.5)*2)
  42.         rayDistance=0
  43.         hit=false
  44.         for i=0,maxRange do
  45.             stepSize=0.1+((i/maxRange)*2)
  46.             rayX=rayX+(math.cos(rayAngle)*stepSize)
  47.             rayY=rayY+(math.sin(rayAngle)*stepSize)
  48.             rayDistance=rayDistance+stepSize
  49.             tile=mget(rayX/8,rayY/8)
  50.             if(tile==2 or tile==3)then
  51.                 side=math.floor((((math.atan(((rayY/8)%1)-.5,((rayX/8)%1)-.5)/(math.pi*2))-0.125)%1)*4)
  52.                 hit=true
  53.                 break
  54.             end
  55.         end
  56.         for y=0,screenHeight-1 do
  57.             wallHeight=((screenHeight/2)/rayDistance)*8
  58.             if(hit and math.abs(y-(screenHeight/2))<wallHeight)then
  59.                 if(side==0)then
  60.                     xTexture=rayX
  61.                 elseif(side==1)then
  62.                     xTexture=rayY
  63.                 elseif(side==2)then
  64.                     xTexture=-rayX
  65.                 elseif(side==3)then
  66.                     xTexture=-rayY
  67.                 end
  68.                 pix(x,y,sget((tile*16)+(xTexture%8),(((y-((screenHeight/2)-wallHeight))/(wallHeight*2))*8)))
  69.             end
  70.         end
  71.     end
  72. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement