]> git.eli173.com Git - pong_br/commitdiff
fixt a bunch, but the angle of reflection is still wrong...
authorElijah Cohen <eli@eli173.com>
Thu, 2 May 2019 22:53:32 +0000 (17:53 -0500)
committerElijah Cohen <eli@eli173.com>
Thu, 2 May 2019 22:53:32 +0000 (17:53 -0500)
server/collisions.js
server/constants.js
server/endpoints.js
server/gamestate.js
web/constants.js

index 150132033ed3d5996186b9c7df2cbd6403bb845e..dba68d255aa5fd20ab8f6d4479142c594434c1c7 100644 (file)
@@ -49,14 +49,15 @@ var segments_intersect = function(e1, e2) {
     var x_val = ((x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4))/((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4));
     var y_val = ((x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4))/((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4));
 
-    if(Math.min(x1, x2) < x_val && x_val < Math.max(x1, x2))
-       return false;
-    if(Math.min(y1, y2) < y_val && y_val < Math.max(y1, y2))
-       return false;
-    if(Math.min(x3, x4) < x_val && x_val < Math.max(x3, x4))
-       return false;
-    if(Math.min(y3, y4) < y_val && y_val < Math.max(y3, y4))
-       return false;
+
+    if(x_val < Math.min(x1,x2)) return false;
+    if(x_val > Math.max(x1,x2)) return false;
+    if(y_val < Math.min(y1,y2)) return false;
+    if(y_val > Math.max(y1,y2)) return false;
+    if(x_val < Math.min(x3,x4)) return false;
+    if(x_val > Math.max(x3,x4)) return false;
+    if(y_val < Math.min(y3,y4)) return false;
+    if(y_val > Math.max(y3,y4)) return false;
     return true;
 }
 
@@ -66,16 +67,17 @@ var handleWalls = function(ball, walls) {
     // modifies ball's velocity if it encounters an actual collision
     // wall is an endpoints
     for(var wall of walls) {
-       var next_spot = new Coord(ball.coord.x + ball.dx, ball.coord.y + ball.dy);
+       var next_spot = new Coord(ball.coord.x + ball.dx/c.FPS, ball.coord.y + ball.dy/c.FPS);
        if(segments_intersect(wall, new Endpoints(ball.coord, next_spot))) {
            //there's a collision
-           console.log("int");
            var wall_normal = new Coord((wall.f.x+wall.s.x)/2, (wall.f.y+wall.s.y)/2); // given by the midpoint
            var normal_angle = Math.atan2(wall_normal.x, wall_normal.y);
            var vel_vec = new Coord(ball.dx, ball.dy);
            vel_vec.rotate(-normal_angle);
-           vel_vec.x = -vel_vec.x; // i'm fairly certain it's x...
+           vel_vec.y = -vel_vec.y; // i'm fairly certain it's x...
            vel_vec.rotate(normal_angle);
+           ball.dx = vel_vec.x;
+           ball.dy = vel_vec.y;
            ball.speed_up();
            return true;
        }
@@ -88,26 +90,28 @@ var handlePaddles = function(ball, lzs, paddles) {
     // same, but with paddles and speed movement bonus
     // i iterate over lzs, get matching paddle
     for(var lz of lzs) {
-       var paddle = this.paddles.find(p => p.id==lz.id);
+       var paddle = paddles.find(p => p.id==lz.id);
        if(paddle === undefined) { // this is badd...
            console.log("paddle not found...");
            return false;
        }
        var wall = paddle.getPaddlePoints(lz);
        //
-       var next_spot = new Coord(ball.coord.x + ball.dx, ball.coord.y + ball.dy);
-       if(segments_intersect(walls, new Endpoints(ball.coord, next_spot))) {
+       var next_spot = new Coord(ball.coord.x + ball.dx/c.FPS, ball.coord.y + ball.dy/c.FPS);
+       if(segments_intersect(wall, new Endpoints(ball.coord, next_spot))) {
            //there's a collision
            var wall_normal = new Coord((wall.f.x+wall.s.x)/2, (wall.f.y+wall.s.y)/2); // given by the midpoint
            var normal_angle = Math.atan2(wall_normal.x, wall_normal.y);
            var vel_vec = new Coord(ball.dx, ball.dy);
            vel_vec.rotate(-normal_angle);
-           vel_vec.x = -vel_vec.x; // i'm fairly certain it's x...
+           vel_vec.y = -vel_vec.y; // i'm fairly certain it's x...
            if(paddle.direction == 'u')
                vel_vec.y += c.PADDLE_MVT_BONUS;
            else if(paddle.direction == 'd')
                vel_vec.y -= c.PADDLE_MVT_BONUS;
            vel_vec.rotate(normal_angle);
+           ball.dx = vel_vec.x;
+           ball.dy = vel_vec.y;
            ball.speed_up();
            return true;
        }
@@ -116,4 +120,4 @@ var handlePaddles = function(ball, lzs, paddles) {
 }
 
 
-module.exports = {handleWalls: handleWalls, handlePaddles, handlePaddles};
+module.exports = {handleWalls: handleWalls, handlePaddles, handlePaddles, segments_intersect: segments_intersect};
index a5fdce4eb889e6fe622df8e3c1ae6d8830c68c69..28e8b732802c8d0a0dd2fb54689ed6d032032087 100644 (file)
@@ -1,10 +1,12 @@
 
 
+var mspf = 100;
 var c = {
     // matchmaker
     WS_PORT: 6789,
-    NUM_PLAYERS: 8,
-    MS_PER_FRAME: 100,
+    NUM_PLAYERS: 4,
+    MS_PER_FRAME: mspf,
+    FPS: 1000/mspf,
     WAIT_TIME: 60000, // 1 minute
     MAX_GAMES: 5, // the most games allowed to go on at once, to be tweaked as needed for purposes
     // gamestate
index bc084241ad3f8f3923ed8b26ff8ccb3aa60be951..f3641b24532a655b72e5c69c2fb79476fc1cd623 100644 (file)
@@ -17,6 +17,10 @@ var AnglePair = function(f,s,id) {
     this.id = id;
 }
 
+Endpoints.prototype.getLength = function() {
+    return Math.sqrt(this.f.dist2(this.s));
+}
+
 Endpoints.prototype.getAngles = function() {
     // gets an anglepair for the endpoints. does assume the first angle is before second
     var fst = Math.atan2(this.f.y, this.f.x);
index 52f63ddb94f2c31f1efb2a762c679caacd7d7150..89a40fc2da50507ecb95a25d192d91551e0b5774 100644 (file)
@@ -40,12 +40,6 @@ GameState.prototype.update = function(inputs) {
     for(var i=0;i<this.paddles.length;i++) {
        this.paddles[i].move(inputs[this.paddles[i].id]); //hacky and bad, requires the inputs be
     }
-    //move the balls
-    // can i increase efficiency or sensibility by doing this later? maybe. should i? unlikely rn
-    for(var ball of this.balls) {
-       ball.coord.x += ball.dx;
-       ball.coord.y += ball.dy;
-    }
     //
     var endpoints = field.genAllEndpoints(this.numPlayers, this.dead);
     var livingzones = endpoints.filter(e => (e.id != -1));
@@ -56,16 +50,18 @@ GameState.prototype.update = function(inputs) {
        var collided = false;
        // first, see if the ball is moving towards the center (should solve most problems with things
        var currd2 = ball.coord.dist2origin();
-       var nextd2 = new Coord(ball.coord.x + ball.dx, ball.coord.y + ball.dy).dist2origin();
+       var nextd2 = new Coord(ball.coord.x + ball.dx/c.FPS, ball.coord.y + ball.dy/c.FPS).dist2origin();
        if(nextd2 < currd2)
            continue;
 
        // below here probably requires changes
        // (check the fixt edges first, then the paddles I guess
-       if(collisions.handleWalls(ball, walls))
+       if(collisions.handleWalls(ball, walls)) {
            continue;
-       if(collisions.handlePaddles(balls, livingzones, this.paddles))
+       }
+       if(collisions.handlePaddles(ball, livingzones, this.paddles)) {
            continue;
+       }
        // i put that last continue but there's nothing left to do...
     }
     
@@ -112,6 +108,11 @@ GameState.prototype.update = function(inputs) {
     if(this.balls.length < (this.numPlayers-this.dead.length)-1) {
        this.balls.push(new Ball());
     }
+        //move the balls
+    for(var ball of this.balls) {
+       ball.coord.x += ball.dx/c.FPS;
+       ball.coord.y += ball.dy/c.FPS;
+    }
 }
 
 GameState.prototype.getState = function() {
index 884666f624ab237332be5eaaf0532178e190c140..ecf70aa29faf12a1ca09b1d90f9a89fb905dfa48 100644 (file)
@@ -3,7 +3,7 @@
 var c = {
     // matchmaker
     WS_PORT: 6789,
-    NUM_PLAYERS: 8,
+    NUM_PLAYERS: 4,
     MS_PER_FRAME: 100,
     WAIT_TIME: 60000, // 1 minute
     MAX_GAMES: 5, // the most games allowed to go on at once, to be tweaked as needed for purposes