Last active
September 16, 2022 02:16
-
-
Save amirrajan/cc30d44028a4bb366322fd1aea4e9dc9 to your computer and use it in GitHub Desktop.
DragonRuby Game Toolkit - Raycasting
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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