Transforms are added…endlessly

前端 未结 3 1751
灰色年华
灰色年华 2020-12-06 20:24

I\'m creating a simple asteroids-like game in CSS and JS using the DOM over canvas for...experimentation purposes.

My code is pretty small in this example to make i

3条回答
  •  生来不讨喜
    2020-12-06 21:00

    I think the problem is the detectMovement is calling the checkKeys again and again in infinite loop with same event e.

    I tried adding listeners for keyup, keydown, keyleft and keyright so that checkkeys is called only when these keys are pressed.

    Please comment if I have understood wrongly

    'use strict';
    
    function defineDistances() {
      var distance = {};
    
      distance.up = -1;
      distance.right = 1;
      distance.down = 1;
      distance.left = -1;
          
      return distance;
    }
    
    function defineKeys() {
      var keys = {};
    
      keys.up = 38;
      keys.right = 39;
      keys.down = 40;
      keys.left = 37;
          
      return keys;
    }
    
    function checkKeys( e ) {
    e.preventDefault();
      var triBx = document.getElementById( 'v-wrp' ),
          keys = defineKeys(),
          distance = defineDistances();
    
      switch( e.keyCode ) {
        case keys.up:
          triBx.style.transform += 'translateY(' + distance.up + 'px)';
          break;
        case keys.right:
          triBx.style.transform += 'rotate(' + distance.right + 'deg)';
          break;
        case keys.down:
          triBx.style.transform += 'translateY(' + distance.down + 'px)';
          break;
        case keys.left:
          triBx.style.transform += 'rotate(' + distance.left + 'deg)';
          break;
      }
    }
    
    function detectMovement( e ) {
      setInterval ( 
        function() {
          checkKeys( e );
        },
        1000/24
      );  
    }
    
    function start() {
      window.addEventListener( 'keydown', checkKeys );
      window.addEventListener( 'keyup', checkKeys );
      window.addEventListener( 'keyright', checkKeys );
      window.addEventListener( 'keyleft', checkKeys );
    }
    
    start();
    @import url( "https://fonts.googleapis.com/css?family=Nunito" );
    
    html {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100%;
      font-family: "Nunito", sans-serif;
      font-size: 2rem;
    }
    
    .v {
      display: block;
      transform: rotate( 180deg );
    }
    V

提交回复
热议问题