2017-11-15 9 views
1

w3schools에는 기본적인 게임이 있으며 조각이나 개체를 원으로 만드는 방법을 알 수 없습니다. 나는 너무 혼란스럽고 모든 것을 시도했지만 효과가 없었다. 어떻게하면 채우기 원 또는 다른 방법을 사용할 수 있습니까? 나는 캔버스를 처음 사용합니다.HTML과 JavaScript가있는 캔버스

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
<style> 
canvas { 
    border:1px solid #d3d3d3; 
    background-color: #f1f1f1; 
} 
</style> 
</head> 
<body onload="startGame()"> 
<script> 

var myGamePiece; 
var myObstacles = []; 
var myScore; 

function startGame() { 
    myGamePiece = new component(30, 30, "red", 10, 120); 
    myGamePiece.gravity = 0.05; 
    myScore = new component("30px", "Consolas", "black", 280, 40, 
    "text"); 
    myGameArea.start(); 
} 

var myGameArea = { 
    canvas : document.createElement("canvas"), 
    start : function() { 
     this.canvas.width = 480; 
     this.canvas.height = 270; 
     this.context = this.canvas.getContext("2d"); 
     document.body.insertBefore(this.canvas, 
     document.body.childNodes[0]); 
     this.frameNo = 0; 
     this.interval = setInterval(updateGameArea, 20); 
     }, 
    clear : function() { 
     this.context.clearRect(0, 0, this.canvas.width, 
    this.canvas.height); 
    } 
} 

function component(width, height, color, x, y, type) { 
    this.type = type; 
    this.score = 0; 
    this.width = width; 
    this.height = height; 
    this.speedX = 0; 
    this.speedY = 0;  
    this.x = x; 
    this.y = y; 
    this.gravity = 0; 
    this.gravitySpeed = 0; 
    this.update = function() { 
     ctx = myGameArea.context; 
     if (this.type == "text") { 
      ctx.font = this.width + " " + this.height; 
      ctx.fillStyle = color; 
      ctx.fillText(this.text, this.x, this.y); 
     } else { 
      ctx.fillStyle = color; 
      ctx.fillRect(this.x, this.y, this.width, this.height); 
     } 
    } 
    this.newPos = function() { 
     this.gravitySpeed += this.gravity; 
     this.x += this.speedX; 
     this.y += this.speedY + this.gravitySpeed; 
     this.hitBottom(); 
    } 
    this.hitBottom = function() { 
     var rockbottom = myGameArea.canvas.height - this.height; 
     if (this.y > rockbottom) { 
      this.y = rockbottom; 
      this.gravitySpeed = 0; 
     } 
    } 
    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, height, gap, minHeight, maxHeight, minGap, maxGap; 
    for (i = 0; i < myObstacles.length; i += 1) { 
     if (myGamePiece.crashWith(myObstacles[i])) { 
      return; 
     } 
    } 
    myGameArea.clear(); 
    myGameArea.frameNo += 1; 
    if (myGameArea.frameNo == 1 || everyinterval(150)) { 
     x = myGameArea.canvas.width; 
     minHeight = 20; 
     maxHeight = 200; 
     height = Math.floor(Math.random()*(maxHeight- 
     minHeight+1)+minHeight); 
     minGap = 50; 
     maxGap = 200; 
     gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap); 
     myObstacles.push(new component(10, height, "green", x, 0)); 
     myObstacles.push(new component(10, x - height - gap, "green", x, 
height + gap)); 
    } 
    for (i = 0; i < myObstacles.length; i += 1) { 
     myObstacles[i].x += -1; 
     myObstacles[i].update(); 
    } 
    myScore.text="SCORE: " + myGameArea.frameNo; 
    myScore.update(); 
    myGamePiece.newPos(); 
    myGamePiece.update(); 
} 

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

function accelerate(n) { 
    myGamePiece.gravity = n; 
} 
</script> 
<br> 
<button onmousedown="accelerate(-0.2)" 
onmouseup="accelerate(0.05)">ACCELERATE</button> 
<p>Use the ACCELERATE button to stay in the air</p> 
    <p>How long can you stay alive?</p> 
    </body> 
    </html> 
+0

당신이 당신의 문제를 해결 했습니까? –

답변

0
이 하나에 함수 component()startGame()을 변경

. arc 방법으로 cirlce를 그릴 수 있습니다.

상세 사항 : https://www.w3schools.com/tags/canvas_arc.asp

function startGame() { 
    myGamePiece = new component(30, 30, "red", 10, 120, "player"); 
    myGamePiece.gravity = 0.05; 
    myScore = new component("30px", "Consolas", "black", 280, 40, 
    "text"); 
    myGameArea.start(); 
} 


function component(width, height, color, x, y, type) { 
    this.type = type; 
    this.score = 0; 
    this.width = width; 
    this.height = height; 
    this.speedX = 0; 
    this.speedY = 0;  
    this.x = x; 
    this.y = y; 
    this.gravity = 0; 
    this.gravitySpeed = 0; 
    this.update = function() { 
     ctx = myGameArea.context; 
     ctx.fillStyle = color; 
     if (this.type == "text") { // text 
      ctx.font = this.width + " " + this.height; 
      ctx.fillStyle = color; 
      ctx.fillText(this.text, this.x, this.y); 
     } else if (this.type == "player") { // player 
      ctx.beginPath(); 
      ctx.arc(this.x, this.y, 35,0,2*Math.PI); 
      ctx.fill(); 
      ctx.stroke(); 
     } else { // wall 
      ctx.fillStyle = color; 
      ctx.fillRect(this.x, this.y, this.width, this.height); 
     } 
    } 
    this.newPos = function() { 
     this.gravitySpeed += this.gravity; 
     this.x += this.speedX; 
     this.y += this.speedY + this.gravitySpeed; 
     this.hitBottom(); 
    } 
    this.hitBottom = function() { 
     var rockbottom = myGameArea.canvas.height - this.height; 
     if (this.y > rockbottom) { 
      this.y = rockbottom; 
      this.gravitySpeed = 0; 
     } 
    } 
    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; 
    } 
}