Topic: points in polygon test |
|
---|---|
Author | Thread |
Nervous Wreck (II) Inmate From: Portland Oregon |
posted 03-26-2010 21:20
Hi folks, I'm trying to make this little asteroids script work and I'm so close, but I just seem to be overlooking something. I have an array that holds the objects that define the asteroids. I also have an array in the player object that holds the bullets, which are objects also. Simple enough? I thought so. I tested the point in poly function using the player.bullets[0] and it works. So, I tried to iterate through all the bullets and all the asteroids in a loop. code: <html> <head> <title></title> <script type="text/javascript" src="excanvas.js"></script> </head> <body> <script> function pnpoly(xp, yp, x, y) { var c = 0; for (i in xp) { j = i++; if ((((yp[i] <= y) && (y < yp[j])) || ((yp[j] <= y) && (y < yp[i]))) && (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i])) { c = !c } } return c } var level = 1 var canvas = null; var c2d = null; //... window.onload = init; function init() { thrustFlame = false asteroids = [{ x: 470, y: 290, angle: 1.71, inertia: .5, inertiaAngle: 1.2, points_x: [-30, -27, 5, 15, 30, 15, -5], points_y: [-5, 15, 30, 27, -5, -25, -30], hits: 0 }, { x: 270, y: 290, angle: 1.71, inertia: .75, inertiaAngle: 1.9, points_x: [-30, -10, 0, 20, 40, 20, -10], points_y: [0, -20, -50, -30, 0, 20, 20], hits: 0 }] player = { x: 50, y: 50, angle: 1.71, inertia: 0, inertiaAngle: 0, bullets: [] } canvas = document.getElementById('canvas'); ctx = canvas.getContext('2d'); setInterval(step, 60); } function step() { for (i in asteroids) { asteroids[i].angle += i % 2 == 0 ? .05 : -.05 asteroids[i].x < 0 ? asteroids[i].x = canvas.width : asteroids[i].x %= canvas.width asteroids[i].y < 0 ? asteroids[i].y = canvas.height : asteroids[i].y %= canvas.height asteroids[i].x += Math.sin(asteroids[i].inertiaAngle) * asteroids[i].inertia; asteroids[i].y += -Math.cos(asteroids[i].inertiaAngle) * asteroids[i].inertia } ctx.fillStyle = "rgb(0,0,0)" ctx.fillRect(0, 0, canvas.width, canvas.height); for (u = 0; u < asteroids.length; u++) { ctx.save(); ctx.beginPath() Asteroid_draw(asteroids[u]); ctx.closePath(); ctx.strokeStyle = "#eeeeff"; ctx.stroke(); ctx.restore(); } if (asteroids.length > 0) { for (num in asteroids) { if (player.bullets.length > 0) { for (n in player.bullets) { if (pnpoly(asteroids[num].points_x, asteroids[num].points_y, player.bullets[n].x - asteroids[num].x, player.bullets[n].y - asteroids[num].y) == true) { player.bullets.splice(n, 1); asteroids[num].hits++; for (z in asteroids[num].points_x) { asteroids[num].points_x[z] *= .5; asteroids[num].points_y[z] *= .5; if (asteroids[num].hits > 2) asteroids.splice(num, 1) } } } } } } else { level++; for (i = 0; i < level + 1; i++) { asteroids.push({ x: 200 * Math.random(), y: 200 * Math.random(), angle: Math.random() * 2, inertia: Math.random() * 3, inertiaAngle: 1.2, points_x: [-30, -27, 5, 15, 30, 15, -5], points_y: [-5, 15, 30, 27, -5, -25, -30], hits: 0 }) } } ctx.save(); ctx.beginPath() Player_draw(player); ctx.closePath() ctx.strokeStyle = "#eeeeff"; ctx.stroke(); ctx.restore() if (thrustFlame) { ctx.save(); ctx.beginPath() Player_drawFlame(player); ctx.closePath() ctx.strokeStyle = "#ff0000"; ctx.stroke(); ctx.restore() thrustFlame = false } player.x < 0 ? player.x = canvas.width : player.x %= canvas.width player.y < 0 ? player.y = canvas.height : player.y %= canvas.height if (player.inertia > .025) player.inertia -= .025; player.x += Math.sin(player.inertiaAngle) * player.inertia; player.y += -Math.cos(player.inertiaAngle) * player.inertia for (i = 0; i < player.bullets.length; i++) { player.bullets[i].timer++; player.bullets[i].x < 0 ? player.bullets[i].x = canvas.width : player.bullets[i].x %= canvas.width player.bullets[i].y < 0 ? player.bullets[i].y = canvas.height : player.bullets[i].y %= canvas.height player.bullets[i].x += Math.sin(player.bullets[i].inertiaAngle) * player.bullets[i].inertia; player.bullets[i].y += -Math.cos(player.bullets[i].inertiaAngle) * player.bullets[i].inertia ctx.save(); ctx.beginPath() ctx.fillStyle = "rgba(255,255,0,1)" ctx.arc(player.bullets[i].x, player.bullets[i].y, 1.5, 0, 3.14, true) ctx.fill() ctx.closePath() ctx.restore(); if (player.bullets[i].timer > player.bullets[i].range) player.bullets.shift() } } function Asteroid_draw(obj) { ctx.translate(obj.x, obj.y) ctx.rotate(obj.angle); ctx.moveTo(obj.points_x[0], obj.points_y[0]); for (i = 0; i < obj.points_x.length - 1; i++) { ctx.lineTo(obj.points_x[i], obj.points_y[i]); } ctx.lineTo(obj.points_x[0], obj.points_y[0]) } function Player_draw(obj) { ctx.translate(obj.x, obj.y); ctx.rotate(obj.angle); //Points {0,-12}{7,5}{-7,5} ctx.moveTo(0, -12); ctx.lineTo(7, 4); ctx.lineTo(-7, 4); ctx.moveTo(-7, 4) ctx.lineTo(0, -12); } function Player_drawFlame(obj) { ctx.translate(obj.x, obj.y); ctx.rotate(obj.angle); ctx.moveTo(-2, 2); ctx.lineTo(0, 12); ctx.lineTo(2, 2); } document.onkeydown = function (event) { keyDown(event) }; function keyDown(event) { event = !event ? window.event : event if (event.keyCode == 32) { player.bullets.push({ x: player.x, y: player.y, inertia: player.inertia + 10, inertiaAngle: player.angle, timer: 0, range: 40 }) } if (event.keyCode == 37) { player.angle -= .1 } /*left*/ else if (event.keyCode == 39) { player.angle += .1 } /*right*/ else if (event.keyCode == 38) { thrustFlame = true var x1 = Math.cos(player.inertiaAngle) * player.inertia; var y1 = Math.sin(player.inertiaAngle) * player.inertia; var x2 = Math.cos(player.angle) * .2; var y2 = Math.sin(player.angle) * .2; var xR = x1 + x2; var yR = y1 + y2; var lengthR = Math.sqrt(xR * xR + yR * yR); if (lengthR == 0) { angleR = 0 } var angleR = Math.acos(xR / lengthR); if (yR < 0) angleR = 0 - angleR; player.inertia = lengthR // player.inertiaAngle = (player.inertiaAngle*19 + player.angle) / 20 player.inertiaAngle = angleR } /* up*/ else if (event.keyCode == 40) { player = { x: 50, y: 50, angle: 1.71, inertia: 0, inertiaAngle: 0 } } /*down*/ } </script> <canvas id="canvas" width="600" height="600"></canvas> </body> </html> |
Paranoid (IV) Inmate From: Johnstown, PA |
posted 03-29-2010 23:42
Eh, |
Lunatic (VI) Mad Scientist From: Massachusetts, USA |
posted 03-30-2010 05:00 |
Paranoid (IV) Inmate From: Norway |
posted 03-30-2010 10:03
And how about using the CanvasRenderingContext2DisPointInPath( x, y ) method ? |
Nervous Wreck (II) Inmate From: Portland Oregon |
posted 03-30-2010 20:20
Slime said: |
Maniac (V) Mad Scientist From: 127 Halcyon Road, Marenia, Atlantis |
posted 03-31-2010 08:03
Man- you guy come out of nowhere and then post so fast! |
Nervous Wreck (II) Inmate From: Portland Oregon |
posted 03-31-2010 16:35
Yeah, it's supposed to be the hyperspace button. I was going to have it position the player at random points, but I didn't adjust it yet. |
Nervous Wreck (II) Inmate From: Portland Oregon |
posted 03-31-2010 16:42
I fixed it. I forgot to add the bullets array into the object I'm using to set the new player position when hyperspace it hit.. |
Obsessive-Compulsive (I) Inmate From: |
posted 07-30-2010 10:09
TP: Spam removed |
Nervous Wreck (II) Inmate From: |
posted 05-31-2011 11:03
Edit TP: spam removed
|