Project1

标题: 用弹幕作为视线检测, 错误视范请勿模仿 [打印本页]

作者: ppspssss    时间: 2022-2-14 15:18
标题: 用弹幕作为视线检测, 错误视范请勿模仿
本帖最后由 ppspssss 于 2022-2-18 22:08 编辑

错误视范请勿模仿,仅为楼主一时想出来错的方法还是想试

如真想研究视线检测(我也不知叫什么) 请研究专业的文章

在试之前已预测到效率会特别差, 但还想试一下是差到什么程度 ,


https://www.gameres.com/469173.html之前看到这篇文章,

想到应该可以做成2D游戏视野, 可是不会检测公式, 只能试一下光线从中心点主动发出 数个弹幕, 弹幕撞到墙体就表示墙体可视, 可是效率太差, 一开始以为多个sprite(精灵) 而卡, 随后试了发现弹幕检测在同一时间内移动越多次, 就越卡,并不是因sprite(精灵)多, 作为一个弹幕, 移动一次就得完成一次角度计算和是否碰撞,可是移动次数少的话, 远了就需要很久才达到 ,如果1秒100次,那么时间就差不多很快, 但效率极大的下降,即使RGD 都降到40帧 , 就不试RGU了, 如果一个这么差的效率RGU也不能足够使用 @张咚咚  
不供参考
(图片仅其中一部分,  极可能有错请勿参考)

图2 (图片仅其中一部分,  极可能有错请勿参考)

效果图 : RGD实际40FPS  RGSS3 20FPS


================2022/2/18
经过@SailCat 提点, 使用  两点间距离公式  两点间角度公式 组合使用可推导出 方块与目标(自己)的坐标的距离及角度 ,两点间角度公式 需使用孤度制转角度制, 另求出值后需再判断处理下在第三,第四象限的情况 (見if b < 0 and b != 180)
不过这是近似接近文中提到的第一种视线检测,  文中提到的第二种三角形就完全不会


(图片仅其中一部分,  极可能有错请勿参考)
此时bitmap較為多和大小比較大, 因此測出RGD 60幀(最高), RGSS3 只有10FPS

作者: 任小雪    时间: 2022-2-14 15:35
牛逼牛皮
作者: 张咚咚    时间: 2022-2-14 18:20
RGD提升的也只是你的图形速度,ruby版本都一样算法该慢还是慢。
我感觉你需要好好想象有哪些优化方案,或着你可以参考一下我之前发的Jump里面的一个分块刷新,角色(子弹)在哪个块里面就刷新哪个块里的物体。
更多能减少计算量的优化方案就要靠你的小脑袋瓜去好好想想了(
最简单暴力的就是换引擎,感觉U3D比较适合你(
作者: Admenri    时间: 2022-2-14 18:24
冷知识:RGD与原版RGSS3都是用的同一ruby解释器,均来自RGSS301.dll
所以两者帧数差异其实是绘图导致的,
至于RGU,由于使用的是官方版本的ruby3.0,虽然兼容性差些,但官方称速度上会有很大提升:

且RGU在Bitmap操作方面也使用GPU硬件加速(即使用纹理与shader处理位图
(所以RGD的性能可能依旧受老版本ruby牵制)
(菜鸟一枚大佬勿喷)
作者: SailCat    时间: 2022-2-14 18:32
几何公式不是问题,Math.hypot,x方向cos,y方向sin就行了

作者: RPGzh500223    时间: 2022-2-15 13:14
本帖最后由 RPGzh500223 于 2022-2-15 13:24 编辑

如果墙体都是这么一整格的话,可以用类似RMVA的地图ID,判断“子弹精灵”所处位置的地图ID是否为墙体

代码的话有个问题,最好不要在数组遍历中改变数组长度,数组元素错位……
当然判断元素是否为nil也行,但是数组越大,就同样会执行更多次的判断与循环
我一般处理精灵数组的话,是再遍历一遍;RMXP中人物状态中的操作,是先拷个副本,遍历副本操作数组本身。
sprites_array.each {|i| i.dispose if #判断}
sprites_array.delete_if{|i| i.disposed?}

作者: ppspssss    时间: 2022-2-18 21:56
张咚咚 发表于 2022-2-14 18:20
RGD提升的也只是你的图形速度,ruby版本都一样算法该慢还是慢。
我感觉你需要好好想象有哪些优化方案,或着 ...

我的重点是我的该想法完全错误, 不该用弹幕作视线检测 , 主要是之前想到AI是怎样看到玩家者障碍而展开研究, 会不会是从眼睛里发射多个检测弹幕而检测到玩家或者障碍,

你之前提到的分块刷新, 我看了一下, 大慨我理解是分成大的碰撞盒,里再分成小碰撞盒, 之前我就想过若太多包围盒不就弹幕要和地图所有的碰撞体进行判断那就不行, 这个分块应该可以再分小些? 若地图为100X100, 10000个小碰撞盒, 若2^10=1024 (划分后再划后再划分), 原来1万次判断应该变成仅用10次判断, 不过这只是我想, 我觉得50X50的地图已经算很大了,

至于unity 我看了B站教程是有弹幕系统碰撞, 不过我只会Ruby, 留在Ruby学习,试了才知道你的条条丝丝优化是好的, 不过也知道了就不应该用来做弹幕游戏的




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1