Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在推送的画布对象上使用drawimage()时出现错误消息,预加载()没有帮助_Javascript_Html_Canvas_Drawimage - Fatal编程技术网

Javascript 在推送的画布对象上使用drawimage()时出现错误消息,预加载()没有帮助

Javascript 在推送的画布对象上使用drawimage()时出现错误消息,预加载()没有帮助,javascript,html,canvas,drawimage,Javascript,Html,Canvas,Drawimage,在html画布游戏中尝试在障碍物上绘制图像时,我收到以下错误消息:Uncaught InvalidStateError:未能在“CanvasRenderingContext2D”上执行“drawimage”:提供的HTMLImageElement处于“断开”状态 障碍物是看不见的,但如果玩家与该障碍物相撞,游戏仍会停止。游戏中其他静止障碍物的图像可见。我该怎么办 我尝试将图像作为preload()函数上传到我的html中,但仍然不起作用。关于类似情况的其他文章并没有涵盖相同的上下文,也不能帮助我

在html画布游戏中尝试在障碍物上绘制图像时,我收到以下错误消息:Uncaught InvalidStateError:未能在“CanvasRenderingContext2D”上执行“drawimage”:提供的HTMLImageElement处于“断开”状态

障碍物是看不见的,但如果玩家与该障碍物相撞,游戏仍会停止。游戏中其他静止障碍物的图像可见。我该怎么办

我尝试将图像作为preload()函数上传到我的html中,但仍然不起作用。关于类似情况的其他文章并没有涵盖相同的上下文,也不能帮助我这个编程新手

代码如下:

<!DOCTYPE html>
<html>
<head>

<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" type="text/css" href="stylesheet.css"> <link/>

<script> 

function preloader() 

{

 // counter
 var i = 0;

 // create object
 imageObj = new Image();

 // set image list
 images = new Array();
 images[0]="player.jpg"
 images[1]="player2.jpg"
 images[2]="obstacle.jpg"
 images[3]="obstacle2.jpg"
 images[3]="obstacle3.jpg"

 // start preloading
 for(i=0; i<=3; i++) 
 {
      imageObj.src=images[i];
 }


 } 

 </script>

</head>
<body onload="startGame(), preloader()">

<h2> My Lost Game </h2>

<p>Press the 'up', 'down', 'left' and 'right' keys on your keyboard to move. Avoid the obstacles and reach the goal.</p><br>

<p></p>

<script>

var myObstacle = [];


function startGame() {
myGameArea.start();
myGameGoal = new component(75, 95, "player2.jpg", 710, 215, "image");
myGamePiece = new component(75, 95, "player.jpg", 10, 215, "image");

myObstacle2 = new component (110, 150, "obstacle2.jpg", 350, 0, "image");
myObstacle3 = new component (110, 150, "obstacle3.jpg", 530, 350, "image");

}

var myGameArea = {
canvas : document.createElement("canvas"),
start : function() {
this.canvas.width = 800;
this.canvas.height = 500;
this.context = this.canvas.getContext("2d");
document.body.insertBefore(this.canvas, document.body.childNodes[4]);
this.frameNo = 0;
this.interval = setInterval(updateGameArea, 20);
window.addEventListener('keydown', function (e) {
    myGameArea.keys = (myGameArea.keys || []);
    myGameArea.keys[e.keyCode] = true;
})
window.addEventListener('keyup', function (e) {
    myGameArea.keys[e.keyCode] = false; 
})

},
clear : function() {
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);},

stop : function() {
clearInterval(this.interval);
}
}

function component(width, height, color, x, y, type) {
this.type = type;
if (type == "image") {
this.image = new Image();
this.image.src = color;
}
this.width = width;
this.height = height;
this.x = x;
this.y = y;    

this.update = function() {
ctx = myGameArea.context;
if (type == "image") {
    ctx.drawImage(this.image, 
        this.x, 
        this.y,
        this.width, this.height);
} else {
    ctx.fillStyle = color;
    ctx.fillRect(this.x, this.y, this.width, this.height);
}
}
this.newPos = function() {
this.x += this.speedX;
this.y += this.speedY;        
}
this.crashWith = function(otherobj) {
var myleft = this.x;
var myright = this.x + (this.width);
var mytop = this.y;
var mybottom = this.y + (this.height);
var otherleft = otherobj.x;
var otherright = otherobj.x + (otherobj.width);
var othertop = otherobj.y;
var otherbottom = otherobj.y + (otherobj.height);
var crash = true;
if ((mybottom < othertop) ||
       (mytop > otherbottom) ||
       (myright < otherleft) ||
       (myleft > otherright)) {
   crash = false;
}
return crash;
}
}

function updateGameArea() {
var x, y;
for (i = 0; i < myObstacle.length; i += 1) {
if (myGamePiece.crashWith(myObstacle[i])) {
    myGameArea.stop();
    return;
} 
}
myGameArea.clear();
myGameArea.frameNo += 1;
if (myGameArea.frameNo == 1 || everyinterval(150)) {
x = 200;
y = 300;
myObstacle.push(new component(110, 150, "obstacle1.jpg", x, y, "image"));
}
for (i = 0; i < myObstacle.length; i += 1) {
myObstacle[i].y += -1;
myObstacle[i].update();
}




myGameArea.clear();
myGamePiece.speedX = 0;
myGamePiece.speedY = 0;
if (myGameArea.keys && myGameArea.keys[37]) {myGamePiece.speedX = -3; }
if (myGameArea.keys && myGameArea.keys[39]) {myGamePiece.speedX = 3; }
if (myGameArea.keys && myGameArea.keys[38]) {myGamePiece.speedY = -3; }
if (myGameArea.keys && myGameArea.keys[40]) {myGamePiece.speedY = 3; }


myObstacle2.update();
myObstacle3.update();
myGameGoal.update();
myGamePiece.newPos();
myGamePiece.update();
}

function everyinterval(n) {
if ((myGameArea.frameNo / n) % 1 == 0) {return true;}
return false;
}

</script>



</body>
</html>

函数预加载程序()
{
//柜台
var i=0;
//创建对象
imageObj=新图像();
//设置图像列表
images=新数组();
图像[0]=“player.jpg”
图片[1]=“player2.jpg”
图片[2]=“barrier.jpg”
图像[3]=“obstacle2.jpg”
图像[3]=“obstacle3.jpg”
//开始预加载
对于(i=0;i其他底部)||
(右<左)||
(myleft>otherright)){
崩溃=错误;
}
返回碰撞;
}
}
函数updateGameArea(){
变量x,y;
对于(i=0;i
您需要为每个图像创建一个单独的图像对象

下面的代码从图像URL数组中加载图像,并以与URL名称相同的顺序返回图像数组

var loading = 0; // number of images still loading
function preloader(imageURLs){
    // function creates and loads an image
    function createImage(url){
        loading += 1; // count up when loading images
        const image = new Image;
        image.src = url;
        image.onload = () => loading -= 1;  // count down when loaded
        return image; 
    }
    const images = imageURLs.map(createImage);
    return images;
}    
const imageList = preloader(["player.jpg", "player2.jpg", "obstacle3.jpg"]);
// at this point loading greater than zero
加载
为0时,您知道所有图像都已加载

因此,在渲染循环中

function mainLoop(){

    if(loading === 0){ // all images have loaded
        ctx.drawImage(imageList[0],0,0);  // draw first image
        ctx.drawImage(imageList[1],0,0);  // draw second image
        ctx.drawImage(imageList[2],0,0);  // draw third image
    }

    requestAnimationFrame(mainLoop);
}
requestAnimationFrame(mainLoop);
或者,您可以让它在全部加载时调用函数

var loading = 0; // number of images still loading
function preloader(imageURLs, callback){
    // function creates and loads an image
    function createImage(url, callback){
        loading += 1; // count up when loading images
        const image = new Image;
        image.src = url;
        image.onload = () => {
            loading -= 1;  // count down when loaded
            if(loading === 0){ // all done 
               callback();  // call callback
            }
        }
        return image; 
    }
    const images = imageURLs.map(createImage);
    return images;
}    
function start(){  // function to start main loop when images have loaded
    requestAnimationFrame(mainLoop);       
}
// second argument is the callback function that is called when all images have loaded
const imageList = preloader(["player.jpg", "player2.jpg", "obstacle3.jpg"], start);
function mainLoop(){
    ctx.drawImage(imageList[0],0,0);  // draw first image
    ctx.drawImage(imageList[1],0,0);  // draw second image
    ctx.drawImage(imageList[2],0,0);  // draw third image
    requestAnimationFrame(mainLoop);
}

您需要为每个图像创建单独的图像对象

下面的代码从图像URL数组中加载图像,并以与URL名称相同的顺序返回图像数组

var loading = 0; // number of images still loading
function preloader(imageURLs){
    // function creates and loads an image
    function createImage(url){
        loading += 1; // count up when loading images
        const image = new Image;
        image.src = url;
        image.onload = () => loading -= 1;  // count down when loaded
        return image; 
    }
    const images = imageURLs.map(createImage);
    return images;
}    
const imageList = preloader(["player.jpg", "player2.jpg", "obstacle3.jpg"]);
// at this point loading greater than zero
加载
为0时,您知道所有图像都已加载

因此,在渲染循环中

function mainLoop(){

    if(loading === 0){ // all images have loaded
        ctx.drawImage(imageList[0],0,0);  // draw first image
        ctx.drawImage(imageList[1],0,0);  // draw second image
        ctx.drawImage(imageList[2],0,0);  // draw third image
    }

    requestAnimationFrame(mainLoop);
}
requestAnimationFrame(mainLoop);
或者,您可以让它在全部加载时调用函数

var loading = 0; // number of images still loading
function preloader(imageURLs, callback){
    // function creates and loads an image
    function createImage(url, callback){
        loading += 1; // count up when loading images
        const image = new Image;
        image.src = url;
        image.onload = () => {
            loading -= 1;  // count down when loaded
            if(loading === 0){ // all done 
               callback();  // call callback
            }
        }
        return image; 
    }
    const images = imageURLs.map(createImage);
    return images;
}    
function start(){  // function to start main loop when images have loaded
    requestAnimationFrame(mainLoop);       
}
// second argument is the callback function that is called when all images have loaded
const imageList = preloader(["player.jpg", "player2.jpg", "obstacle3.jpg"], start);
function mainLoop(){
    ctx.drawImage(imageList[0],0,0);  // draw first image
    ctx.drawImage(imageList[1],0,0);  // draw second image
    ctx.drawImage(imageList[2],0,0);  // draw third image
    requestAnimationFrame(mainLoop);
}