设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2838|回复: 8
打印 上一主题 下一主题

[讨论] 用弹幕作为视线检测, 错误视范请勿模仿

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14624
在线时间
2152 小时
注册时间
2016-9-20
帖子
861
跳转到指定楼层
1
发表于 2022-2-14 15:18:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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
我发的贴子大多未经整理是草稿抱歉

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
2
发表于 2022-2-14 15:35:46 | 只看该作者
牛逼牛皮
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19468
在线时间
3108 小时
注册时间
2013-1-11
帖子
1292
3
发表于 2022-2-14 18:20:31 | 只看该作者
RGD提升的也只是你的图形速度,ruby版本都一样算法该慢还是慢。
我感觉你需要好好想象有哪些优化方案,或着你可以参考一下我之前发的Jump里面的一个分块刷新,角色(子弹)在哪个块里面就刷新哪个块里的物体。
更多能减少计算量的优化方案就要靠你的小脑袋瓜去好好想想了(
最简单暴力的就是换引擎,感觉U3D比较适合你(
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
5
星屑
3477
在线时间
600 小时
注册时间
2021-6-10
帖子
46
4
发表于 2022-2-14 18:24:27 | 只看该作者
冷知识:RGD与原版RGSS3都是用的同一ruby解释器,均来自RGSS301.dll
所以两者帧数差异其实是绘图导致的,
至于RGU,由于使用的是官方版本的ruby3.0,虽然兼容性差些,但官方称速度上会有很大提升:

且RGU在Bitmap操作方面也使用GPU硬件加速(即使用纹理与shader处理位图
(所以RGD的性能可能依旧受老版本ruby牵制)
(菜鸟一枚大佬勿喷)

点评

RGU激活了JIT吗  发表于 2022-2-14 20:08
基于OpenGL SDL2的RGU(已重制开源)
EMAIL: [email protected]
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

5
发表于 2022-2-14 18:32:06 | 只看该作者
几何公式不是问题,Math.hypot,x方向cos,y方向sin就行了

点评

这么一提点, 从hypot两点间距离的公式 , 求出最短距离的墙块, 知道了原点和墙的远近, 应该就求出第一种(360度射线)解法, 第二种三角形方法就想不到  发表于 2022-2-15 21:26
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
帖子
234
6
发表于 2022-2-15 13:14:44 | 只看该作者
本帖最后由 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?}
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14624
在线时间
2152 小时
注册时间
2016-9-20
帖子
861
7
 楼主| 发表于 2022-2-18 21:56:38 | 只看该作者
张咚咚 发表于 2022-2-14 18:20
RGD提升的也只是你的图形速度,ruby版本都一样算法该慢还是慢。
我感觉你需要好好想象有哪些优化方案,或着 ...

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

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

至于unity 我看了B站教程是有弹幕系统碰撞, 不过我只会Ruby, 留在Ruby学习,试了才知道你的条条丝丝优化是好的, 不过也知道了就不应该用来做弹幕游戏的
我发的贴子大多未经整理是草稿抱歉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 17:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表