0

我正在创建我的第一个游戏,迷宫类型,带有碰撞检测。我目前正在通过连续运动(仍然有一些错误)移动“工具”div并检查碰撞。

当我将碰撞项目传递到代码底部的检查时,我收到错误“无法读取未定义的属性‘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 !!!'); }
}

样式.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;
}

索引.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>

感谢您的任何帮助!

4

1 回答 1

0

getCollision 内部的 this 实际上指的是应该指代您的移动对象的窗口。

在计算 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 !!!'); }
}
于 2017-11-11T08:08:34.847 回答