본문 바로가기
HTML

JavaScript로 만드는 공 넣기 게임

by ADELA_J 2023. 5. 11.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        canvas {
            border: 1px dotted red; /*캔버스 경계선그려주기*/
            background-color: #fcff00;  /*캔버스의 배경색*/
        }
    </style>
    <script>
        var context;        /*컨텍스트 객체*/
        var velocity;       /*사용자가 입력한 공의 초기 속도*/
        var angle;          /*사용자가 입력한 공의 초기 각도*/
        var ballV;          /*공의현재 속도*/
        var ballVx;         /*공의 현재 x방향 속도*/
        var ballVy;         /*공의 현재 y방향 속도*/
        var ballX = 10;     /*공의 현재 x방향 위치*/
        var ballY = 250;    /*공의 현재 y방향 위치*/
        var ballRadius = 10;    /*공의 반지름*/
        var score = 0;          /*점수*/
        var image = new Image();        /*이미지 객체 생성*/
        image.src = "lawn.png";         /*이미지 파일 이름 설정*/
        var backimage = new Image();
        backimage.src = "pattern.png";
        var timer;              /*타이머 객체 변수*/

        /*공을 화면에 그린다*/
        function drawBall(){
            context.beginPath();
            context.arc(ballX, ballY, ballRadius, 0, 2.0*Math.PI, true);
            context.fillStyle = "red";
            context.fill();
        }
        
        /*배경을 화면에 그란다.*/
        function drawBackground() {
            context.drawImage(image, 0, 270)
            var pattern = context.createPattern(backimage, "repeat");
            context.rect(450,90, canvas.width, canvas.height);
            context.fillStyle = pattern;
            context.fill();

        }
        /*전체화면을 그리는 함수*/
        function draw() {
            context.clearRect(0,0,500,300);     /*화면을 지운다*/
            drawBall();
            drawBackground();
        }
        /*초기화를 담당하는 함수*/
        function init(){
            ballX = 10;
            ballY = 250;
            ballRadius = 10;
            context = document.getElementById('canvas').getContext('2d');
            draw();
        }
        /*사용자가 발사 버튼을 누르면 호출된다*/
        function start(){
            init();
            velocity = Number(document.getElementById("velocity").value);
            angle = Number(document.getElementById("angle").value);
            var angleR = angle*Math.PI/ 180;

            ballVx = velocity * Math.cos(angleR);
            ballVy = -velocity*Math.sin(angleR);
            
            draw();
            timer = setInterval(calculate,100)
            return false;
        }
        /*공의 현재 속도와 위치를 업데이트한다*/
        function calculate(){
            ballVy = ballVy + 1.98;
            ballX = ballX + ballVx;
            ballY = ballY + ballVy;

            /*공이 목표물에 맞았으면*/
            if ((ballX >=450)&& (ballX <=480) && (ballY >=60) & (ballY <= 150)){
                score++;
                document.getElementById("score").innerHTML = "점수="+score;
                clearInterval(timer);
            }
            /*공이 경계를 벗어났으면*/
            if (ballY >= 300 || ballY <0){
                clearInterval(timer);
            }
            draw();
        }
    </script>
</head>
<body onload = "init();">
    <canvas id="canvas" width="500" height="300"></canvas>
    <div id="control">
        속도<input id="velocity" value="30" type="number" min="0" max="100" step="1"/>
        각도<input id="angle" value="45" type="number" min="0" max="90" step="1"/>
        <div id="score">점수=0</div>
        <button onclick ="start()">발사</button>
    </div>
</body>
</html>

'HTML' 카테고리의 다른 글

자바스크립트 캔버스  (0) 2023.05.11
자바스크립트 JS 콜백함수 그리고 반복문으로 별 트리 찍기  (0) 2023.05.09
float랑 위치 잡는거 연습  (0) 2023.04.21
0414 HTML CSS 실습  (0) 2023.04.20
0413 HTML CSS 실습  (0) 2023.04.14