ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 크롬 공룡게임
    Youtube/개발자, 코딩 2023. 7. 29. 22:57

    <앱 만들기 도전>

     

    문득 앱이 만들고 싶어져서 찾아봤다. (앱에 대해 아무것도 모르지만 아무렴 어떤가!)

     

    무작정 앱 만드는 법을 검색했다. 유튜브에는 좋은 영상들이 많았다. 

     

    앱을 만들기 위해서는 여러가지 방법이 있다.  (다음은 조코딩님 유튜브 영상에서 참조한 스크린샷이다.)

    출처: 유튜브 조코딩 JoCoding님

    조코딩님의 영상에서는 미리 만든 웹이 있고, 이를 앱을 통해 띄우는 웹뷰앱 방식을 소개했다. 웹개발 종합반 강의를 통해 만들어본 웹페이지는 있었지만, 다른 것을 시도해보고 싶어서 이 방법은 보류했다.

     


     

    <만만해보이는 것부터 도전하기>

    그렇게 다른 레퍼런스를 찾아보던 중 눈에 띄는 것이 있었는데...

    https://youtu.be/qkTtmgCjHhM

    바로 크롬 공룡게임이었다.

    인터넷이 연결되지 않은 상태에서 크롬에 접속하면 나오는 게임인데, 링크를 통해 접속할 수도 있다.

    공룡은 앞으로 계속 달리고, 다가오는 장애물(선인장)들을 점프로 피해서 점수를 올리는 게임이다.

    아마 누구나 한 번씩은 접해봤으리라 생각한다.

     

    영상을 보고 거의 따라만 했다. 자바스크립트 문법을 아직 배우지 않았지만, 함수정의나, 반복문, if문은 쉽게 이해할 수 있었다. 이해한 것과 영상을 복습하면서 내용을 정리했다.

     


     

    <html파일 생성>

    공룡게임을 만드는 과정은 다음과 같다.

    우선 index.html 파일을 만들고, html:5를 통해 뼈대를 제작한다. 이후 body 태그 안에 canvas 태그와 script 태그를 넣어주고, script 태그 안에 작성하지 않고 main.js 파일을 생성하여 이곳에 코딩한다.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <canvas id="canvas"></canvas>
        <script src="main.js"></script>
    </body>
    </html>

     


     

    <js파일>

    1. 사각형을 그릴 수 있다.

    canvas 태그 활용한다.
    캐릭터의 정보를 입력하고, draw() 함수를 정의하여 화면에 그린다.
    캐릭터와 장애물 모두 사각형으로 구현할 수 있다.


    2. 코드를 1초에 60번 실행하면 애니메이션을 만들 수 있다.

    (이때 60번이라는 숫자는 본인 모니터의 FPS에 따라 바뀔 수 있다.)

    게임을 만들 때 시간은 프레임 단위로 생각해야 한다.
    웹브라우저 기본 기능 requestAnimationFame() 을 사용해준다.

    이 기능 안에 입력되는 코드들은 1프레임마다 실행된다.

     

    장애물이 200프레임마다 생성되도록한다.
    프레임이 짧을 수록 장애물이 자주 나오니 난이도를 조절할 수 있다.

    생성된 장애물이 왼쪽으로 이동하도록 x좌표를 감소시킨다.



    생성된 장애물은 캐릭터가 통과한 후에 쓰임을 다하니 특정 좌표를 지나면 자동으로 사라질 수 있도록 한다.

     


    3. 점프 기능 구현

    캐릭터(공룡)의 y좌표를 줄이면 점프한다.
    '점프중' 스위치를 만들어서, 스페이스바를 누를 때 실행되도록 한다.
    점프중 스위치가 true 가 되면 캐릭터가 위로 이동하는데,

    계속해서 올라가면 안되니 최대값을 설정한다. 

     


    4. 충돌 감지 구현

    장애물 x 좌표에서 공룡 x 좌표를 뺀 값이 0미만 이면, 옆 변끼리 만난 것이다. 이 때, 공룡 x 좌표는 왼쪽끝에서 시작하므로, 충돌 감지 식은 다음과 같다.

    장애물.x - (공룡.x + 공룡.너비)

    y좌표도 동일하다. x축과 y축의 차이가 모두 0 미만 일때 충돌로 인식한다.
    충돌을 감지하면 애니메이션이 멈추도록 한다.(멈춘 화면 그대로 정지)

     

     

    5. 캐릭터와 장애물에 이미지 파일 넣기

    이미지를 넣을 변수를 선언, png파일을 참조한다.

    draw() 함수에 ctx.drawImag()를 넣어서 참조하는 그림파일을 그려줄 수 있도록 한다.



    dino.png


    cactus.png

    구글링에서 찾을 수도 있겠지만, 그림판 도형으로 간단하게 그려보았다.

     

     

    6. 실행해보기

    배경도 없고, 애니메이션도 없고, 장애물 속도도 똑같고, 심지어 점프 속도도 마음에 들지 않는다.

    아직까지는 많은 부분에서 부족하다.

     

     


     

    <보완 사항>

    이 정도로 게임이 완성되는 것은 아니다.

    점프도 중복으로 할 수 있고, 스코어 판도 없고, 공룡이 달리는 모션도 없다.

    장애물이 나오는 갯수도 속도도 쭉 동일하다.

    아직 게임이라고 할 수 있는 완성도는 아닌 것이다.

     

    <후기>

    아주 간단한 게임이지만 따라 만드는 과정을 통해

    어떤 식으로 사고해야하는지 조금이나마 이해할 수 있었다.

    '이렇게 간단한 것도 혼자 못한다니' 라는 생각보다는

    따라하는 과정 그 자체를 즐기고자 한다.

    즐기다보면 실력은 자연스레 향상되어 있을 것이다.

    물론 필요한 공부는 스스로 보충해주어야 한다.

    이번의 경우 자바스크립트 기본 문법 공부는 꼭 필요하다는 것을 느꼈다.

     

    본문은 끝이고, 코드가 길어 제일 아래 쪽에 첨부한다.

     


    <main.js 파일 코드>

    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    
    canvas.width = window.innerWidth - 100;
    canvas.height = window.innerHeight - 100;
    
    var dino = {
        x : 10,
        y : 200,
        width : 50,
        height : 50,
        draw(){
            ctx.fillStyle = 'green';
            ctx.fillRect(this.x, this.y, this.width, this.height);
            ctx.drawImage(img2, this.x, this.y)
        }
    }
    // 캐릭터를 만들기 전에, object의 자료로 정리한다.
    
    var img1 = new Image();
    img1.src = 'cactus.png';
    
    var img2 = new Image();
    img2.src = 'dino.png';
    
    class Cactus {
        constructor(){
            this.x = 500;
            this.y = 200;
            this.width = 50;
            this.height = 50;
        }
        draw(){
            ctx.fillStyle = 'red';
            // ctx.fillRect(this.x, this.y, this.width, this.height);
            ctx.drawImage(img1, this.x, this.y)
        }
    }
    
    var timer = 0;
    var cactus여러개 = [];
    var 점프timer = 0;
    var animation;
    
    function 프레임마다실행할거(){
        animation = requestAnimationFrame(프레임마다실행할거)
        timer++;
        ctx.clearRect(0,0, canvas.width, canvas.height);
        
        if (timer % 200 === 0) {
            var cactus = new Cactus();
            cactus여러개.push(cactus);
            
        }
        cactus여러개.forEach((a, i, o)=>{
            if(a.x < 0){
                o.splice(i, 1)
            }
            a.x--;
    
            충돌하냐(dino, a);
    
            a.draw();
        })
        
        if(점프중 == true){
            dino.y--;
            점프timer++;
        }
        if(점프중 == false){
            if (dino.y < 200){
                dino.y++;
            }
        }
        if (점프timer > 100){
            점프중 = false;
            점프timer = 0
        }
    
        dino.draw()
    }
    // 1초에 60번(모니터 FPS만큼) 안에 있는 코드가 실행된다.
    
    프레임마다실행할거();
    
    
    //충돌확인
    function 충돌하냐(dino, cactus){
        var x축차이 = cactus.x - (dino.x + dino.width);
        var y축차이 = cactus.y - (dino.y + dino.height);
        if(x축차이 < 0 && y축차이 < 0){
            ctx.clearRect(0,0, canvas.width, canvas.height);
            cancelAnimationFrame(animation)
        }
    }
    
    
    var 점프중 = false;
    document.addEventListener('keydown', function(e){
        if (e.code === 'Space'){
            점프중 = true;
        }
    })
    
    //보완요소: 다중 점프 금지, 스코어, 공룡이 달리는: 스프라이트 이미지(달리는 프레임마다 이미지를 바꿈), 배경, 장애물이 나오는 속도 조절 등...

     

Designed by Tistory.