查看原文
其他

KUOKUO的趣味教程 | 小怪物的视野(2)

EEA阔宝:专注 CocosCreator 引擎小游戏开发两年

开发微信小游戏5款

 H5 小游戏多款

CSDN 博客: KUOKUO 众享


本篇承接上一集故事《KUOKUO的趣味教程 | 进击的小怪诞生(1)》,看小怪是如何自我进化的!

第二章:小怪物的视野

正在小怪开心的追着玩家时,忽然飘起了雾,由于小怪的速度比玩家慢那么一点点,渐渐地,它看不见玩家了。 

不得已,小怪停下了!它在思考!!!这是怎么做到的呢?

原来是用代码模拟黑暗灯光效果 ,这里巧妙的使用了 cc.Graphics 绘图组件:

  1. drawLight (x, y, r) {

  2. // 左半圆

  3. let left = this.root.children[0].getComponent(cc.Graphics);

  4. left.clear();

  5. left.moveTo(x,y+r);

  6. left.lineTo(x,320);

  7. left.lineTo(-480,320);

  8. left.lineTo(-480,-320);

  9. left.lineTo(x,-320);

  10. left.lineTo(x,y-r);

  11. for (let i = 3.141592; i < 3.141592 * 2; i += 0.1) {

  12. left.lineTo(x + r * Math.sin(i) , y + r * Math.cos(i));

  13. }

  14. left.fill();

  15. // 右半圆

  16. let right = this.root.children[1].getComponent(cc.Graphics);

  17. right.clear();

  18. right.moveTo(x,y+r);

  19. right.lineTo(x,320);

  20. right.lineTo(480,320);

  21. right.lineTo(480,-320);

  22. right.lineTo(x,-320);

  23. right.lineTo(x,y-r);

  24. for (let i = 3.141592; i > 0; i -= 0.1) {

  25. right.lineTo(x + r * Math.sin(i) , y + r * Math.cos(i));

  26. }

  27. right.fill();

  28. }

灯光是由两个半圆组成,拼接面成的,下面是左半圆

这个是节点图,root 空节点包括了两个带有 cc.graphics 组件的节点。

然后是范围检测

  1. update (dt) {

  2. // 1 秒 1 次

  3. this.thinkCD -= dt;

  4. if (this.thinkCD <= 0) {

  5. this.thinkCD = 1;

  6. // 向量减法,计算方向向量

  7. this.vector = this.player.position.sub(this.node.position);

  8. // 如果距离不在视野半径内(220)

  9. if (this.vector.mag() > 220) {

  10. this.vector = cc.v2(0,0);

  11. }

  12. }

  13. this.walkTo(this.vector, dt);

  14. this.drawLight(this.node.x,this.node.y,200);

  15. },


实际效果如下

O(∩_∩)O~~ 有意思吧!!!

继续故事,小怪在黑夜中失去了视野。

它找不到玩家的位置,只好自己默默的思考,开发自己大脑。 

 渐渐地,小怪可以每秒钟思考两次了。

  1. properties: {

  2. thinkCD : 0.5

  3. },


  4. update (dt) {

  5. // 1 秒 2 次

  6. this.time += dt;

  7. if (this.time >= this.thinkCD) {

  8. this.time = 0;

  9. // 执行一些方法

  10. }

  11. }

等到迷雾散去,小怪的视野恢复了,但是!!! 玩家不知何时竟然造了一堵墙。 

小怪过不去...

 啊!!!!可恶的人类...!

人类在玩家与小怪身上加入刚体和物理碰撞盒子,设置不允许睡眠,重力为0。

 

墙就设置为静态刚体 

人类还强烈提醒,记得开启物理系统。

  1. onLoad () {

  2.    // 开启物理

  3.    cc.director.getPhysicsManager().enabled = true;

  4. }

目前的情况不妙!!!

如何不被墙挡住呢?小怪开始思考!!!如果...我前进不了就向下走呢!尝试值每一次的改变方向都应再次尝试下靠近玩家,看代码:

  1. onLoad () {

  2. // 开启物理

  3. cc.director.getPhysicsManager().enabled = true;

  4. // 间接向量

  5. this.vector = cc.v2(0,0);

  6. // 间接时间变量

  7. this.time = 0;

  8. // 间接位置

  9. this.temp = cc.v2(0,0);

  10. // 尝试次数

  11. this.try = 0;

  12. },


  13. update (dt) {

  14. // 1 秒 2 次

  15. this.time += dt;

  16. if (this.time >= this.thinkCD) {

  17. this.time = 0;

  18. // 向量减法,计算方向向量

  19. this.vector = this.player.position.sub(this.node.position);

  20. // 判断是不是被墙挡住了,与上一次位置比较

  21. if (Math.abs(this.node.x - this.temp.x) < 1) {

  22. // 尝试值

  23. this.try += 1;

  24. // 尝试一次后不通,改变方向

  25. if (this.try >= 2) {

  26. this.try = 0;

  27. this.vector.set (cc.v2(0,-100));

  28. }

  29. }

  30. // 记录新位置

  31. this.temp.set(this.node.position);

  32. }

  33. this.walkTo(this.vector, dt);

  34. },

看下效果,还不错。

如果不想让小怪旋转,禁用刚体旋转。

哇咔咔!!! 玩家看你哪里跑!!!

故事未完待续...

黑暗灯光实现源码,欢迎获取:

链接:https://pan.baidu.com/s/1-iogJucTr0TXKllA__Ah7g 密码:yqb9


感谢 「EEA阔宝」有趣的教程,让学习也变如此乐趣!「奎特尔星球」欢迎大家投稿,有意的朋友可以加我微信,愿我们一起共同成长!


  1. KUOKUO的趣味教程 | 进击的小怪诞生(1)

  2. 大神驾到 |「大掌教」Cocos3D组件详解

  3. Creator MVVM方案—为人生节省时间!

  4. CreatorPrimer 30篇教程汇总

  5. 贝塞尔曲线动作小工具

  6. Creator2.x摄像跟随实现RPG地图

  7. Cocos实现对ETC2的支持

  8. CreatorPrimer|组件编码心得(上)

  9. CreatorPrimer|组件编码心得(中)

  10. CreatorPrimer|组件编码心得(下)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存