So, OperaGX got an update, and C-GPT won’t say anything but errors to me, so I used the new ChatSonic to make a 3D game in scratch and wondered: “What would happen if I told it to make a raycasting system just like doom???”
And uh… Here’s what i said:
"Can you code a 3D raycasting script similar to the one that DOOM used in Microsoft Makecode Arcade?
Yes, I can help you with that. Raycasting is a technique used to create a 3D perspective in 2D games. Here’s an example code in MakeCode Arcade that implements raycasting for a 3D perspective:
(THIS IS ALL WRITTEN IN TYPESCRIPT BTW)
let screen: Image = null
let map = [
[1,1,1,1,1],
[1,0,0,0,1],
[1,0,0,0,1],
[1,0,0,0,1],
[1,1,1,1,1]
]
let player = {
x: 2.5,
y: 2.5,
dir: 0,
fov: Math.PI / 4
}
function updateScreen() {
screen.fill(1)
for (let i = 0; i < screen.width(); i++) {
let angle = player.dir - player.fov / 2 + player.fov * i / screen.width()
let distance = 0
let hit = false
let x = player.x, y = player.y
while (!hit && distance < 20) {
let dx = Math.cos(angle) * distance
let dy = Math.sin(angle) * distance
let testX = Math.floor(x + dx)
let testY = Math.floor(y + dy)
if (testX >= 0 && testX < map[0].length && testY >= 0 && testY < map.length) {
hit = map[testY][testX] === 1
}
distance += 0.1
}
let ceiling = (screen.height() - 2 * screen.height() / distance) / 2
let floor = screen.height() - ceiling
for (let j = 0; j < screen.height(); j++) {
if (j < ceiling) {
screen.setPixel(i, j, 2)
} else if (j >= ceiling && j <= floor) {
screen.setPixel(i, j, hit ? 0 : 3)
} else {
screen.setPixel(i, j, 4)
}
}
}
screen.setPixel(Math.floor(player.x), Math.floor(player.y), 5)
}
controller.A.onEvent(ControllerButtonEvent.Pressed, function() {
player.dir += Math.PI / 4
if (player.dir >= Math.PI * 2) {
player.dir -= Math.PI * 2
}
})
controller.B.onEvent(ControllerButtonEvent.Pressed, function() {
player.dir -= Math.PI / 4
if (player.dir < 0) {
player.dir += Math.PI * 2
}
})
controller.left.onEvent(ControllerButtonEvent.Pressed, function() {
let dx = Math.cos(player.dir - Math.PI / 2) * 0.1
let dy = Math.sin(player.dir - Math.PI / 2) * 0.1
if (map[Math.floor(player.y)][Math.floor(player.x - dx)] === 0) {
player.x -= dx
}
if (map[Math.floor(player.y - dy)][Math.floor(player.x)] === 0) {
player.y -= dy
}
})
controller.right.onEvent(ControllerButtonEvent.Pressed, function() {
let dx = Math.cos(player.dir + Math.PI / 2) * 0.1
let dy = Math.sin(player.dir + Math.PI / 2) * 0.1
if (map[Math.floor(player.y)][Math.floor(player.x + dx)] === 0) {
player.x += dx
}
if (map[Math.floor(player.y + dy)][Math.floor(player.x)] === 0) {
player.y += dy
}
})
controller.up.onEvent(ControllerButtonEvent.Pressed, function() {
let dx = Math.cos(player.dir) * 0.1
let dy = Math.sin(player.dir) * 0.1
if (map[Math.floor(player.y - dy)][Math.floor(player.x)] === 0) {
player.y -= dy
}
if (map[Math.floor(player.y)][Math.floor(player.x + dx)] === 0) {
player.x += dx
}
})
controller.down.onEvent(ControllerButtonEvent.Pressed, function() {
let dx = Math.cos(player.dir + Math.PI) * 0.1
let dy = Math.sin(player.dir + Math.PI) * 0.1
if (map[Math.floor(player.y + dy)][Math.floor(player.x)] === 0) {
player.y += dy
}
if (map[Math.floor(player.y)][Math.floor(player.x - dx)] === 0) {
player.x -= dx
}
})
game.onUpdate(function() {
updateScreen()
screen.show()
})
This could be a new era of raycasting, but I haven’t even tested it out, I just wanted to show all of you guys, especially @AqeeAqee . After this gets posted I’ve probably already tested it. But who ever is verifying this post or whatever: thanks.