Javascript 返回的输入未定义且不适用于x&;画布上的y位置
我正在开发一个程序,它可以让一个球在画布上以用户通过两个输入(x速度和y速度)确定的速度反弹。它返回未定义的用户值,即使我正在将字符串转换为一个整数以用于balls位置。在过去的几天里,我一直在努力解决这个问题,我相信它确实很容易修复。任何帮助都将不胜感激Javascript 返回的输入未定义且不适用于x&;画布上的y位置,javascript,html,html5-canvas,Javascript,Html,Html5 Canvas,我正在开发一个程序,它可以让一个球在画布上以用户通过两个输入(x速度和y速度)确定的速度反弹。它返回未定义的用户值,即使我正在将字符串转换为一个整数以用于balls位置。在过去的几天里,我一直在努力解决这个问题,我相信它确实很容易修复。任何帮助都将不胜感激 <script type="text/javascript"> window.onload= function() { document.getElementById("c
<script type="text/javascript">
window.onload= function()
{
document.getElementById("changeButton").onclick = draw;
}
function draw(){
//alert("Hey you made it!" + "\n" + "dx: " + dx + "\n" + "dy: " + dy); //alert which returns dx and dy for following stack commented out when not in use otherwise alert happens every 10 ms
//variables
var hVel = parseInt(document.getElementById("hVelocityBox").value, 10); //gets value for x movement and converts from string to int
var vVel = parseInt(document.getElementById("vVelocityBox").value, 10); //gets value for y movement and converts from string to int
var dx= hVel;
var dy= vVel;
var y=150; //default x position
var x=150; //default y posiiton
var context = myCanvas.getContext('2d');
//refreshes the canvas
context.clearRect(0,0,300,300);
//draws circle
context.beginPath();
context.fillStyle="#0000ff";
context.arc(x,y,20,0,Math.PI*2,true);
context.closePath();
context.fill();
//code for movement
if( x<0 || x>300) //position limiter in x
dx=-dx; //reverses x movement
if( y<0 || y>300) //position limiter in y
dy=-dy; //reverses y movement
x+=dx; //
y+=dy;
}//close draw
setInterval(draw,10); //runs draw every 10 ms
</script>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HTML5 Bouncing Ball</title>
</head>
<body>
<h1>Bouncing a Ball Around with HTML5 and JavaScript</h1>
<div id="container">
<canvas id="myCanvas" width="300" height="300" style="border: 1px solid black"></canvas><br/>
<!--Textfields for x and y velocities, values defaulted to 4 -->
Horizontal Velocity <input id="hVelocityBox" type="text" value="4"/><br />
Vertical Velocity <input id="vVelocityBox" type="text" value="4"/><br />
<button id="changeButton">Change</button>
</div>
</body>
</html>
window.onload=function()
{
document.getElementById(“changeButton”).onclick=draw;
}
函数绘图(){
//警报(“嘿,你成功了!”+“\n”+“dx:”+dx+“\n”+“dy:”+dy);//警报在不使用时返回注释掉的以下堆栈的dx和dy,否则警报每10毫秒发生一次
//变数
var hVel=parseInt(document.getElementById(“hVelocityBox”).value,10);//获取x移动的值,并从字符串转换为int
var vVel=parseInt(document.getElementById(“vVelocityBox”).value,10);//获取y移动的值,并从字符串转换为int
var dx=hVel;
var-dy=vVel;
变量y=150;//默认的x位置
var x=150;//默认y位置
var context=myCanvas.getContext('2d');
//刷新画布
clearRect(0,0300);
//画圈
context.beginPath();
context.fillStyle=“#0000ff”;
弧(x,y,20,0,Math.PI*2,true);
closePath();
context.fill();
//运动代码
if(x300)//x中的位置限制器
dx=-dx;//反转x移动
if(y300)//y方向的位置限制器
dy=-dy;//反转y移动
x+=dx//
y+=dy;
}//平局
设置间隔(抽签,10)//每10毫秒运行一次
HTML5弹跳球
用HTML5和JavaScript玩球
水平速度
垂直速度
改变
这里有一些问题。每次函数运行时,基本上都会重新设置位置和速度。我将它们的声明和初始化移出了draw函数。我还添加了一个更新函数来绑定到按钮。这允许您在不干扰绘图功能的情况下进行更新。你可能想考虑一个更有保证的方法来保持球在盒子里面(我在一些评论中包括)。< /P>
这里有一个可以正常工作的小提琴:
document.getElementById(“changeButton”).onclick=update;
变量y=150//默认x位置
var x=150//默认y位置
var dx=parseInt(document.getElementById(“hVelocityBox”).value,10)//获取x移动的值,并将其从字符串转换为int
var dy=parseInt(document.getElementById(“vVelocityBox”).value,10)//获取y移动的值,并将其从字符串转换为int
函数更新(){
x=150;
y=150;
dx=parseInt(document.getElementById(“hVelocityBox”).value,10);//获取x移动的值,并将其从字符串转换为int
dy=parseInt(document.getElementById(“vVelocityBox”).value,10);//获取y移动的值,并将其从字符串转换为int
}
函数绘图(){
var context=myCanvas.getContext('2d');
//刷新画布
clearRect(0,0300);
//画圈
context.beginPath();
context.fillStyle=“#0000ff”;
弧(x,y,20,0,Math.PI*2,true);
closePath();
context.fill();
//运动代码
if(x300)//x中的位置限制器
{
//这些可能有助于防止意外逃逸
//如果(x300)x=300;
dx=-dx;//反转x移动
}
if(y300)//y方向的位置限制器
{
//这些可能有助于防止意外逃逸
//如果(y300)y=300;
dy=-dy;//反转y移动
}
x+=dx;
y+=dy;
};//平局
设置间隔(抽签,10)//每10毫秒运行一次
+1好的解决方案。你可能想用if(x280)
和if(y280)
调整球的半径,这样球就不会从墙上弹起。多亏了你的帮助,我终于让它工作了!我最终遇到的主要问题是没有真正意识到没有等到html完全加载后才运行Js。使用window.onload=function()似乎不起作用,因此我的解决方案是在JS之前编写HTML。这是一个不错的修复还是一个amature修复?您可以挂接画布本身的onload事件,或者拉入jQuery并使用其document.ready。此外,如果您查看pagespeed推荐之类的内容,非必要的JS无论如何都应该位于折叠内容下方。
document.getElementById("changeButton").onclick = update;
var y=150; //default x position
var x=150; //default y posiiton
var dx = parseInt(document.getElementById("hVelocityBox").value, 10); //gets value for x movement and converts from string to int
var dy = parseInt(document.getElementById("vVelocityBox").value, 10); //gets value for y movement and converts from string to int
function update(){
x = 150;
y = 150;
dx = parseInt(document.getElementById("hVelocityBox").value, 10); //gets value for x movement and converts from string to int
dy = parseInt(document.getElementById("vVelocityBox").value, 10); //gets value for y movement and converts from string to int
}
function draw(){
var context = myCanvas.getContext('2d');
//refreshes the canvas
context.clearRect(0,0,300,300);
//draws circle
context.beginPath();
context.fillStyle="#0000ff";
context.arc(x,y,20,0,Math.PI*2,true);
context.closePath();
context.fill();
//code for movement
if( x<0 || x>300) //position limiter in x
{
//these may help prevent accidental escapes
//if (x<0) x = 0;
//if (x>300) x = 300;
dx=-dx; //reverses x movement
}
if( y<0 || y>300) //position limiter in y
{
//these may help prevent accidental escapes
//if (y<0) y = 0;
//if (y>300) y = 300;
dy=-dy; //reverses y movement
}
x+=dx;
y+=dy;
};//close draw
setInterval(draw,10); //runs draw every 10 ms