import turtle
from math import fabs
window = turtle.Screen()
window.title("Ray Caster")
window.bgcolor("#000000")
window.setup(1000, 500)
window.tracer(0, 0)
window.delay(0)
char = turtle.Turtle()
char.color("#ffff00")
char.penup()
char.shape("triangle")
char.shapesize(stretch_wid=0.4, stretch_len=0.8)
ray = char.clone()
ray.shape("square")
ray.shapesize(stretch_len=0.2, stretch_wid=0.2)
ray.pencolor("#0000ff")
ray.pensize(1)
fov = 60
def single_ray():
ray.goto(char.position())
ray.pendown()
for i in range(1000):
ray.forward(4)
if collision(ray, rigwall, 8, 20, 16, 500) or collision(ray, lefwall, 8, 20, 16, 500) or collision(ray, topwall, 8, 1000, 16, 20) or collision(ray, botwall, 8, 1000, 16, 20) or collision(ray, midwall, 8, 500, 16, 20):
ray.backward(4)
ray.penup()
def raycast():
ray.right(fov / 2)
for i in range(fov):
single_ray()
ray.left(1)
def ray_cast():
ray.clear()
ray.setheading(char.heading())
raycast()
def collision(a, b, a_width, b_width, a_height, b_height):
xcoll = (fabs(a.xcor() - b.xcor()) * 2) < (a_width + b_width)
ycoll = (fabs(a.ycor() - b.ycor()) * 2) < (a_height + b_height)
return (xcoll and ycoll)
rigwall = turtle.Turtle()
rigwall.color("#444444")
rigwall.shape("square")
rigwall.shapesize(stretch_wid=25, stretch_len=1)
rigwall.penup()
rigwall.goto(480, 0)
lefwall = rigwall.clone()
lefwall.goto(-490, 0)
topwall = rigwall.clone()
topwall.shapesize(stretch_wid=1, stretch_len=50)
topwall.goto(0, 240)
botwall = topwall.clone()
botwall.goto(0, -230)
midwall = topwall.clone()
midwall.shapesize(stretch_wid=1, stretch_len=25)
midwall.goto(0, 100)
def char_for():
char.forward(5)
def char_bac():
char.backward(5)
def char_lef():
char.left(4.5)
def char_rig():
char.right(4.5)
window.listen()
window.onkeypress(char_for, "w")
window.onkeypress(char_bac, "s")
window.onkeypress(char_lef, "a")
window.onkeypress(char_rig, "d")
while 1:
if collision(char, rigwall, 8, 20, 16, 500) or collision(char, lefwall, 8, 20, 16, 500) or collision(char, topwall, 8, 1000, 16, 20) or collision(char, botwall, 8, 1000, 16, 20) or collision(char, midwall, 8, 500, 16, 20):
char.backward(5)
ray_cast()
window.update()
I'm trying to create a ray tracer to make a 3d game using turtle python but using anymore lines(fov) than 10 makes the program become laggy. I was wondering if anyone could help? I used things like tracer, update and speed but nothing is working well. please may anyone help because I'm kind of new to coding and am stuck.