使用canvas实现迷宫游戏


当前第2页 返回上一页

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

// 移动函数

function processKey(e) {

  dx = 0

  dy = 0

  // 上下左右方向键检测

  if (e.keyCode === 38) {

    dy = -1

  }

  if (e.keyCode === 40) {

    dy = 1

  }

  if (e.keyCode === 37) {

    dx = -1

  }

  if (e.keyCode === 39) {

    dx = 1

  }

}

 

// 绘制帧

function drawFrame() {

  if (dx != 0 || dy != 0) {

    // context.clearRect(x,y,canvas.width,canvas.height)

    // 绘制移动轨迹

    context.beginPath();

    context.fillStyle = "rgb(254,244,207)"

    context.rect(x, y, 15, 15)

    context.fill()

    x += dx

    y += dy

    // 碰撞检测

    if (checkForCollision()) {

      x -= dx

      y -= dy

      dx = 0

      dy = 0

    }

     

    //绘制小人应该移动的地点

    var imgFace = document.getElementById('face')

    context.drawImage(imgFace, x, y)

 

    if (canvas.height - y < 17) {

      // isFirst = false

      alert('恭喜你通关 游戏结束')

      return false

    }

    // 这里如果重置的话变成非自动移动,也就是每按下一次方向键只前进一步,由于目前体验不好所以先不做重置

    // dx = 0

    // dy = 0

  }

  setTimeout(drawFrame, 20)

}

上述代码中,移动函数比较简单,绘制帧的函数里面比较重要的就是碰撞检测函数,在下面详细解释。

碰撞检测

要检测物体与墙体是否碰撞,通常情况是要先把地图信息保存到内存里,然后在移动物体时检测是否与当前的某个墙体碰撞,但是由于我们的地图背景是黑白迷宫,所以可以使用颜色来检测碰撞。具体的做法是:

获取当前物体的坐标位置,利用canvas检测当前地图上这个位置的颜色是否为黑色,如果是,说是是墙体,不应该执行移动,下面就是代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

function checkForCollision() {

  var imageData = context.getImageData(x - 1, y - 1, 15 + 2, 15 + 2)

  var pixels = imageData.data

 

  for (var i = 0, len = pixels.length; i < len; i++) {

    var red = pixels[i],

        green = pixels[i + 1]

        blue = pixels[i + 2]

        alpha = pixels[i + 3]

 

    // 检测是否碰到黑色的墙

    if (red === 0 && green === 0 && blue === 0) {

      return true

    }

  }

  return false

}

在这里,15是小人的宽度,我们检测小人两侧各1px范围(对应代码中的getImageData(x - 1, y - 1, 15 + 2, 15 + 2)可以稍微思考下这里为什么是+2),如果是黑色,说明检测到碰撞。

其余

在代码里,我加了一些其他的功能,比如提示答案等。至于更换地图也比较简单:把地图对应的文件地址,起点坐标,答案图片路径等存在一个对象里,然后设置一个地图数组,点击的时候切换地图并重新渲染就可以了。还有一些值得优化的地方,比如:

  1. 碰撞检测在拐弯的地方体验不佳;

  2. 当前情况运行时有轨迹,在答案模式下应该如何去掉轨迹?

有兴趣的同学可以试着自己实现下。

小结

这个例子相对比较简单,对js的要求不高,拿来玩一下还是挺不错的。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

HTML5 Canvas API制作简单的猜字游戏

HTML5 Canvas实现烟花绽放的特效

以上就是使用canvas实现迷宫游戏的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

深入了解js中的for...of循环

HTML5实现背景音乐的自动播放

原生js的常用方法整理

javascript怎么将字母转为小写

javascript自定义函数的写法是什么

HTML5语义化标签有哪些

javascript是不是弱语言

c和javascript的区别是什么

HTML5中返回timeranges对象的属性buffered

js遇到代码出现问题时调试代码的方法

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...