让我死了很多脑细胞的问题

clchenle317 2006-02-04 10:05:45
编写飞机飞行的仿真程序,每隔一定的时间出现飞机的运行轨迹。
求思路;
比如一架飞机起飞后,用TIMER控件控制每隔一秒,读取数据库中的经维度坐标。在飞行过程中,又产生一架新飞机,要读取他的轨迹坐标,问如何使他们同时在屏幕中显示?在线等啊
每架飞机用一个TIMER控件好象不现实,用多线程好象也不行,
如果把每架飞机轨迹坐标放在一张表里,我又不知道可不可行,又怎么读取?
请大家帮帮我!!
...全文
200 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyl910 2006-02-05
  • 打赏
  • 举报
回复
//如果那样的话,我还是要CPlane.cls的Move中用到TIMER,飞机产生的时间是随机的.有的两架飞机会间隔很久的


为Move加个CurTime参数就行了,在Timer事件中将当前时间传过去

等飞机产生的时候向m_Planes添加一个新对象
等飞机消失后再把它从m_Planes中删除
clchenle317 2006-02-05
  • 打赏
  • 举报
回复
如果那样的话,我还是要CPlane.cls的Move中用到TIMER,飞机产生的时间是随机的.有的两架飞机会间隔很久的
zyl910 2006-02-05
  • 打赏
  • 举报
回复
在CPlane.cls的Move中从表中得到当前位置
clchenle317 2006-02-05
  • 打赏
  • 举报
回复
我的飞机的轨迹坐标是事先就存储在不同的表中的,移动时,我是用TIMER事件每隔两秒中触发一次的,牵涉到很多表的问题,问问大家有没有好的方法????
zyl910 2006-02-04
  • 打赏
  • 举报
回复
大概是这样写:


CPlane.cls
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
Private m_CurX As Single, m_CurY As Single

Public Property Get CurX() As Single
CurX = m_CurX
End Property

Public Property Get CurY() As Single
CurY = m_CurY
End Property

'计算当前坐标
Public Sub Move()
'在这里写轨迹计算代码,并将当前位置赋给m_CurX、m_CurY
'……
End Sub




frmMain.frm
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
'存储当前的所有飞机
Private m_Planes() As CPlane

'绘制飞机
Private Sub DrawPlane(oPlane As CPlane)
'根据oPlane的CurX、CurY属性在Picture1上画
'……
End Sub

Private Sub Form_Load()

End Sub

Private Sub Timer1_Timer()
Dim oPlane As CPlane

'清屏(注意Picture1.AutoRedraw应设为True)
Picture1.Cls

'绘制所有飞机
For Each oPlane In m_Planes
'计算当前坐标
Call oPlane.Move
'绘制飞机
Call DrawPlane(oPlane)
Next oPlane

'更新图像
Picture1.Refresh

End Sub
zyl910 2006-02-04
  • 打赏
  • 举报
回复
//用TIMER来枚举,这样的话是不是每次只有一架飞机在动啊

枚举数组啊
这样得到每架飞机的当前坐标
再一起画出来
clchenle317 2006-02-04
  • 打赏
  • 举报
回复
用TIMER来枚举,这样的话是不是每次只有一架飞机在动啊
zyl910 2006-02-04
  • 打赏
  • 举报
回复
这个还算简单:
先建一个类模块来封装单架飞机的操作
在主窗体中放一个数组,用于存放当前的所有飞机
在Timer事件中枚举该数组,依次处理每架飞机并显示




现在明白视屏游戏有多么难写了吧
有N多对象在地图上运动
而且还速率不同
zyl910 2006-02-04
  • 打赏
  • 举报
回复
//一方面因为延时造成飞行画面出现抖动
将PictureBox的AutoRedraw设为True,使用双缓冲就不会抖动了


//另一方面VB6为了排斥多线程,采取了消息冻结机制(Blocking)。
编译成exe后Timer就不会冻结了
lyserver 2006-02-04
  • 打赏
  • 举报
回复
我觉得尽量不用Timer控件,一方面因为延时造成飞行画面出现抖动,另一方面VB6为了排斥多线程,采取了消息冻结机制(Blocking)。但你可以用多线程,结合WaitForSingleObject或WaitForMultiObject之类的函数,在自定义的时间事件中处理飞行画面。如果有两架以上的飞机,飞行轨迹参数最好分别存在不同的数据表中,以避免再处理多线程中数据表的锁定和解锁问题。
zyl910 2006-02-04
  • 打赏
  • 举报
回复
人眼的时间分辨率是1/25秒
只要你在1/25秒内画好图形
人眼就看不出来了
province_ 2006-02-04
  • 打赏
  • 举报
回复
用TIMER来枚举,这样的话是不是每次只有一架飞机在动啊

是,因为单CPU情况下确实是这样的;但你的眼睛会告诉你不是,因为间隔的时间很短。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧