[Javascript Basic] 03. パチンコゲーム(3)


学習目標
  • eventLister,eventHandlerによりキーボード
  • を移動する.
  • ロッドがボールに衝突すると
  • リバウンド
    まずeventListenerとeventHandlerを使います
    // bar 방향설정
    let barMoveDirX = 10;
    let barSpeed = 3;
    
    document.addEventListener('keydown', keyDownEeventHandler); // (1) 특정한 이벤트에서 일어날 동작을 정의하고 
    // bar 움직이기
    function keyDownEeventHandler(e) { // (2) 이벤트가 발생했을때 그처리를 담당하는 함수를 호출
    if(e.key == 'ArrowRight' && barPosX + barWidth < canvas.width ) {
            // 바를 오른쪽으로 이동
            //console.log(alert("오른쪽 된다!"))
             barPosX += barMoveDirX;
    
        } else if (e.key == 'ArrowLeft' && barPosX > 0) {
            //console.log(alert("왼쪽 된다!"))
            barPosX -= barMoveDirX;     
        }
    }
    
  • addEventListenerによって特定のイベントで発生する動作を定義し、イベント発生時に処理を担当する関数をEeventHandlerによって呼び出す.
  • 新しい
  • BarMoveDirX変数を作成し、条件に従ってBarPosX
  • を増減します.
    最後にballとbarの衝突を引き起こしてみましょう.まず、ballとbarが会わない場合を明記します.
    // ball과 bar가 만나지 않는 경우 
    function isCollisionRectToRect(rectA, rectB)
    {
        // a의 왼쪽과 b의 오른쪽
        // a의 오른과 b의 왼쪽
        // a의 아래쪽과 b의 위쪽
        // a의 위쪽과 b의 아래쪽
        if(rectA.left > rectB.right ||
           rectA.right < rectB.left ||
           rectA.top > rectB.bottom ||
           rectA.bottom < rectB.top)
           {
               return false 
           }
        return true;
    }
    
    次に、ballとpullという名前の任意のオブジェクトを作成し、ballとbarが実行する関数にコードを追加します.最後に、isCollisionRectToRect操作コードを入力します.
    次は最終コードです
    
    const canvas = document.getElementById('myCanvas');      // 이 아이디를 가지고 특정 탭에 접근을 한다
    const context = canvas.getContext('2d');            // context라는 존재를 통해 그리기를 한다
    
    document.addEventListener('keydown', keyDownEeventHandler);
    
    
    let arcPosX = canvas.width / 2
    let arcPosY = canvas.height / 2
    
    let barWidth = 100;
    let barHeight = 40
    let rectPosX = canvas.width / 2 - barWidth / 2
    let rectPosY = canvas.height - barHeight / 2
    let rectMoveDirX = 10;
    let barSpeed = 3;
    
    const arcRaius = 20;
    
    //방향에 대한 변수 설정
    let arcMoveDirX = 1;
    let arcMoveDirY = -1;
    let arcSpeed = 1;
    
    let ball = {
        left : 0,
        right : 0, 
        top : 0, 
        bottom : 0
    }
    
    let paddle = {
        left : 0,
        right : 0, 
        top : 0, 
        bottom : 0
    }
    
    
    function keyDownEeventHandler(e) {
        if(e.key == 'ArrowRight') {
            // 바를 오른쪽으로 이동
            //console.log(alert("오른쪽 된다!"))
            if (rectPosX + barWidth < canvas.width) {
    
                rectPosX += rectMoveDirX;
            }
        }
        if(e.key == 'ArrowLeft') {
            //console.log(alert("왼쪽 된다!"))
            if (rectPosX > 0){
                rectPosX -= rectMoveDirX;
            }
        }
        
        paddle.left = rectPosX;
        paddle.right = rectPosX + barWidth;
        paddle.top = rectPosY;
        paddle.bottom = rectPosY + barHeight;
    }
    
    
    // ball과 bar가 만나지 않는 경우 
    function isCollisionRectToRect(rectA, rectB)
    {
        // a의 왼쪽과 b의 오른쪽
        // a의 오른과 b의 왼쪽
        // a의 아래쪽과 b의 위쪽
        // a의 위쪽과 b의 아래쪽
        if(rectA.left > rectB.right ||
           rectA.right < rectB.left ||
           rectA.top > rectB.bottom ||
           rectA.bottom < rectB.top)
           {
               return false 
           }
        return true;
    }
    
    
    function update() {
    
        if(arcPosX - arcRaius < 0 ) {
            arcMoveDirX = 1;
            
        } else if(arcPosX + arcRaius > canvas.width){
            arcMoveDirX = -1;
        }
    
        if(arcPosY - arcRaius < 0) {
            arcMoveDirY = -1;
        } else if(arcPosY + arcRaius > canvas.height) {
            arcMoveDirY = +1;
        }
    
        //arcSpeed+=0.01;
        arcPosX += arcMoveDirX * arcSpeed;
        arcPosY -= arcMoveDirY * arcSpeed;
    
        ball.left = arcPosX - arcRaius ;
        ball.right = arcPosX + arcRaius 
        ball.top = arcPosY - arcRaius 
        ball.bottom = arcPosY + arcRaius
        
        // 충돌확인
        if(isCollisionRectToRect(ball, paddle)){
            arcMoveDirY = 1;
            //arcMoveDirX = -1;
            arcPosY = paddle.top - arcRaius;
        }
        
    }
    
    function draw() {
    
    
        // 화면 클리어
        context.clearRect(0, 0, canvas.width, canvas.height);
    
        // 다른 도형 그리기
        drawRect();
        drawArc();
    }
    
    
    function drawArc() {
    
        // context.clearRect(0, 0, canvas.width, canvas.height);
        // arcPosX++;    
        context.beginPath(); // 그리기를 시작하겠다
        //context.arc(canvas.width / 2 , canvas.height / 2  , 50, 0, 2 * Math.PI);
        context.arc(arcPosX , arcPosY  , arcRaius, 0, 2 * Math.PI);
        context.fillStyle = 'blue';
        context.fill();
        context.closePath(); // 그리기를 끝내겠다     
    }
    // 컴파일 순간에 메모리에 정해지고 밑에서 호출되면 그때 실행.
    
    function drawRect(){
        //context.clearRect(0, 0, canvas.width, canvas.height);
    
        context.beginPath(); // 그리기를 시작하겠다
        context.rect( rectPosX, rectPosY, barWidth, barHeight);
        context.fillStyle = 'red';
        context.fill();
        context.closePath(); // 그리기를 끝내겠다
    }
    
    setInterval(update, 10);
    setInterval(draw, 10);