javascript - Why isn't the else block firing? -


i'm making html canvas game (tron), , i'm want game detect when player hits border of canvas. have if statement checks if player in contact either own trail or opponents, , works fine, parameter being outside of canvas (y >= 780) doesn't seem doing anything. added snippet. there's library key event handling in there, that's not code (the library no longer necessary after made changes shouldn't have problem). time.

/*! keydrown - v1.2.2 - 2016-03-23 - http://jeremyckahn.github.com/keydrown */  !function(a){var b=function(){var b={};b.foreach=function(a,b){var c;for(c in a)a.hasownproperty(c)&&b(a[c],c)};var c=b.foreach;b.gettranspose=function(a){var b={};return c(a,function(a,c){b[a]=c}),b},b.indexof=function(a,b){if(a.indexof)return a.indexof(b);var c,d=a.length;for(c=0;d>c;c++)if(a[c]===b)return c;return-1};var d=b.indexof;return b.pushunique=function(a,b){return-1===d(a,b)?(a.push(b),!0):!1},b.removevalue=function(a,b){var c=d(a,b);return-1!==c?a.splice(c,1)[0]:void 0},b.documenton=function(b,c){a.addeventlistener?a.addeventlistener(b,c,!1):document.attachevent&&document.attachevent("on"+b,c)},b.requestanimationframe=function(){return a.requestanimationframe||a.webkitrequestanimationframe||a.mozrequestanimationframe||function(b){a.settimeout(b,1e3/60)}}(),b.noop=function(){},b}(),c={a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,enter:13,shift:16,esc:27,space:32,left:37,up:38,right:39,down:40,backspace:8,delete:46},d=b.gettranspose(c),e=[],f=function(){"use strict";function a(a){this.keycode=a,this.cachedkeypressevent=null}function c(a,b,c,d){c?a[b]=c:a[b](d)}return a.prototype._downhandler=b.noop,a.prototype._uphandler=b.noop,a.prototype._presshandler=b.noop,a.prototype.isdown=function(){return-1!==b.indexof(e,this.keycode)},a.prototype.down=function(a){c(this,"_downhandler",a,this.cachedkeypressevent)},a.prototype.up=function(a,b){c(this,"_uphandler",a,b)},a.prototype.press=function(a,b){this.cachedkeypressevent=b,c(this,"_presshandler",a,b)},a.prototype.unbinddown=function(){this._downhandler=b.noop},a.prototype.unbindup=function(){this._uphandler=b.noop},a.prototype.unbindpress=function(){this._presshandler=b.noop},a}(),g=function(e){"use strict";var g={};g.key=f;var h=!1,i=date.now?date.now:function(){return+new date},j=i();return g.tick=function(){var a,b=e.length;for(a=0;b>a;a++){var c=e[a],f=d[c];f&&g[f].down()}},g.run=function(c){h=!0;var d=i(),e=d-j;b.requestanimationframe.call(a,function(){h&&(g.run(c),c(e,d))}),j=d},g.stop=function(){h=!1},b.foreach(c,function(a,b){g[b]=new f(a)}),b.documenton("keydown",function(a){var c=a.keycode,f=d[c],h=b.pushunique(e,c),i=g[f];if(i){var j=i.cachedkeypressevent||{};(j.ctrlkey||j.shiftkey||j.metakey)&&(h=!0),h&&i.press(null,a)}}),b.documenton("keyup",function(a){var c=b.removevalue(e,a.keycode),f=d[c];f&&g[f].up(null,a)}),b.documenton("blur",function(a){b.foreach(e,function(a){var b=d[a];b&&g[b].up()}),e.length=0}),g}(e);"object"==typeof module&&"object"==typeof module.exports?module.exports=g:"function"==typeof define&&define.amd?define(function(){return g}):a.kd=g}(window);
canvas {    width: 1000px;    height: 800px;    margin-left: auto;    margin-right: auto;    display: block;    border: 1px solid black;  }    h1,h2 {    width: 100px;    text-align: center;    margin-left: auto;    margin-right: auto;    font-family: sans-serif;  }    h2 {    border: 5px solid black;    padding: 5px;  }    h2:hover {    background-color: #7df9ff;    cursor: pointer;  }
<!doctype html>  <html>    <head>      <meta charset="utf-8">      <title>tron</title>      <script src="keydrown.min.js"></script>      <link rel="stylesheet" type="text/css" href="tron.css"/>    </head>    <body>      <h1>tron</h1>      <h2>play</h2>      <canvas height="800px" width="1000px"></canvas>      <script>        function game() {          canvas = document.getelementsbytagname('canvas')[0];          ctx = canvas.getcontext('2d');            ctx.fillstyle = "blue";          ctx.fillrect(0,0,20,20);          ctx.fillstyle = "red";          ctx.fillrect(980,780,20,20);            x = 980;          y = 780;          = 0;          b = 0;            // p2 controls            function moveright() {            if(kd.up.isdown() === false && kd.down.isdown() === false && kd.left.isdown() === false && ctx.getimagedata(x+21, y, 1, 1).data[0] !== 255 && ctx.getimagedata(x+21, y, 1, 1).data[2] !== 255) {              x+=10;              ctx.fillstyle = "red";              ctx.fillrect(x,y,20,20);            } else if(ctx.getimagedata(x+21, y, 1, 1).data[0] === 255 || ctx.getimagedata(x+21, y, 1, 1).data[2] === 255 || x >= 980) {              alert("blue wins!");            }          }            kd.right.down(function() {            clearinterval(dir2);            dir2 = setinterval(moveright, 25);          });            function moveleft() {            if(kd.up.isdown() === false && kd.down.isdown() === false && kd.right.isdown() === false && ctx.getimagedata(x-1, y, 1, 1).data[0] !== 255 && ctx.getimagedata(x-1, y, 1, 1).data[2] !== 255) {              x-=10;              ctx.fillstyle = "red";              ctx.fillrect(x,y,20,20);            } else if(ctx.getimagedata(x-1, y, 1, 1).data[0] === 255 || ctx.getimagedata(x-1, y, 1, 1).data[2] === 255 || x <= 0) {              alert("blue wins!");            }          }            kd.left.down(function() {            clearinterval(dir2);            dir2 = setinterval(moveleft, 25);          });            function moveup() {            if(kd.left.isdown() === false && kd.down.isdown() === false && kd.right.isdown() === false && ctx.getimagedata(x, y-1, 1, 1).data[0] !== 255 && ctx.getimagedata(x, y-1, 1, 1).data[2] !== 255) {              y-=10;              ctx.fillstyle = "red";              ctx.fillrect(x,y,20,20);            } else if(ctx.getimagedata(x, y-1, 1, 1).data[0] === 255 || ctx.getimagedata(x, y-1, 1, 1).data[2] === 255 || y <= 0) {              alert("blue wins!");            }          }            kd.up.down(function() {            clearinterval(dir2);            dir2 = setinterval(moveup, 25);          });            function movedown() {            if(kd.left.isdown() === false && kd.up.isdown() === false && kd.right.isdown() === false && ctx.getimagedata(x, y+21, 1, 1).data[0] !== 255 && ctx.getimagedata(x, y+21, 1, 1).data[2] !== 255) {              y+=10;              ctx.fillstyle = "red";              ctx.fillrect(x,y,20,20);            } else if(ctx.getimagedata(x, y+21, 1, 1).data[0] === 255 || ctx.getimagedata(x, y+21, 1, 1).data[2] === 255 || y >= 780) {              alert("blue wins!");            }          }            kd.down.down(function() {            clearinterval(dir2);            dir2 = setinterval(movedown, 25);          });            //  controls            function moved() {            if(kd.w.isdown() === false && kd.s.isdown() === false && kd.a.isdown() === false && ctx.getimagedata(a+21, b, 1, 1).data[0] !== 255 && ctx.getimagedata(a+21, b, 1, 1).data[2] !== 255) {              a+=10;              ctx.fillstyle = "blue";              ctx.fillrect(a,b,20,20);            } else if(ctx.getimagedata(a+21, b, 1, 1).data[0] === 255 || ctx.getimagedata(a+21, b, 1, 1).data[2] === 255 || >= 980) {              alert("red wins!");            }          }            kd.d.down(function() {            clearinterval(dir1);            dir1 = setinterval(moved, 25);          });            function movea() {            if(kd.w.isdown() === false && kd.s.isdown() === false && kd.d.isdown() === false && ctx.getimagedata(a-1, b, 1, 1).data[0] !== 255 && ctx.getimagedata(a-1, b, 1, 1).data[2] !== 255) {              a-=10;              ctx.fillstyle = "blue";              ctx.fillrect(a,b,20,20);            } else if(ctx.getimagedata(a-1, y, 1, 1).data[0] === 255 || ctx.getimagedata(a-1, b, 1, 1).data[2] === 255 || <= 0) {              alert("red wins!");            }          }            kd.a.down(function() {            clearinterval(dir1);            dir1 = setinterval(movea, 25);          });            function movew() {            if(kd.a.isdown() === false && kd.s.isdown() === false && kd.d.isdown() === false && ctx.getimagedata(a, b-1, 1, 1).data[0] !== 255 && ctx.getimagedata(a, b-1, 1, 1).data[2] !== 255) {              b-=10;              ctx.fillstyle = "blue";              ctx.fillrect(a,b,20,20);            } else if(ctx.getimagedata(a, b-1, 1, 1).data[0] === 255 || ctx.getimagedata(a, b-1, 1, 1).data[2] === 255 || b <= 0) {              alert("red wins!");            }          }            kd.w.down(function() {            clearinterval(dir1);            dir1 = setinterval(movew, 25);          });            function moves() {            if(kd.a.isdown() === false && kd.w.isdown() === false && kd.d.isdown() === false && ctx.getimagedata(a, b+21, 1, 1).data[0] !== 255 && ctx.getimagedata(a, b+21, 1, 1).data[2] !== 255) {              b+=10;              ctx.fillstyle = "blue";              ctx.fillrect(a,b,20,20);            } else if(ctx.getimagedata(a, b+21, 1, 1).data[0] === 255 || ctx.getimagedata(a, b+21, 1, 1).data[2] === 255 || b >= 780) {              alert("red wins!");            }          }            kd.s.down(function() {            clearinterval(dir1);            dir1 = setinterval(moves, 25);          });            kd.run(function () {            kd.tick();          });            dir1 = setinterval(moved, 25);          dir2 = setinterval(moveleft, 25);        }          document.getelementsbytagname('h2')[0].addeventlistener('click', function(){          game();        });      </script>    </body>  </html>

learning program not easy , little bugs can make more of chore joy.

i can not spot bug because not 100% sure want happen.

there many bad things waiting cause problems further on.

so rather find , fix problem rewrote code in manner easier manage, more friendly dom, , little less prone bugs.

the keyboard handle using way overkill need there simple keyboard handler @ top.

i hate use of alerts. can cause sorts of problems, changed code show results on canvas.

rather repeat code each player added function handle single play passed object. player1, player2 objects contain makes player unique , updateplayer function called each player.

there drawplayer function draw.

rather use timers update game requestanimationframe. should try avoid using setinterval , settimeout not make animation quality , can make timing messed up.

the player keyboard handling little complex @ first thought wanted play rule, "move when 1 move key down." eg when , left held down had no movement, , when release key player stops (but saw keyboard handler giving keydowns when no keys down". can add behaviour if wanted replacing & (bitwise and) === eg if(keypadbits & up){ becomes if(keypadbits === up) in updateplayer function

i added "use strict" top of game function. makes code run faster forces more careful when coding rules strict. stop creating situations code runs , not report bug. may never have bug happen, or might , hard pressed find it. strict mode active error reported , can fix , there.

(function game() {      "use strict"; // never code without line or live in hell of billion bugs      var canvas = document.getelementsbytagname('canvas')[0];      //var canvas = document.getelementbyid('can');      var ctx = canvas.getcontext('2d');            //==============================================================================================================      // constants , variables      // bit positions keypad       const = 0b1000;      const right = 0b100;      const down = 0b10;      const left = 0b1;      // speeds , sizes      const move_speed = 10;      const player_size = 20;      const play_field_sizew = canvas.width - player_size;      const play_field_sizeh = canvas.height - player_size;      // flags game state      var gameover = true;  // must start game gameover= true or not start      //==============================================================================================================      // keyboard handler replace overkill  keydrown lib      var keys = {};      var filterkeys = "arrowup,arrowdown,arrowleft,arrowright,keya,keys,keyd,keyw".split(","); // array of keys listen      function keyboard(event){          if(filterkeys.indexof(event.code) > -1){ // filter out unwanted key events              keys[event.code] = event.type === "keydown";  // true if key down false if not              event.preventdefault();          }      }      document.body.addeventlistener("keydown",keyboard);      document.body.addeventlistener("keyup",keyboard);                  //==============================================================================================================      // player restart function      var restartplayer = function(){          this.x = this.start.x;          this.y = this.start.y;          this.dx = this.start.dx;          this.dy = this.start.dy;          this.crash = false;                  }              // player details      var player1 = {          x : 980,       // should set player start positions          y : 0,          dx : 0,   // movement direction          dy : 0,          start : {x: canvas.width - player_size, y : canvas.height - player_size,dx :-1,dy :0},          crash : false,          id : 0,          col : "red",          restart : restartplayer,      }      var player2 = {          x : 0,       // should set player start positions          y : 0,          dx : 0,   // movement direction          dy : 0,          start : {x: 0, y : 0,dx : 1,dy : 0},          crash : false,          id : 1,          col : "blue",          restart : restartplayer,      }            //==============================================================================================================      // check player keys moves if needed , checks crashes      function updateplayer(player){          debugger          var keypadbits = 0;          // set bits keys down          if(player.id === 0){ // first player              keypadbits |= keys.arrowup   ? : 0;              keypadbits |= keys.arrowright? right : 0;              keypadbits |= keys.arrowdown ? down : 0;              keypadbits |= keys.arrowleft ? left : 0;          }else{              keypadbits |= keys.keyw ? : 0;              keypadbits |= keys.keyd ? right : 0;              keypadbits |= keys.keys ? down : 0;              keypadbits |= keys.keya ? left : 0;          }          // movement direction in order of priority          // can have diagonals eg if(keypadbits & (up+left))          if(keypadbits & up){  // yes single & bitwise , operator              player.dy = -1;              player.dx = 0;                          }else if(keypadbits & down){// yes single & bitwise , operator                player.dy = 1;              player.dx = 0;                          }else if(keypadbits & right){// yes single & bitwise , operator                player.dx = 1;              player.dy = 0;                          }else if(keypadbits & left){// yes single & bitwise , operator                player.dx = -1;              player.dy = 0;                          }          // check pixel in direction of movement           var x = player.x + player.dx + player_size * (player.dx > 0 ? 1 : 0);          var y = player.y + player.dy + player_size * (player.dy > 0 ? 1 : 0);          var data = ctx.getimagedata(x,y, 1, 1).data;          if(data[0] !== 255 && data[2] !== 255){              player.x += move_speed * player.dx;              player.y += move_speed * player.dy;              // player has moved check edge crash              if( player.x < 0 || player.y < 0 || player.x > play_field_sizew || player.y > play_field_sizeh){                   player.crash = true;              }                          } else { // player must have crashed if red , blue on              player.crash = true;          }                }      // draws player @ current position      function drawplayer(player){          ctx.fillstyle = player.col;          ctx.fillrect(player.x, player.y, player_size, player_size);        }      // updates both players          function playerupdate(){          if(!gameover){              updateplayer(player1);              updateplayer(player2);              // draw both players after both have moved or give 1 player slight advantage of being              // invisible @ current position              drawplayer(player1);              drawplayer(player2);              if(player1.crash || player2.crash){                  gameover = true;                  var text = "";                  var col = "black";                  if(player1.crash && player2.crash){  // may draw if both crash @ same time                      text = "it's draw!";                  }else  if(player1.crash){                        text = "blue wins!";                      col= "blue";                  }else {                      text = "red wins!";                      col = "red";                  }                  ctx.font = "64px arial black";                  ctx.textalign = "center";                  ctx.fillstyle = col;                  ctx.strokestyle = "black";                  ctx.linewidth = 4;                  if(col !== "black"){                      ctx.stroketext(text,canvas.width * 0.5, canvas.height * 0.4);                  }                  ctx.filltext(text,canvas.width * 0.5, canvas.height * 0.4);                  ctx.fillstyle = "black";                  ctx.font = "24px arial black";                  ctx.filltext("click 'play' start again.",canvas.width * 0.5, canvas.height * 0.6 );              }          }      }      // function restart game      function restartgame(){          player1.restart();          player2.restart();          gameover = false;          ctx.clearrect(0,0,canvas.width,canvas.height);      }        // main animation loop called 60 times second.      function update(time){          playerupdate();          if(!gameover){              requestanimationframe(update);          }      }      document.getelementsbytagname('h2')[0].addeventlistener('click', function(){          if(gameover){              restartgame();              requestanimationframe(update);          }      });  })();  // run function (function(){})() invoked function            
canvas {    width: 1000px;    height: 800px;    margin-left: auto;    margin-right: auto;    display: block;    border: 1px solid black;  }    h1,h2 {    width: 100px;    text-align: center;    margin-left: auto;    margin-right: auto;    font-family: sans-serif;  }    h2 {    border: 5px solid black;    padding: 5px;  }    h2:hover {    background-color: #7df9ff;    cursor: pointer;  }
    <h1>tron</h1>      <h2>play</h2>      <canvas height="800px" width="1000px"></canvas>


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -