window.onload = function() { var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); var t = Date.now(); var x = 0; var y = 0; var dir = 1; var speed = 150 + Math.round(Math.random()*(75)); x =+ 10; function draw() { var timePassed = (Date.now() - t) /1000; t = Date.now() context.clearRect(0, 0, 600, 600) context.beginPath(); context.rect(x, y, 100, 60) context.fillStyle = "white" context.fill(); if (y <= 0) { dir = 2; } if (x <= 0) { dir = 1; } if (x>= 600-100) { dir= 2; } if (y >= 600-60) { dir = 3; } if ((y >= 270 && y<= 300) && x >= 500) { dir = Math.round(Math.random()*4); } if ((x >= 250 && x <= 350) && y >= 540) { dir = Math.round(Math.random()*4); } if ((x >= 250 && x<=350) && y <= 0) { dir =Math.round(Math.random()*4); } if ( x >= 600-100 && y >= 300) { dir = Math.round(Math.random()*4); } if (x <= 0 && y>300) { dir = Math.round(Math.random()*4); } if (x >= 600-100 && y <= 300-60) { dir = Math.round(Math.random()*4); } if (x <= 0 && y <= 300-60) { dir = Math.round(Math.random()*4); } if (y <= 0 && x <= 300-100) { dir = Math.round(Math.random()*4); } if (y <= 0 && x >= 300) { dir = Math.round(Math.random()*4); } if (y >= 600-60 && x<=300-100) { dir = Math.round(Math.random()*4); } if (y >= 600-60 && x>=300) { dir = Math.round(Math.random()*4); } if (dir == 1) { x += speed*timePassed; y += speed*timePassed; } else if (dir == 2) { x -= speed*timePassed; y += speed*timePassed; } else if (dir == 3) { x -= speed*timePassed; y -= speed*timePassed; } else if (dir == 4) { x += speed*timePassed; y -= speed*timePassed; } if (speed > 225) { speed = 150 + (Math.round(Math.random()*75)); } window.requestAnimationFrame(draw); } draw(); }
I just wrote my first code to try and make a DVD screensaver animation or something, but for some reason my code keeps glitching in the corners; Can you help me solve it? Please don't judge because this is my first code and if you can fix it by changing the values and content and actually use the same logic, I'm using it there.
P粉7812356892024-02-22 00:09:59
I modified your logic slightly and separated the calculation of horizontal and vertical speed:
function rnd(n){return Math.ceil(Math.random()*n)} var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); var t = Date.now(); const w=600,h=600; var x = 10; var y = 10; var xspeed=150+rnd(75), yspeed=150+rnd(75); function draw() { var timePassed = (Date.now() - t) /1000; t = Date.now() context.clearRect(0, 0, w, h) context.beginPath(); context.rect(x, y, 100, 60) context.fillStyle = "red" context.fill(); if (y<=0 || y >= h-60) yspeed=-yspeed; if (x<=0 || x>= w-100) xspeed=-xspeed; x += xspeed*timePassed; y += yspeed*timePassed; window.requestAnimationFrame(draw); } draw();