游戏开发论坛

 找回密码
 立即注册
搜索
楼主: hexagram

菜鸟弱弱的问一下:求飞行射击中子弹连发代码

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-22 14:39:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

(不是我灌水,没办法,站长的那个Ctrl+Enter不去掉,每次写到一半,我就不小心把帖子发出去了,以前总是删掉,现在懒得删了)

    Public Sub Update() ' 刚才上面我说要注意的函数
       ' 这个函数做什么用?
       '  更新子弹的状态,实现子弹的逻辑
       ' 比如子弹一直往上飞
       If timeDiff >= 0.1 Then ' 每隔0.1秒坐标往上移动10个像素
           Y = Y - 10
       End If
    End Sub   

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-22 15:07:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

这样,大家看看是不是很清晰?游戏编程,尤其是大型游戏编程,我们定义几个变量,用几个结构和数组是不能满足我们的需求的,大家可以慢慢体会,为什么游戏都选择C++?不是说C++比VB快那么简单,是C++从编写游戏的角度来讲要比VB的编写代码少,容易扩展,我之所以费这么大的周折是因为我是从VB过来了的,我用VB工作了3年,写了6年的VB程序,但我希望大家能清楚地看到VB的弱点。

不多说了。下面来说说Timer的问题,Windows的Timer定时器从来都是不准的,而且浪费了大量的系统资源,Timer在操作系统比较稳定的情况下(比如没有什么好资源的程序在运行,其实你的游戏自己就是个好资源的程序)准确性大概是0.05秒的样子,这种误差如果当你的屏幕上的东西多的情况下,我们肉眼就能感觉出来了。

对于游戏这种需要大量频繁精确使用计时器的情况,我们一般不采用事件方式,而是采用轮徇方式,最大限度的利用系统资源。

什么叫轮徇方式?就是不停的去读取系统的时钟看看现在几点了,而不是等系统整点了来通知我们。

这样的话我们需要在VB的启动程序里写一个死循环来轮徇,抢占系统资源,但是又不能让系统死机。VB里有个很好的函数就是DoEvents

假设我们使用Form_Load来启动程序
Private Sub Form_Load()
    ' 初始化其他的

    Me.Show '一定要让窗口先显示出来

    ' 死循环,注意这个死循环后面不能有别的代码
    ' 因为后面的代码永远不可能执行
    Dim tmCurrent As Long
    Dim tmLast1 As Long
    Dim tmLast2 As Long

    tmLast = 0
    Do While True
         tmCurrent = timeGetTime ' 这是个API函数,当然也可以用别的
         If tmCurrent - tmLast1 >= 1000 Then 假设我们要每隔1秒做一件事
              tmLast1  = tmCurrent
         End If

         If tmCurrent - tmLast2 >= 10 Then 假设我们要每隔10毫秒做一件事
             tmLast2  = tmCurrent
         End If

         ' 这里绘制屏幕上的东西,做一些原来Timer 的事情
         
         DoEvents
    Loop
End Sub

12

主题

58

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2005-7-22 16:13:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

happysnoopy
游戏之家

谢谢你们的讨论,论坛的氛围就是这样一步步建立的,继续努力啊。

4

主题

106

帖子

106

积分

注册会员

Rank: 2

积分
106
发表于 2005-7-22 17:18:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

那我也?碇С忠幌掳??然好像什?都不???幼?^^"

53

主题

419

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2005-7-22 18:11:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

感谢bigbook2000提供的建议,我会仔细体会一下的,哈

22

主题

371

帖子

387

积分

中级会员

Rank: 3Rank: 3

积分
387
发表于 2005-7-22 18:30:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

不能想象每发子弹用一段程序……
要修改这样的程序来多发几发子弹太困难了,如果做东方永夜抄的话就要死人了……

本站资源中有一篇《数据结构在游戏中的简单应用》,是用链表来实现子弹的增加减少,C里面有链表和指针真是太好用了,可惜偶是用VB的……现在在想,是不是每种子弹都继承一个子弹类,然后做一个集合放全部的子弹会比较好?或者敌弹一个集合,自弹一个集合

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-7-24 14:35:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

把子弹封装到类,用链表管理所有子弹,包括敌机和自己的子弹,区分方法有两种:一是在子弹类里使用属性来区分,二是用两个链表分别计算;本人推荐后者,VB中执行链表的效率还是颇高的,比读写类的属性快N多

子弹的行动由子弹类自己计算,把子弹的速度封装进类就OK

碰撞计算,所有战机的位置用链表记下(自己的战机位置也记下),把战机位置链表与子弹位置链表AND一下,就求出撞了没;当然,这种撞法很原始,如果你的游戏想见人,参考下网上有关碰撞的文章

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-7-24 14:39:00 | 显示全部楼层

Re: Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

Cipher: Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

本站资源中有一篇《数据结构在游戏中的简单应用》,是用链表来实现子弹的增加减少,C里面有链表和指针真是太好用了,可惜偶是用VB的……


VB写个链表类不就得了,可惜我是用VB6,不然给你源码

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-7-25 07:08:00 | 显示全部楼层

Re:菜鸟弱弱的问一下:求飞行射击中子弹连发代码

都是理论!!谁把VB6的例子放上来我就相信谁, 否则我也会说.
不需要画什么炮弹图,只需要你们做一个按空格键连续有图像发射的小程序, 但必须是完整的.

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-25 11:01:00 | 显示全部楼层

Re: 菜鸟弱弱的问一下:求飞行射击中子弹连发代码

都是理论!!谁把VB6的例子放上来我就相信谁, 否则我也会说.
不需要画什么炮弹图,只需要你们做一个按空格键连续有图像发射的小程序, 但必须是完整的.


不是我老说你,你应该换一下思维,为什么别人说的是理论,是因为你没有实践过,你没有实践过并不代表别人的理论是错误的,并不代表别人也没有实践过。

我给了一个VB.NET的例子,你说不能运行,不能运行是因为你对VB.NET带有排斥心理,学习技术忌讳的是这个。

为什么没有VB6的例子?是因为VB6不适合做这个,游戏中对子弹常用的处理办法确实是使用链表来管理,不仅子弹,大多数动态分配的东西我们都采用链表,不仅包括链表,还有hash表,vector,二叉树,四叉树,八叉树(这不是数数,游戏中真的很常见的)。C++在这方面有得天独厚的优势,C++还有STL来专门处理这些东西。

VB6能实现这些东西吗?能,但扩展起来却非常困难,如果子弹你写一个链表,飞机写一个链表,不仅人力需求大大提高,出错的机会也会越来越大,更重要是VB6对内存的分配和释放是弱操作,对于动态管理的这些对象来讲是非常不利的。

我上面建议的办法是为了VB而临时改变的方式,不得已而为之,要是C++才用不着这么麻烦呢。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 13:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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