Skip to content

Instantly share code, notes, and snippets.

@amirrajan
Last active September 16, 2022 02:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amirrajan/cc30d44028a4bb366322fd1aea4e9dc9 to your computer and use it in GitHub Desktop.
Save amirrajan/cc30d44028a4bb366322fd1aea4e9dc9 to your computer and use it in GitHub Desktop.
DragonRuby Game Toolkit - Raycasting
# https://github.com/BrennerLittle/DragonRubyRaycast/tree/main
$mapX = 8
$mapY = 8
$mapS = 64
$map = [
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1,
]
$px = 250
$py = 250
$pdx = 0
$pdy = 0
$pa = 0
def draw_minimap args
($mapY - 1).times do |y|
($mapX - 1).times do |x|
if $map[y.to_i * $mapX + x.to_i] == 1
color = { r: 1, g: 1, b: 1 }
else
color = { r: 255, g: 255, b: 255 }
end
xo = x.to_i * $mapS
yo = y.to_i * $mapS
args.outputs[:map].sprites << { x: xo, y: yo, w: 64, h: 64, path: :pixel, **color }
end
end
end
def FixAng a
if a > 359
a -= 360
end
if a < 0
a += 360
end
return a
end
def draw_minimap_player args
args.outputs[:map].sprites << { x: $px,
y: $py,
w: 8,
h: 8,
path: :pixel,
r: 255,
g: 255,
b: 0 }
end
def pinput args
xo=0
if $pdx<0
xo=-20
else
xo=20
end
yo=0
if $pdy<0
yo=-20
else
yo= 20
end
ipx=$px/64.0
ipx = ipx.to_i
ipx_add_xo=($px+xo)/64.0
ipx_add_xo = ipx_add_xo.to_i
ipx_sub_xo=($px-xo)/64.0
ipx_sub_xo = ipx_sub_xo.to_i
ipy=$py/64.0
ipy = ipy.to_i
ipy_add_yo=($py+yo)/64.0
ipy_add_yo = ipy_add_yo.to_i
ipy_sub_yo=($py-yo)/64.0
ipy_sub_yo = ipy_sub_yo.to_i
if args.inputs.keyboard.key_held.right
$pa -= 5
$pa = $pa % 360
$pdx = $pa.vector_x
$pdy = -$pa.vector_y
end
if args.inputs.keyboard.key_held.left
$pa += 5
$pa = $pa % 360
$pdx = $pa.vector_x
$pdy = -$pa.vector_y
end
if args.inputs.keyboard.key_held.up
if $map[ipy*$mapX + ipx_add_xo]==0
$px += $pdx * 5
end
if $map[ipy_add_yo * $mapX + ipx]==0
$py += $pdy * 5
end
end
if args.inputs.keyboard.key_held.down
if $map[ipy*$mapX + ipx_sub_xo] == 0
$px -= $pdx * 5
end
if $map[ipy_sub_yo*$mapX + ipx ] == 0
$py -= $pdy * 5
end
end
args.outputs[:map].sprites << { x: ipx * 64.to_i,
y: ipy * 64.to_i,
w: 64,
h: 64,
path: :pixel,
r: 255,
g: 0,
b: 0 }
end
def distance ax, ay, bx, by, ang
return ang.vector_x * (bx - ax) - ang.vector_y * (by - ay)
end
def draw_rays args
args.outputs[:screen].sprites << { x: 0,
y: 0,
w: 750,
h: 160,
path: :pixel,
r: 0,
g: 255,
b: 255 }
args.outputs[:screen].sprites << { x: 0,
y: 160,
w: 750,
h: 160,
path: :pixel,
r: 0,
g: 0,
b: 255 }
ra = ($pa + 30) % 360
60.times do |r|
dof = 0
side = 0
disV = 100000
tan = Math.tan ra.to_radians
if ra.vector_x > 0.001
rx = (($px >> 6) << 6) + 64
ry = ($px - rx) * tan + $py;
xo = 64
yo = -xo * tan
elsif ra.vector_x < -0.001
rx = (($px >> 6) << 6) - 0.0001
ry = ($px - rx) * tan + $py
xo = -64
yo = -xo * tan
else
rx = $px
ry = $py
dof = 8
end
while dof < 8
mx = rx >> 6
mx = mx.to_i
my = ry >> 6
my = my.to_i
mp = my * $mapX + mx
if mp > 0 && mp < $mapX * $mapY && $map[mp] == 1
dof = 8
disV = ra.vector_x * (rx - $px) - ra.vector_y * (ry - $py)
else
rx += xo
ry += yo
dof += 1
end
end
vx = rx
vy = ry
dof = 0
disH = 100000
tan = 1.0 / tan
if ra.vector_y > 0.001
ry = (($py >> 6) << 6) - 0.0001;
rx = ($py - ry) * tan + $px;
yo = -64;
xo = -yo * tan;
elsif ra.vector_y < -0.001
ry = (($py >> 6) << 6) + 64;
rx = ($py - ry) * tan + $px;
yo = 64;
xo = -yo * tan;
else
rx = $px
ry = $py
dof = 8
end
while dof < 8
mx = (rx) >> 6
my = (ry) >> 6
mp = my * $mapX + mx
if mp > 0 && mp < $mapX * $mapY && $map[mp] == 1
dof = 8
disH = ra.vector_x * (rx - $px) - ra.vector_y * (ry - $py) # //hit
else
rx += xo
ry += yo
dof += 1
end
end
col = { r: 0, g: 204, b: 0 }
if disV < disH
rx = vx
ry = vy
disH = disV
col = { r: 0, g: 153, b: 0 }
end
args.outputs[:map].lines << { x: $px, y: $py, x2: rx, y2: ry, **col }
ca = ($pa - ra) % 360
disH = disH * ca.cos
lineH = ($mapS * 320) / (disH)
lineH = 320 if lineH > 320
lineOff = 160 - (lineH >> 1)
args.outputs[:screen].sprites << { x: r * 8, y: lineOff, w: 8, h: lineH, path: :pixel, **col }
ra = (ra - 1) % 360
end
end
def tick args
draw_minimap args
draw_minimap_player args
pinput args
draw_rays args
args.outputs.sprites << { x: 0, y: 0, w: 1280 * 2.66, h: 720 * 2.25, path: :screen }
args.outputs.sprites << { x: 0, y: 592, w: 1280/4, h: 720/4, path: :map }
args.outputs.labels << { x: 0, y: 20, text: "FPS: #{args.gtk.current_framerate.to_sf}" }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment