首页 > 解决方案 > 无法在 if(isTouching()) 块下设置精灵速度

问题描述

    var player = createSprite(320,390,20,20);
    var wall1 = createSprite(220,360,210,20);
    var wall2 = createSprite(180,300,210,20);

    createEdgeSprites();

    wall1.velocityX = 2;
    wall2.velocityX = -2;




    function draw() {
      background("white");
      if(keyWentDown("space")&&player.velocityY==0){
        player.velocityY = -10;
      }
 
      player.velocityY += 0.8;

      if(keyDown("left")){
        player.x-=5;
      }
      if(keyDown("right")){
        player.x+=5;
      }


      if(player.isTouching(wall1)){
        player.velocityX = wall1.velocityX;
        console.log("Player velocity: "+player.velocityX);
        console.log("Wall1 velocity: "+wall1.velocityX);
      }
      else{
        player.velocityX = 0;
      }
      if(player.isTouching(wall2)){
        player.velocityX = wall2.velocityX;
        console.log("Player velocity: "+player.velocityX);
        console.log("Wall2 velocity: "+wall2.velocityX);
      } 
      wall1.bounceOff(edges);
      wall2.bounceOff(edges);

      player.collide(edges);
      player.collide(wall1);
      player.collide(wall2);
      drawSprites();
    }

我正在 code.org 的游戏实验室中尝试这个迷宫项目。我希望玩家的移动速度与墙的移动速度相同。控制台中显示的速度指向相同的数字,但我相信 player.collide(wall) 指令导致播放器和墙之间的速度差异。有人可以帮我克服这个问题吗?如果我不提供碰撞选项,我怎样才能让玩家站在墙上并分配与墙相同的速度?

标签: javascriptcode.org

解决方案


问题在于一小段代码:

else {
    player.velocityX = 0;
}

那个讨厌的小else声明是导致这个问题的原因。你看,你的 else 声明说如果player是感人wall1的,那么给他们同样的速度。问题是,这else是不必要的。

draw()函数每秒 50 次(我更改了帧速率),每次执行时,它都会检查if语句是否为真。如果不正确,if则不执行语句中的代码。else如果玩家不是,则执行该语句。接触wall1,包括何时接触wall2或不接触任何东西。这意味着一旦你每帧降落在wall2(底部)上,引擎。对是否将player的速度设置为 0 或 的速度感到困惑wall2,并且出于某种原因,将其设置为 的速度的负数wall2。删除该语句,它就可以正常工作。

这是经过一些修改的最终项目:

浮动迷宫

希望这有帮助!


推荐阅读