广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 3059 个阅读者
04:00 ~ 4:30 资料库备份中,需等较久的时间,请耐心等候
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
天之心
数位造型
个人文章 个人相簿 个人日记 个人地图
路人甲
级别: 路人甲 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[Basic][求助] 请问要如何做VB2008物件碰撞行为?
又来麻烦各位大大了.看了VB2008的书上的说明还是有些不明白.
..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



献花 x0 回到顶端 [楼 主] From:台湾中华电信股份有限公司 | Posted:2011-07-19 22:20 |
ebolaman 手机 会员卡
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖

级别: 副版主 该用户目前不上站
版区: 程式设计
推文 x38 鲜花 x458
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

这只是我的构想而已 (请参考):



将程序分成几部份,每部分做自己的事,极度模组化:

(1) 建构模组 (读取模组的边缘线,将部分合成集团,然后用一些曲线去修正边缘)
(2) 模组绘图
(3) 移动模组
(4) 判断碰撞
(5) 物体碰撞行为 (能量损失、转矩、压缩量、判断精准碰撞时间点、判断反弹)

因为现在只讨论 "判断碰撞",所以第五项不考虑



模组 (Model) ,就是构成物体的一整个东西

而模组的边缘,可以用 函数式来表示 (例如半椭圆  f(x)=Sqrt(1-(x/3)^2) )


另外一个部分负责 移动模组,那肯定没问题,而判断 "何时会碰撞" 会比较困难

正确地来说,应该是要在程式运行中判断 "已经碰撞了吗?"


因此,要算数学了

不管是什么函数,判断何时有交集最简单的方法就是 "解联立"

所以只要一条一条线去互相检查 "当联立的解不是无解的时候",就是碰撞发生了




可以下载两个程式,有助于了解

Physion 与 SpeQ Mathematics

SpeQ 是一款数学+图表的软体



以上的表达式:

复制程式
f1(x)=Sqrt(1-(x/3)^2)
f2(x)=-Sqrt(1-(x/3)^2)
col(x)=-x*3+6
Plot(f1(x))
Plot(f2(x))
Plot(col(x))


Physion 是一款模拟物理性质的软体,可以看看这个来构想








所以实作部分,推荐用线段组成一个正方形,设定四条线是联合的

加上一个阵列设定每条线初始的运动方向


然后一个 Timer 中规中矩的按照 阵列每个项目的内容去让 线段移动 (由于四条线组成正方形,因此移动起来还是正方形)

Timer 最后还要加上 判断碰撞 的函数

而这个函数,即是检查 四条线与另外一条线 (当作墙壁,被撞的物体的一条线) 的联立方程式是否有解


有解的话还要特别注意

如果物体还会加速,不规则碰撞,运动等 (如果是 传统贪吃蛇 等速、矩形介面 就不用考虑这点)

因为 Timer 的检查时间不能太短,在庞大的 2D 绘图软体中,如果这样检查会浪费效能 (P.S. 可以检查 X, Y 的值,是先检查是否有可能交集,有可能再来进入 函数重点部分,例如 一条线 X= 1~3 另外的一条线 X=5~8 这样就不可能会碰撞)

当有解的时候,通常物体都已经与被碰撞的物体交集有一段时间,所以可以在函数加上 +t 这样,在已知的会碰撞的时间范围内,来去解联立

就能得出正确的碰撞时间与位置



就这样判断完成,然后把物体隐藏,或放出 爆炸、粉碎一些 Sprites 特效

其他的就交给绘图的模组吧


My BOINC stats :

献花 x0 回到顶端 [1 楼] From:台湾宽频通讯顾问股份有限公司 | Posted:2011-07-20 15:57 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.021987 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言