xxxxxxxxxx
205
// turns out 3D math is too hard
let font
function preload(){
font = loadFont("/RobotoMono-Regular.ttf")
}
function mouseClicked(event) {
if(mouseX >= 0 && mouseY >= 0 && mouseX < 400 && mouseY < 400){
cameraLocked = true
requestPointerLock()
}
return false
}
let cameraX = 0
let cameraY = 0
let cameraZ = 800
let cameraYaw = 180
let cameraPitch = 0
let parts = []
class Part {
constructor(x,y,z,w,h,d){
this.x = x
this.y = y
this.z = z
this.w = w
this.h = h
this.d = d
this.fill = [255,255,255]
this.stroke = [0,0,0]
this.hidden = false
this.active = true
this.collidable = true
this.drawn = false
this.checked = false
parts.push(this)
}
draw(){
if(!this.drawn){
this.render()
this.drawn = true
}
}
render(){
push()
translate(this.x,this.y,this.z)
fill(this.fill)
stroke(this.stroke)
box(this.w,this.h,this.d)
pop()
}
}
function drawParts(){
for(let part of parts){
part.draw()
part.drawn = false
}
}
let onGround = false
function checkCollision(){
onGround = false
for(let part of parts){
if(part.collidable){
if(py + pdy > part.y - part.h/2 && py + pdy < part.y + part.h/2 && px + pdx > part.x - part.w/2 && px + pdx < part.x + part.w/2 && pz + pdz > part.z - part.d/2 && pz + pdz < part.z + part.d/2){
let cdist = sqrt( pow(part.x - (part.x + part.w), 2) + pow(part.y - (part.y + part.h), 2) + pow(part.z - (part.z + part.d), 2) )
let ha = 0
let va = 0
if(!(py > part.y - part.h/2 && py < part.y + part.h/2)){
pdy = 0
if(part.y > py) onGround = true
}
}
}
}
}
let testPart = new Part(0, 100, 400, 1000, 100, 1000)
let rgbPart = new Part(100, 0, 0, 50, 50, 50)
rgbPart.stroke = [255,255,255]
function setup() {
createCanvas(400, 400, WEBGL);
angleMode(DEGREES)
}
let cameraLocked
let px = 0
let py = 0
let pz = 800
let pdx = 0
let pdy = 0
let pdz = 0
let time = 0
function draw() {
let dt = round(deltaTime/1000,3)
time += dt
background(220);
if(cameraLocked){
cameraYaw -= movedX * 0.1
cameraPitch += movedY * 0.1
}
cameraPitch = min(max(cameraPitch, -90), 90)
fill(255)
box()
colorMode(HSL, 255)
rgbPart.fill = color((time*20)%255,255,150)
colorMode(RGB, 255)
let xrot = ( sin(cameraYaw) )*10
let yrot = ( sin(cameraPitch) )*10
let zrot = ( cos(cameraYaw))*10
if(keyIsDown(87)) {
pdx = sin(cameraYaw) * dt * 200
//cameraY += sin(cameraPitch) * dt * 200
pdz = cos(cameraYaw) * dt * 200
}
if(keyIsDown(83)){
pdx = sin(cameraYaw) * dt * -200
//cameraY += sin(cameraPitch) * dt * 200
pdz = cos(cameraYaw) * dt * -200
}
if(keyIsDown(65)) {
pdx = sin(cameraYaw + 90) * dt * 200
pdz = cos(cameraYaw + 90) * dt * 200
}
if(keyIsDown(68)){
pdx = sin(cameraYaw + 90) * dt * -200
pdz = cos(cameraYaw + 90) * dt * -200
}
if(keyIsDown(32)) {
pdy = -10
}
if(keyIsDown(ESCAPE)){
cameraLocked = false
}
// gravity
pdy += 20 * dt
// drag
pdx = pdx - (pdx * 0.1)
pdz = pdz - (pdz * 0.1)
checkCollision()
px += pdx
py += pdy
pz += pdz
cameraX = px
cameraY = py - 50
cameraZ = pz
textFont(font)
fill(0)
text("x: " + round(cameraX) + " y: " + round(cameraY) + " z: " + round(cameraZ), -180, -180)
drawParts()
camera(cameraX,cameraY,cameraZ, cameraX + xrot, cameraY + yrot, cameraZ + zrot)
}