2017-06-29 8 views
0

これはJSキャンバスゲームの開始コードです。 私はimgの背景を追加したいと考えています。どこから始めるのが最適ですか?キャンバス要素の背景を追加する場合

var results = [ 
    {name: "Satisfied", count: 1043, url: "lightblue"}, 
    {name: "Neutral", count: 563, color: "lightgreen"}, 
    {name: "Unsatisfied", count: 510, color: "pink"}, 
    {name: "No comment", count: 175, color: "silver"} 
]; 

function flipHorizontally(context, around) { 
    context.translate(around, 0); 
    context.scale(-1, 1); 
    context.translate(-around, 0); 
} 

function CanvasDisplay(parent, level) { 
    this.canvas = document.createElement("canvas"); 
    this.canvas.width = Math.min(600, level.width * scale); 
    this.canvas.height = Math.min(450, level.height * scale); 
    parent.appendChild(this.canvas); 
    this.cx = this.canvas.getContext("2d"); 

    this.level = level; 
    this.animationTime = 0; 
    this.flipPlayer = false; 

    this.viewport = { 
    left: 0, 
    top: 0, 
    width: this.canvas.width/scale, 
    height: this.canvas.height/scale 
    }; 

    this.drawFrame(0); 
} 

CanvasDisplay.prototype.clear = function() { 
    this.canvas.parentNode.removeChild(this.canvas); 
}; 

CanvasDisplay.prototype.drawFrame = function(step) { 
    this.animationTime += step; 

    this.updateViewport(); 
    this.clearDisplay(); 
    this.drawBackground(); 
    this.drawActors(); 
}; 

CanvasDisplay.prototype.updateViewport = function() { 
    var view = this.viewport, margin = view.width/3; 
    var player = this.level.player; 
    var center = player.pos.plus(player.size.times(0.5)); 

    if (center.x < view.left + margin) 
    view.left = Math.max(center.x - margin, 0); 
    else if (center.x > view.left + view.width - margin) 
    view.left = Math.min(center.x + margin - view.width, 
         this.level.width - view.width); 
    if (center.y < view.top + margin) 
    view.top = Math.max(center.y - margin, 0); 
    else if (center.y > view.top + view.height - margin) 
    view.top = Math.min(center.y + margin - view.height, 
         this.level.height - view.height); 
}; 

CanvasDisplay.prototype.clearDisplay = function() { 


    if (this.level.status == "won") 
    this.cx.fillStyle = "rgb(68, 191, 255)"; 
    else if (this.level.status == "lost") 
    this.cx.fillStyle = "rgb(44, 136, 214)"; 
    else 
    this.cx.fillStyle = "rgb(68, 191, 255)"; 
    this.cx.fillRect(0, 0, 
        this.canvas.width, this.canvas.height); 
}; 

var otherSprites = document.createElement("img"); 
otherSprites.src = "img/sprites 2.png"; 

CanvasDisplay.prototype.drawBackground = function() { 
    var view = this.viewport; 
    var xStart = Math.floor(view.left); 
    var xEnd = Math.ceil(view.left + view.width); 
    var yStart = Math.floor(view.top); 
    var yEnd = Math.ceil(view.top + view.height); 

    for (var y = yStart; y < yEnd; y++) { 
    for (var x = xStart; x < xEnd; x++) { 
     var tile = this.level.grid[y][x]; 
     if (tile == null) continue; 
     var screenX = (x - view.left) * scale; 
     var screenY = (y - view.top) * scale; 
     var tileX = tile == "lava" ? scale : 0; 
     this.cx.drawImage(otherSprites, 
         tileX,   0, scale, scale, 
         screenX, screenY, scale, scale); 
    } 
    } 
}; 

var playerSprites = document.createElement("img"); 
playerSprites.src = "img/player 2.png"; 
var playerXOverlap = 4; 

CanvasDisplay.prototype.drawPlayer = function(x, y, width, 
               height) { 
    var sprite = 8, player = this.level.player; 
    width += playerXOverlap * 2; 
    x -= playerXOverlap; 
    if (player.speed.x != 0) 
    this.flipPlayer = player.speed.x < 0; 

    if (player.speed.y != 0) 
    sprite = 9; 
    else if (player.speed.x != 0) 
    sprite = Math.floor(this.animationTime * 12) % 8; 

    this.cx.save(); 
    if (this.flipPlayer) 
    flipHorizontally(this.cx, x + width/2); 

    this.cx.drawImage(playerSprites, 
        sprite * width, 0, width, height, 
        x,    y, width, height); 

    this.cx.restore(); 
}; 

CanvasDisplay.prototype.drawActors = function() { 
    this.level.actors.forEach(function(actor) { 
    var width = actor.size.x * scale; 
    var height = actor.size.y * scale; 
    var x = (actor.pos.x - this.viewport.left) * scale; 
    var y = (actor.pos.y - this.viewport.top) * scale; 
    if (actor.type == "player") { 
     this.drawPlayer(x, y, width, height); 
    } else { 
     var tileX = (actor.type == "coin" ? 2 : 1) * scale; 
     this.cx.drawImage(otherSprites, 
         tileX, 0, width, height, 
         x,  y, width, height); 
    } 
    }, this); 
}; 

私はcanvasDisplay.clearDispla yの関数が最善の策だろう考えていました。

CanvasDisplay.prototype.clearDisplay = function() { 


    if (this.level.status == "won") 
    this.cx.fillStyle = "rgb(68, 191, 255)"; 
    else if (this.level.status == "lost") 
    this.cx.fillStyle = "rgb(44, 136, 214)"; 
    else 
    this.cx.fillStyle = "rgb(68, 191, 255)"; 
    this.cx.fillRect(0, 0, 
        this.canvas.width, this.canvas.height); 
}; 

ありがとうございます。ご協力いただけると助かります。

+0

これは初心者学習の複雑な例です。 Book Eloquent JavaScriptで見つけました。 https://www.w3schools.com/html/html5_canvas.aspをご覧ください。ゼロ点からすべてを作成すると、すべてのバグに対する解決法が簡単に見つかります。ちょうどステップバイステップの方法を使用して... –

+0

残念ながら、これはプロジェクトのためですが、私はそれが非常に簡単に地面から始めることに同意する一方、私はそれが短くないことを恐れています。 –

+0

あなたの質問にコードスニペットを作成することをお勧めします。すると、非常に短時間で回答が得られます。また、この例についてコミュニティにもっと話してください。最も良い方法は、既に存在する類似のデモゲームなどとのいくつかのリンクを与えることです... –

答えて

0

動的な背景や静的な背景を探しているかどうかは、キャンバスの背景にCSSを使用してCSSの位置を移動して移動することをお勧めします。

関連する問題