코딩순서 : 기능구현 -> 코드정리 (리팩토링) // 정리하고 ToDoList
let bricksColor = ["red", "orange", "yellow", "green", "blue", "navy"];
// 벽돌 관련 클래스 변환
class Brick {
constructor(left, top, right, bottom, color, collisionCount) {
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
this.isAlive = true;
this.color = color;
this.collisionCount = collisionCount;
}
draw() {
if(this.collisionCount == 2)
{
context.beginPath();
context.rect(this.left, this.top, brickWidth, brickHeight);
context.fillStyle = bricksColor[this.color%5];
context.fill();
context.closePath();
return true
}
else if(this.collisionCount == 1)
{
context.beginPath();
context.rect(this.left, this.top, brickWidth, brickHeight);
context.fillStyle = "purple";
context.fill();
context.closePath();
return true
}
else
{
return false
}
}
}
class BlackBrick extends Brick{
/* movingAction() { // 자동으로 프로토타입 적용
this.left++;
// console.log('내가 움직이고 있어');
} */
drawBlackBricks() {
context.beginPath();
context.rect(this.left, this.top, brickWidth, brickHeight);
context.fillStyle = "black";
context.fill();
context.closePath();
}
}
let wall = new BlackBrick(
200 - (brickWidth) / 2 , // left
250 - (brickHeight) / 2, // top
200 + (brickWidth) / 2, // right
250 + (brickHeight) / 2, // bottom
'black', // color
1 // collisionCount
);
let wallMoveDirX = -1; // 원이 이동하는 방향 X축
let wallMoveDirY = -1; // 원이 이동하는 방향 Y축
let wallMoveSpd = 3;
const blackBrickWidth = 80;
const blackBrickHight = 25;
let blackBrickPosX = canvas.width / 2 - blackBrickWidth / 2;
// let arcPosX = barPosX + 50;
let blackBrickPosY = canvas.width / 1.5 - blackBrickWidth / 2;
function setBricks()
{
for(let i = 0; i < brickRow; i++) // 위에서아래로 4줄
{
bricks[i] = [];
for(let j = 0; j < brickColumn; j++) // 좌우로 5개씩
{
// TODO : right : left + 50 해보기
// bricks[i][j] = {
// left : 55 + j * (brickWidth + 10),
// /* right:this.left + 50, */
// right : 55 + j * (brickWidth + 10) + 50,
// top : 30 + i * (brickHeight + 5),
// bottom : 30 + i * (brickHeight + 5) + 25,
// column : i,
// row : j,
// collisionCount : 2
bricks[i][j] = new Brick(
55 + j * (brickWidth + 10),
30 + i * (brickHeight + 5),
55 + j * (brickWidth + 10) + 50,
30 + i * (brickHeight + 5) + 25,
i,
2
)
}
}
}
// function getRandomColor() {
// let r = getRand(0, 255),
// g = getRand(0, 255),
// b = getRand(0, 255);
// let rgb = '(' + r + ',' + g + ',' + b + ')';
// return rgb;
// // Return random number from in to max
// function getRand(min, max) {
// if (min >= max) return false;
// return ~~(Math.random() * (max - min + 1)) + min;
// };
// };
// 랜덤색상값 생성
// 브릭갯수 줄에 맞추어 색상값 갯수 생성 [포문]
// 색상부여
//let bricksColor = ["red", "orange", "yellow", "green", "blue", "navy"];
function drawBricks()
{
let gaming = false;
// context.beginPath();
wall.drawBlackBricks();
for(let i = 0; i < brickRow; i++) // 위에서아래로 4줄 {
{
for(let j = 0; j < brickColumn; j++) // 좌우로 5개씩
{
// TODO : right : lefi + 50 해보기
/* if(bricks[i][j].collisionCount == 2)
{
context.beginPath();
context.rect(bricks[i][j].left, bricks[i][j].top, brickWidth, brickHeight);
context.fillStyle = bricksColor[i%5];
context.fill();
context.closePath();
gamimg = true;
}
else if(bricks[i][j].collisionCount == 1)
{
context.beginPath();
context.rect(bricks[i][j].left, bricks[i][j].top, brickWidth, brickHeight);
context.fillStyle = "purple";
context.fill();
context.closePath();
gamimg = true;
}
else
{
} */
gaming = bricks[i][j].draw();
}
}
if(!gaming) {
// clear();
}
// context.closePath();
}
function update()
{
// checkToWin();
// 게임 클리어 관련
if( arcPosY + 10 > 400)
{
// window.location.reload();
//console.log('gg')
// alert("겜오버!!")
}
//데이터 수정 도형의 위치 이동
if(arcPosX - arcRadius < 0)
{
arcMoveDirX = 1;
}
else if(arcPosX + arcRadius > canvas.width)
{
arcMoveDirX = -1;
}
if(arcPosY - arcRadius < 0)
{
arcMoveDirY = 1;
}
else if(arcPosY + arcRadius > canvas.height)
{
arcMoveDirY = -1;
}
arcPosX += arcMoveDirX * arcMoveSpd;
arcPosY += arcMoveDirY * arcMoveSpd;
ball.left = arcPosX - arcRadius;
ball.right = arcPosX + arcRadius;
ball.top = arcPosY - arcRadius;
ball.bottom = arcPosY + arcRadius;
if(wall.left < 0)
{
wallMoveDirX = 1;
}
else if(wall.right > canvas.width)
{
wallMoveDirX = -1;
}
wall.left += wallMoveDirX * wallMoveSpd;
wall.right += wallMoveDirX * wallMoveSpd;
// 충돌확인 어떤경우에도 안부딪히는 상황
if(isCollisionRectToArc(ball, paddle))
{
arcMoveDirY *= -1;
arcPosY = paddle.top - arcRadius;
}
if(isCollisionRectToArc(ball, wall)) // right left top bottom 벽돌충돌 방향전환 추가
{
if(arcPosX > wall.right){
arcMoveDirX *= -1;
arcPosX = wall.right + arcRadius;
}else if(arcPosX < wall.left){
arcMoveDirX *= -1;
arcPosX = wall.left - arcRadius;
}else if(arcPosY < wall.top){
arcMoveDirY *= -1;
arcPosY = wall.top - arcRadius;
}else if(arcPosY > wall.bottom){
arcMoveDirY *= -1;
arcPosY = wall.bottom + arcRadius;
}
}
for(let i = 0; i < brickRow; i++)
{
for(let j = 0; j < brickColumn; j++)
{
if (isCollisionRectToArc(ball, bricks[i][j]))
{
// 벽돌을 안보이게.. 위치를 바꾸던지.. 볼의 방향을 바꾸던지..
// console.log('i : ', i, ', j : ', j);
if(bricks[i][j].collisionCount > 0) {
bricks[i][j].collisionCount--;
arcMoveDirY *= -1;
break
// bricks[i][j].isAlive = false;
// deadBricksCount++;
// if (deadBricksCount == brickRow * brickColumn)
// // 게임 클리어
// )
}
}
else{
}
}
}
}