0

我正在創建我的第一款遊戲,一種迷宮類型,具有碰撞檢測功能。我目前正在以連續運動(仍有一些缺陷)移動'工具'div並檢查碰撞。碰撞檢測/無法讀取未定義屬性'defaultView'

當我將碰撞項傳遞到代碼底部的檢查中時,出現錯誤'無法讀取未定義屬性'defaultView'。

main.js

$(document).ready(() => { 
    console.log('DOMContentLoaded on app'); 


    //---------------------------------------------- 
    //Build walls 
    const tx = 100; 
    const bx = 600; 
    const ly = 10; 
    const my = 650; 
    const ry = 750; 
    const $main = $('main'); 
    const thick = 10; 
    const goal = 100; 
    let wallArray = []; 

    //outline walls 
    $main.append(buildWalls(tx, ly, thick, my - ly - goal)); 
    $main.append(buildWalls(tx, my, thick, ry - my)); 
    $main.append(buildWalls(tx, ry, bx - tx + thick, thick)); 
    $main.append(buildWalls(bx, ly, thick, ry - ly)); 
    $main.append(buildWalls(tx, ly, bx - tx, thick)); 
    // inside walls 
    $main.append(buildWalls(200, 300, 75, thick)); 
    $main.append(buildWalls(400, 500, thick, 75)); 
    $main.append(buildWalls(500, 150, 75, thick)); 
}); 

// build walls with inputs 


function buildWalls(top1, left1, height1, width1) { 
    const wall = $('<div>', { 
    class: 'wall', 
    }) 
    .css({ 
     top: top1, 
     left: left1, 
     height: height1, 
     width: width1, 
    }); 

    return wall; 
} 

    //---------------------------------------------- 
    // tool, prize, and goal 

const bPx = 600; 
const bPy = 150; 
const speed = 5; 
const time = 100; 
const tool = createTool(); 
const prize = createPrize(); 
const moveFunctions = moving(tool, bPy, bPx, speed); 

function createTool() { 
    return $('<div>') 
    .addClass('tool black') 
    .attr('id', 'tool') 
    .css({ left: bPx, top: bPy }) 
    .appendTo($('main')); 
} 

function createPrize() { 
    return $('<div>') 
    .addClass('prize') 
    .attr('id', 'prize') 
    .css({ left: 50, top: 550 }) 
    .appendTo($('main')); 
} 


//_________________________________________ 
// for moving the tool around 

function moving($el, bPy, bPx, speed) { 
    let drag = 0; 
    return { 
    moveUp() { 
     bPy -= speed; 
     drag = drag *= -1; 
     // $el.css('top', bPy); 
     // console.log($el); 
    }, 
    moveLeft() { 
     bPx -= speed; 
     drag = -1; 
    }, 
    moveDown() { 
     bPy += speed; 
     drag = 1; 
    }, 
    moveRight() { 
     bPx += speed; 
     drag = 1; 
    }, 
    looper() { 
     $el.css({ 
     left: bPx += drag, 
     top: bPy += drag, 
     }); 
    }, 
    }; 
} 


// }; 
setInterval(moveFunctions.looper, time); 

// key controls 
$(document).keydown((event) => { 
    console.log(event.keyCode); 
    const key = event.which; 
    switch (key) { 
    // let keepMoving = 0; 
    // move object left 
    case 37: 
     moveFunctions.moveLeft(); 
     checkCollisions(); 
     break; 
    // move object right 
    case 39: 
     moveFunctions.moveRight(); 
     checkCollisions(); 
     break; 
    // move object up 
    case 38: 
     moveFunctions.moveUp(); 
     console.log('{tool} up'); 
     checkCbreak; llisions(); 
     break; 
    // move object down 
    case 40: 
     moveFunctions.moveDown(); 
     checkCollisions(); 
     break; 
    // stop movement... used for when collision happens 
    case 32: 
     alert('stop'); 
     break; 
    } 
}); 

// get blocks corners .. wall, tool, item 
function getPositions(block) { 
    const $block = $(block); 
    const pos = $block.position(); 
    const width = $block.width(); 
    const height = $block.height(); 
    return [[pos.left, pos.left + width], [pos.top, pos.top + height]]; 
} 


// compare if they have overlaping coordinates 
function comparePositions(p1, p2) { 
    const x1 = p1[0] < p2[0] ? p1 : p2; 
    const x2 = p1[0] < p2[0] ? p2 : p1; 
    return !!(x1[1] > x2[0] || x1[0] === x2[0]); 
} 


function checkCollisions() { 
    const block = $('.wall')[0]; 
    const pos = getPositions(block); 
    console.log(this); 
    const pos2 = getPositions(this); 
    const horizontalMatch = comparePositions(pos[0], pos2[0]); 
    const verticalMatch = comparePositions(pos[1], pos2[1]); 
    const match = horizontalMatch && verticalMatch; 
    if (match) { alert('COLLISION!!! Finally !!!'); } 
} 

的style.css

body{ 
margin: auto; 
text-align: center; 
} 
.black { 
    background-color: black; 
} 
.red { 
    background-color: red; 
} 

.tool { 
    border: 2px solid black; 
    border-radius: 2px; 
    width: 20px; 
    height: 20px; 
    background-color: green; 
    position: absolute; 
    z-index: 300; 
} 
.wall { 
    background-color: black; 
    position: absolute; 
} 
.goal { 
    background-color: gold; 
    position: absolute; 
} 
.prize { 
    border: 2px solid black; 
    border-radius: 2px; 
    width: 20px; 
    height: 20px; 
    background-color: gold; 
    position: absolute; 
    z-index: 299; 
} 

的index.html

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <title>Maze</title> 
    <link rel="stylesheet" href="style.css"> 
    <script src="http://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script> 
</head> 
<body> 
<main> 
</main> 
<script src="main.js" type="text/javascript" charset="utf-8" async defer></script> 
</body> 
</html> 

感謝您的幫助!

+0

'checkCollisions'中的'this'不是您認爲的那樣。你在沒有上下文的情況下調用它,只有'checkCollisions()'。不過,你應該已經意識到了這個問題,因爲在'this'傳遞的行的上方有一個console.log。 – Teemu

回答

0

這裏面的getCollision實際上是指窗口,它應該指向你的移動對象。

我在計算getCollision時做了少量更改以獲取移動元素。

1)將getElelment()方法添加到移動類中。 2)使用此方法計算getCollision。

$(document).ready(() => { 
    console.log('DOMContentLoaded on app'); 


    //---------------------------------------------- 
    //Build walls 
    const tx = 100; 
    const bx = 600; 
    const ly = 10; 
    const my = 650; 
    const ry = 750; 
    const $main = $('main'); 
    const thick = 10; 
    const goal = 100; 
    let wallArray = []; 

    //outline walls 
    $main.append(buildWalls(tx, ly, thick, my - ly - goal)); 
    $main.append(buildWalls(tx, my, thick, ry - my)); 
    $main.append(buildWalls(tx, ry, bx - tx + thick, thick)); 
    $main.append(buildWalls(bx, ly, thick, ry - ly)); 
    $main.append(buildWalls(tx, ly, bx - tx, thick)); 
    // inside walls 
    $main.append(buildWalls(200, 300, 75, thick)); 
    $main.append(buildWalls(400, 500, thick, 75)); 
    $main.append(buildWalls(500, 150, 75, thick)); 
}); 

// build walls with inputs 


function buildWalls(top1, left1, height1, width1) { 
    const wall = $('<div>', { 
    class: 'wall', 
    }) 
    .css({ 
     top: top1, 
     left: left1, 
     height: height1, 
     width: width1, 
    }); 

    return wall; 
} 

    //---------------------------------------------- 
    // tool, prize, and goal 

const bPx = 600; 
const bPy = 150; 
const speed = 5; 
const time = 100; 
const tool = createTool(); 
const prize = createPrize(); 
const moveFunctions = moving(tool, bPy, bPx, speed); 

function createTool() { 
    return $('<div>') 
    .addClass('tool black') 
    .attr('id', 'tool') 
    .css({ left: bPx, top: bPy }) 
    .appendTo($('main')); 
} 

function createPrize() { 
    return $('<div>') 
    .addClass('prize') 
    .attr('id', 'prize') 
    .css({ left: 50, top: 550 }) 
    .appendTo($('main')); 
} 


//_________________________________________ 
// for moving the tool around 

function moving($el, bPy, bPx, speed) { 
    let drag = 0; 
    return { 
    getElement(){ 
     return $el; 
    }, 
    moveUp() { 
     bPy -= speed; 
     drag = drag *= -1; 
     // $el.css('top', bPy); 
     // console.log($el); 
    }, 
    moveLeft() { 
     bPx -= speed; 
     drag = -1; 
    }, 
    moveDown() { 
     bPy += speed; 
     drag = 1; 
    }, 
    moveRight() { 
     bPx += speed; 
     drag = 1; 
    }, 
    looper() { 
     $el.css({ 
     left: bPx += drag, 
     top: bPy += drag, 
     }); 
    }, 
    }; 
} 


// }; 
setInterval(moveFunctions.looper, time); 

// key controls 
$(document).keydown((event) => { 
    console.log(event.keyCode); 
    const key = event.which; 
    switch (key) { 
    // let keepMoving = 0; 
    // move object left 
    case 37: 
     moveFunctions.moveLeft(); 
     checkCollisions.call(event.target); 
     break; 
    // move object right 
    case 39: 
     moveFunctions.moveRight(); 
     checkCollisions.call(event.target); 
     break; 
    // move object up 
    case 38: 
     moveFunctions.moveUp(); 
     console.log('{tool} up'); 
     checkCollisions.call(event.target); 
     break; 
    // move object down 
    case 40: 
     moveFunctions.moveDown(); 
     checkCollisions.call(event.target); 
     break; 
    // stop movement... used for when collision happens 
    case 32: 
     alert('stop'); 
     break; 
    } 
}); 

// get blocks corners .. wall, tool, item 
function getPositions(block) { 
    const $block = $(block); 
    const pos = $block.position(); 
    const width = $block.width(); 
    const height = $block.height(); 
    return [[pos.left, pos.left + width], [pos.top, pos.top + height]]; 
} 


// compare if they have overlaping coordinates 
function comparePositions(p1, p2) { 
    const x1 = p1[0] < p2[0] ? p1 : p2; 
    const x2 = p1[0] < p2[0] ? p2 : p1; 
    return !!(x1[1] > x2[0] || x1[0] === x2[0]); 
} 


function checkCollisions() { 
    const block = $('.wall')[0]; 
    const pos = getPositions(block); 
    console.log(moveFunctions.getElement()); 
    const pos2 = getPositions(moveFunctions.getElement()); 
    const horizontalMatch = comparePositions(pos[0], pos2[0]); 
    const verticalMatch = comparePositions(pos[1], pos2[1]); 
    const match = horizontalMatch && verticalMatch; 
    if (match) { alert('COLLISION!!! Finally !!!'); } 
} 
+0

感謝您的幫助Manoj! –