2017-04-20 1 views
0

Javascriptが、CanvasRenderingContext2D.drawImageは、だから私はキャンバスにグリッドとして、いくつかの画像をレンダリングしようとしてきた

function IMGLoader() 
 
{ 
 
\t this.imageBuffer = []; 
 
} 
 
IMGLoader.prototype.load = function(src) 
 
{ 
 
\t var temp = new Image(); 
 
\t temp.src = src; 
 
\t this.imageBuffer.push(temp); 
 
\t 
 
}

画像データを認識できません。コードのデバッグを開始したとき、私は1つのエラーを除くすべてを取り除くことができました。その結果、いくつかのアプローチを書き直して試してみる必要がありました。私は非常にjavascriptに新しいですし、jqueryについて多くのことを知らない。

問題は、ロードした画像がキャンバスにレンダリングされないということです。 drawImageを呼び出す前に、それらがロードされていることを確認しようとしました。私はまた、 "spr" instanceof Image、それが時々あるかどうかを調べました。

私はこの問題を解決しようとしていますが、私は他の質問を読もうとしました。同じエラー引数。しかしそれはあまり役に立たなかった。

私の間違いを見つけられる場合は、どうかしてください。

// Object calling function... 
 
function GameObject(x, y, w, h) 
 
{ 
 
\t this.x = x; 
 
\t this.y = y; 
 
\t this.w = w; 
 
\t this.h = h; 
 
\t this.img = null; 
 
} 
 
GameObject.prototype.draw = function(ctx) 
 
{ 
 
\t //alert("Attempt draw..."); 
 
\t //alert(this.img instanceof Image); 
 
\t //var context = document.getElementById("mainCanvas").getContext("2d"); 
 
\t this.img.onload = function(){ 
 

 
\t \t ctx.drawImage(this.img, this.x, this.y, this.w, this.h); 
 
\t }; 
 
\t this.img.onerror = function() { 
 
\t \t alert("Image is not loaded!"); 
 
\t }; 
 
} 
 
GameObject.prototype.loadIMG = function(spr) 
 
{ 
 
\t 
 
\t this.img = spr; 
 
\t //alert(this.img instanceof Image); 
 
} 
 

 

 
//child class that inherits 
 
//#################################################### 
 
Player.prototype = Object.create(GameObject.prototype); 
 
Player.prototype.constructor = Player; 
 
function Player (x, y, w, h) 
 
{ 
 
\t 
 

 
\t GameObject.call(this,[x, y, w, h]); 
 
\t this.moveQueue = []; 
 
} 
 
Player.prototype.update = function() 
 
{ 
 
\t if (this.moveQueue.length > 0) 
 
\t { 
 
\t \t var move = moveQueue.pop(); 
 
\t \t this.x = move[0]; 
 
\t \t this.y = move[1]; 
 
\t } 
 
} 
 

 

 
// Primary controller code 
 
//############################## 
 
function Game() 
 
{ \t 
 
\t this.cvs = null; 
 
\t this.ctx = null; \t 
 
\t this.eventhandler = null; 
 
\t this.tileMap = null; 
 
\t this.imgLoader = null; 
 
\t this.gameObjects = []; \t 
 
} 
 

 
Game.prototype.setup = function() 
 
{ 
 
\t // Loading graphics window and renderer 
 
\t this.cvs = document.getElementById("mainCanvas"); 
 
\t //this.cvs.width = document.body.clientWidth; 
 
\t //this.cvs.height = document.body.clientHeight; 
 
\t this.ctx = this.cvs.getContext("2d"); 
 
\t 
 
\t this.eventhandler = new EventHandler(); 
 
\t this.tileMap = new TileMap(); 
 
\t this.imgLoader = new IMGLoader(); 
 
\t 
 
\t this.eventhandler.setup(this.cvs); 
 
\t 
 
\t 
 
\t this.imgLoader.load("./assets/floortile001.png"); 
 
\t this.imgLoader.load("./assets/player.png"); 
 
\t 
 
\t var floorTiles = [this.imgLoader.imageBuffer[0]]; 
 
\t this.tileMap.setup(2, 2, 128, floorTiles); 
 
\t 
 
\t 
 
\t var playerSprite = this.imgLoader.imageBuffer[1]; 
 
\t 
 
\t this.gameObjects.push(new Player(128, 128, 96, 96)); 
 
\t this.gameObjects[0].loadIMG(playerSprite); 
 

 
} 
 
Game.prototype.handleEvents = function() 
 
{ 
 
\t if (this.eventhandler.hasClickedLeft) 
 
\t { 
 
\t \t var start = [this.player.x, this.player.y]; 
 
\t \t var end = this.tileMap.boundCoordinates(this.eventhandler.x, this.eventhandler.y); 
 
\t \t this.player.moveQueue = algorithms.pathfinding(start, end, this.tileMap); 
 
\t } 
 
} 
 
Game.prototype.update = function() 
 
{ 
 
\t for (var i = 0; i < this.gameObjects.length; i++) 
 
\t \t this.gameObjects[i].update(); 
 
} 
 
Game.prototype.render = function() 
 
{ 
 
\t this.ctx.clearRect(0, 0, this.cvs.width, this.cvs.height); 
 
\t this.ctx.fillStyle = "#000000"; 
 
\t this.ctx.fillRect(0, 0, this.cvs.width, this.cvs.height); 
 
\t this.tileMap.draw(this.ctx); 
 
\t for (var i = 0; i < this.gameObjects.length; i++) 
 
\t \t this.gameObjects[i].draw(this.ctx); 
 
} 
 
Game.prototype.run = function() 
 
{ 
 
\t var self = this; 
 
\t setInterval(function() 
 
\t { 
 
\t \t self.handleEvents(); 
 
\t \t self.update(); 
 
\t \t self.render(); 
 
\t }, 1000/30); 
 
}
<!DOCTYPE html> 
 
<meta charset="UTF-8"> 
 
<html> 
 
<head> 
 
\t <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 
 
\t 
 
\t <script type="text/javascript" src="js/priorityqueue.js"></script> 
 
\t <script type="text/javascript" src="js/algorithms.js"></script> 
 
\t <script type="text/javascript" src="js/gameobject.js"></script> 
 
\t <script type="text/javascript" src="js/tile.js"></script> 
 
\t <script type="text/javascript" src="js/tilemap.js"></script> 
 
\t <script type="text/javascript" src="js/player.js"></script> 
 
\t <script type="text/javascript" src="js/imgloader.js"></script> 
 
\t <script type="text/javascript" src="js/core.js"></script> 
 
\t <script type="text/javascript" src="js/eventhandler.js"></script> 
 
</head> 
 

 
<body> 
 
\t <canvas id="mainCanvas" width="800px" height="800px"></canvas> 
 
</body> 
 
</html> 
 
<script type="text/javascript"> 
 
$(document).ready(function() { 
 
\t var game = new Game(); 
 
\t game.setup(); 
 
\t game.run(); 
 
}); 
 
</script>

+0

を、イメージ "onload"ハンドラの中の 'this'の値は' GameObject'インスタンスではありません。 – Pointy

答えて

1

あなたの問題は、これらの行にコールバック内部

this.img.onload = function(){ 
    ctx.drawImage(this.img, this.x, this.y, this.w, this.h); 
}; 

thisは外と同じthisを参照していないことを、おそらくです。

一つの可能​​な解決策は、コンテキストを維持され、矢印の機能を使用することです:

this.img.onload =() => { 
    ctx.drawImage(this.img, this.x, this.y, this.w, this.h); 
}; 

別のオプションは、コンテキスト保存するために別の変数を持っているだろう。一つには

var self = this; 
this.img.onload = function(){ 
    ctx.drawImage(self.img, self.x, self.y, self.w, self.h); 
}; 
+0

私よりもずっと優れています! –

関連する問題