元素未在画布上呈现 更新

如何解决元素未在画布上呈现 更新

我正在做一个乒乓球游戏,一切都进行得很好,直到我编码了得分系统,该系统具有两个变量,一个变量用于玩家的得分,另一个变量用于ai的得分。当球越过桨叶时,它将检测到它击中了哪堵墙,并将1添加到正确的得分变量中,然后警告得分。现在,当我运行游戏时,canvas元素只是空白。我想知道这里是否有人可以弄清楚发生了什么。这是我的代码。

<canvas id='my' width='640' height='480'></canvas>
<script>
  var canvas = document.getElementById("my");
  var ctx = canvas.getContext("2d");

  function paddle(x,y,width,height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.speedModifier = 0;
    this.hasCollidedWith = function(ball) {
      var paddleLeftWall = this.x;
      var paddleRightWall = this.x + this.width;
      var paddleTopWall = this.y;
      var paddleBottomWall = this.y + this.height;
      if (ball.x > paddleLeftWall &&
        ball.x < paddleRightWall &&
        ball.y > paddleTopWall &&
        ball.y < paddleBottomWall) {
        return true;
      }
      return false;
    };
    this.move = function(keyCode) {
      var nextY = this.y;
      if (keyCode == 40) {
        nextY += 5;
        this.speedModifer = 1.5;
      } else if (keyCode == 38) {
        nextY += -5;
        this.speedModifier = 1.5;
      } else {
        this.speedModifier = 0;
      }
      nextY = nextY < 0 ? 0 : nextY;
      nextY = nextY + this.height > 480 ? 480 - this.height : nextY;
      this.y = nextY;
    };
  }
  var player = new paddle(5,200,25,100);
  var ai = new paddle(610,100);
  var ball = {
    x: 320,y: 240,radius: 7,xSpeed: 2,ySpeed: 0,var playerscore = 0
    var aiscore = 0
    reverseX: function() {
      this.xSpeed *= -1;
    },reverseY: function() {
      this.ySpeed *= -1;
    },reset: function() {
      alert('The score is now '
        playerscore + ' to ' + aiscore);
      this.x = 20;
      this.y = 24 30;
      this.xSpeed = 2;
      this.ySpeed = 0;

    },isBouncing: function() {
      return ball.ySpeed != 0;
    },modifyXSpeedBy: function(modification) {
      modification = this.xSpeed < 0 ? modification * -1 : modification;
      var nextValue = this.xSpeed + modification;
      nextValue = Math.abs(nextValue) > 9 ? 9 : nextValue;
      this.xSpeed = nextValue;
    },modifyYSpeedBy: function(modification) {
      modification = this.ySpeed < 0 ? modification * -1 : modification;
      this.ySpeed += modification;
    }
  };

  function tick() {
    updateGame();
    draw()
    window.setTimeout("tick()",1000 / 60);
  }

  function updateGame() {
    ball.x += ball.xSpeed;
    ball.y += ball.ySpeed;
    if (ball.x < 0) {
      ball.reset();
      aiscore = aiscore + 1;

    }
    if (ball.x > 640) {
      ball.reset();
      playerscore = playerscore + 1

    }
    if (ball.y <= 0 || ball.y >= 480) {
      ball.reverseY();
    }
    var collidedWithPlayer = player.hasCollidedWith(ball);
    var collidedWithAi = ai.hasCollidedWith(ball);
    if (collidedWithPlayer || collidedWithAi) {
      ball.reverseX();
      ball.modifyXSpeedBy(0.25);
      var speedUpValue = collidedWithPlayer ? player.speedModifier : ai.speedModifier;
      ball.modifyYSpeedBy(speedUpValue);
    }
    for (var keyCode in heldDown) {
      player.move(keyCode);
    }
    var aiMiddle = ai.y + (ai.height / 2);
    if (aiMiddle < ball.y) {
      ai.move(40);
    }
    if (aiMiddle > ball.y) {
      ai.move(38);
    }

  }

  function draw() {
    ctx.fillStyle = "black";
    ctx.fillRect(0,640,480);
    renderPaddle(player);
    renderPaddle(ai);
    renderBall(ball);
  }

  function renderPaddle(paddle) {
    ctx.fillStyle = "blue";
    ctx.fillRect(paddle.x,paddle.y,paddle.width,paddle.height);
  }

  function renderBall(ball) {
    ctx.beginPath();
    ctx.arc(ball.x,ball.y,ball.radius,2 * Math.PI,false);
    ctx.fillStyle = "pink";
    ctx.fill();
  }
  var heldDown = {};
  window.addEventListener("keydown",function(keyInfo) {
    heldDown[event.keyCode] = true;
  },false);
  window.addEventListener("keyup",function(keyInfo) {
    delete heldDown[event.keyCode];
  },false);
  tick();
</script>

编辑 因此,计分功能正在发挥作用,现在我正尝试使之发挥作用,以便在任一位玩家获得5分时停止游戏。我试图用回报来做到这一点;方法,但是现在我有和以前一样的黑屏问题。更新的代码在这里。

<canvas id='my' width = '640' height = '480'></canvas>
<script>

var canvas = document.getElementById("my");
var ctx = canvas.getContext("2d");
canvas.style.display = 'block';
function paddle(x,height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.speedModifier = 0;
    this.hasCollidedWith = function(ball) {
        var paddleLeftWall = this.x;
        var paddleRightWall = this.x + this.width;
        var paddleTopWall = this.y;
        var paddleBottomWall = this.y + this.height;
        if (ball.x > paddleLeftWall &&
            ball.x < paddleRightWall &&
            ball.y > paddleTopWall &&
            ball.y < paddleBottomWall) {
            return true;
        }
        return false;
    };
    this.move = function(keyCode) {
        var nextY = this.y;
        if (keyCode == 40) {
            nextY += 5;
            this.speedModifer = 1.5;
        } else if (keyCode == 38) {
            nextY += -5;
            this.speedModifier = 1.5;
        } else {
            this.speedModifier = 0;
        }
        nextY = nextY < 0 ? 0 : nextY;
        nextY = nextY + this.height > 480 ? 480 - this.height : nextY;
        this.y = nextY;
    };
}
var player = new paddle(5,100);
var ai = new paddle(610,100);
var ball = {
    x: 320,playerscore: 0,aiscore: 0,reverseX: function() {
        this.xSpeed *= -1;
    },reverseY: function() {
        this.ySpeed *= -1;
    },reset: function() {
        alert('The score is now ' + playerscore + ' to ' + aiscore);
        this.x = 20;
        this.y = 24;
        this.xSpeed = 2;
        this.ySpeed = 0;
        
    },isBouncing: function() {
        return ball.ySpeed != 0;
    },modifyXSpeedBy: function(modification) {
        modification = this.xSpeed < 0 ? modification * -1 : modification;
        var nextValue = this.xSpeed + modification;
        nextValue = Math.abs(nextValue) > 9 ? 9 : nextValue;
        this.xSpeed = nextValue;
    },modifyYSpeedBy: function(modification) {
        modification = this.ySpeed < 0 ? modification * -1 : modification;
        this.ySpeed += modification;
    }
};

function tick() {
    updateGame();
    draw()
    window.setTimeout("tick()",1000 / 60);
}

function updateGame() {
    ball.x += ball.xSpeed;
    ball.y += ball.ySpeed;
    if (ball.x < 0) {
        ball.reset();
        aiscore = aiscore + 1;
        
    }
    if (ball.x > 640) {
        ball.reset();
        playerscore = playerscore + 1
        
    }
    if (ball.y <= 0 || ball.y >= 480) {
        ball.reverseY();
    }
    var collidedWithPlayer = player.hasCollidedWith(ball);
    var collidedWithAi = ai.hasCollidedWith(ball);
    if (collidedWithPlayer || collidedWithAi) {
        ball.reverseX();
        ball.modifyXSpeedBy(0.25);
        var speedUpValue = collidedWithPlayer ? player.speedModifier : ai.speedModifier;
        ball.modifyYSpeedBy(speedUpValue);
    }
    for (var keyCode in heldDown) {
        player.move(keyCode);
    }
    var aiMiddle = ai.y + (ai.height / 2);
    if (aiMiddle < ball.y) {
        ai.move(40);
    }
    if (aiMiddle > ball.y) {
        ai.move(38);
    }
    
}

function draw() {
    ctx.fillStyle = "black";
    ctx.fillRect(0,480);
    renderPaddle(player);
    renderPaddle(ai);
    renderBall(ball);
if (playerscore === 5)
{
alert('you won! the score was 5 to ' + aiscore);
 ctx.clearRect(0,480); 
 canvas.style.display = 'none';
return;
}
if (aiscore === 5)
{
alert('you lost.. the score was ' + playerscore + ' to 5.'  );
 ctx.clearRect(0,480); 
 canvas.style.display = 'none';
return;
}

function renderPaddle(paddle) {
    ctx.fillStyle = "blue";
    ctx.fillRect(paddle.x,paddle.height);
}

function renderBall(ball) {
    ctx.beginPath();
    ctx.arc(ball.x,false);
    ctx.fillStyle = "pink";
    ctx.fill();
}
var heldDown = {};
window.addEventListener("keydown",function(keyInfo) {
    heldDown[event.keyCode] = true;
},false);
window.addEventListener("keyup",function(keyInfo) {
    delete heldDown[event.keyCode];
},false);
tick();
</script>

解决方法

该错误似乎出在您的reset函数中-您已继续执行新行而未连接其余行;

reset: function() {
        alert('The score is now '
        playerscore + ' to ' + aiscore);
        this.x = 20;
        this.y = 24 30;
        this.xSpeed = 2;
        this.ySpeed = 0;
        
    },

应该是

reset: function() {
        alert('The score is now ' + playerscore + ' to ' + aiscore);
        this.x = 20;
        this.y = 24 30;
        this.xSpeed = 2;
        this.ySpeed = 0;
    },

更新

发布此答案后,我发现了更多问题;

this.y = 24 30;

应为24 30;

this.y = 24;

这些在您的球对象中定义不正确;

varplayerscore = 0 var aiscore = 0

应该是

playerscore: 0,aiscore: 0,

var canvas = document.getElementById("my");
var ctx = canvas.getContext("2d");

function paddle(x,y,width,height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
    this.speedModifier = 0;
    this.hasCollidedWith = function(ball) {
        var paddleLeftWall = this.x;
        var paddleRightWall = this.x + this.width;
        var paddleTopWall = this.y;
        var paddleBottomWall = this.y + this.height;
        if (ball.x > paddleLeftWall &&
            ball.x < paddleRightWall &&
            ball.y > paddleTopWall &&
            ball.y < paddleBottomWall) {
            return true;
        }
        return false;
    };
    this.move = function(keyCode) {
        var nextY = this.y;
        if (keyCode == 40) {
            nextY += 5;
            this.speedModifer = 1.5;
        } else if (keyCode == 38) {
            nextY += -5;
            this.speedModifier = 1.5;
        } else {
            this.speedModifier = 0;
        }
        nextY = nextY < 0 ? 0 : nextY;
        nextY = nextY + this.height > 480 ? 480 - this.height : nextY;
        this.y = nextY;
    };
}
var player = new paddle(5,200,25,100);
var ai = new paddle(610,100);
var ball = {
    x: 320,y: 240,radius: 7,xSpeed: 2,ySpeed: 0,playerscore: 0,reverseX: function() {
        this.xSpeed *= -1;
    },reverseY: function() {
        this.ySpeed *= -1;
    },reset: function() {
        alert('The score is now ' + this.playerscore + ' to ' + this.aiscore);
        this.x = 20;
        this.y = 24;
        this.xSpeed = 2;
        this.ySpeed = 0;
        
    },isBouncing: function() {
        return ball.ySpeed != 0;
    },modifyXSpeedBy: function(modification) {
        modification = this.xSpeed < 0 ? modification * -1 : modification;
        var nextValue = this.xSpeed + modification;
        nextValue = Math.abs(nextValue) > 9 ? 9 : nextValue;
        this.xSpeed = nextValue;
    },modifyYSpeedBy: function(modification) {
        modification = this.ySpeed < 0 ? modification * -1 : modification;
        this.ySpeed += modification;
    }
};

function tick() {
    updateGame();
    draw()
    window.setTimeout("tick()",1000 / 60);
}

function updateGame() {
    ball.x += ball.xSpeed;
    ball.y += ball.ySpeed;
    if (ball.x < 0) {
        ball.reset();
        ball.aiscore = ball.aiscore + 1;
        
    }
    if (ball.x > 640) {
        ball.reset();
        ball.playerscore = ball.playerscore + 1
        
    }
    if (ball.y <= 0 || ball.y >= 480) {
        ball.reverseY();
    }
    var collidedWithPlayer = player.hasCollidedWith(ball);
    var collidedWithAi = ai.hasCollidedWith(ball);
    if (collidedWithPlayer || collidedWithAi) {
        ball.reverseX();
        ball.modifyXSpeedBy(0.25);
        var speedUpValue = collidedWithPlayer ? player.speedModifier : ai.speedModifier;
        ball.modifyYSpeedBy(speedUpValue);
    }
    for (var keyCode in heldDown) {
        player.move(keyCode);
    }
    var aiMiddle = ai.y + (ai.height / 2);
    if (aiMiddle < ball.y) {
        ai.move(40);
    }
    if (aiMiddle > ball.y) {
        ai.move(38);
    }
    
}

function draw() {
    ctx.fillStyle = "black";
    ctx.fillRect(0,640,480);
    renderPaddle(player);
    renderPaddle(ai);
    renderBall(ball);
}

function renderPaddle(paddle) {
    ctx.fillStyle = "blue";
    ctx.fillRect(paddle.x,paddle.y,paddle.width,paddle.height);
}

function renderBall(ball) {
    ctx.beginPath();
    ctx.arc(ball.x,ball.y,ball.radius,2 * Math.PI,false);
    ctx.fillStyle = "pink";
    ctx.fill();
}
var heldDown = {};
window.addEventListener("keydown",function(keyInfo) {
    heldDown[event.keyCode] = true;
},false);
window.addEventListener("keyup",function(keyInfo) {
    delete heldDown[event.keyCode];
},false);
tick();
<canvas id='my' width='640' height='480'></canvas>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res