游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12254|回复: 25

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

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-7-21 15:18:00 | 显示全部楼层 |阅读模式
[em24] [em24] [em24]
请大大们指教!

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-7-21 17:02:00 | 显示全部楼层

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

我以前的游戏里没做过连发,但我可以告诉你方法,我不是用数组的,首先你要很熟悉做发一个子弹的程序? 我的方法比较麻烦,你可以参考。
假设向上发射子弹

第一发子弹的坐标A1,B1
第二发子弹的坐标A2,B2
F=0           这个F是代表你要发几发子弹。
S=2          S是子弹飞的速度
IF  按下空格键  THEN   F=F+1 :  调用发但发子弹的子程序

IF F=1
发射第1子弹的程序
B1=B1-S
BITBLT A1,B1        画子弹
END IF

IF F=2
发射第2子弹的程序
B2=B2-S
BITBLT A2,B2        画子弹
END IF

IF F=2 THEN F=0     '如果F是3那就是3发子弹,与此类推,但我的程序是每一发子弹都由一段程序组成,如果你单发都处理不好的话,多发就很难,因为子弹移动的时候你自己和敌人也在移动,要互相调用......

实际应用的时候,发射前 A1=X:B1=Y
X,Y是你飞机的坐标,我这种方法的缺点是发射越多越占电脑速度和资源。

53

主题

419

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2005-7-21 19:43:00 | 显示全部楼层

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

晕倒,不敢苟同楼上的方法
如果程序中每一个NPC每一发子弹都有一个处理程序段,真是不敢想象的事情,汗~~

我认为所有子弹都应该统一处理,把坐标移动、接触判断、杀伤计算等等放在一个程序段中。首先要有一个子弹数组(为什么用数组?方便楼,想要多少子弹就多少,方便修和处理)

程序段循环中对所有 存在=1 的子弹,进行处理,先是坐标变化,然后上判断子弹消失与否或者碰到什么东西,如果有接触发生,根据每一颗子弹ID属性判断是否杀伤对方,碰到东西后这颗子弹 存在=0

这种方法实现几百颗子弹满屏乱飞是不成问题的,小KISS

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-7-21 20:13:00 | 显示全部楼层

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

楼上的朋友,我可没说敌人的子弹不是用数组的,我现在说我自己的飞机发射的子弹,
我1940里的BOSS一次发的10个弹就是用数组做的,因为敌人飞机的子弹是没规律的,、
好做的很。
但自己飞机的子弹连发用数组不好设计,你能不能做个你自己的程序上来给我们看看,不需要飞机,只需要设计一个按下空格键有一图像向上发,按两下就两发......有理论是没用的,
就是因为我用数组做不好才用的几段程序,我的潜艇2005游戏是可以发两个弹的,但用了两个程序段处理。

53

主题

419

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2005-7-21 20:59:00 | 显示全部楼层

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

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

楼上的朋友,..但自己飞机的子弹连发用数组不好设计,你能不能做个你自己的程序上来给我们看看,不需要飞机,只需要设计一个按下空格键有一图像向上发,按两下就两发......有理论是没用的,


我是TANK2005的作者SZK8888,虽然是学C的,来VB办块是来学习的,以前也写过QB。对BASIC还是很有感情的。。。

编程语言是两样的,但我觉得编程思想和理念是一样的,来这里学习大家的 游戏创意和实现方法 ,顺便下下好游戏回去,呵呵

我是用数组实现的,炮弹360度不限制角度的飞行,ID判断友方还是敌方,接触用矩形判断,射速和继续发射时间可调节,数量任意多。所有子弹数据存在一个结构数组中,用一个程序段统一处理。哈,多多指教

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-7-21 21:05:00 | 显示全部楼层

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

但楼主是要VB的程序。
哈哈!TANK2005我听说过,可能还玩过呢,我手上有好几个坦克游戏,你的主页在哪里?

53

主题

419

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2005-7-21 21:14:00 | 显示全部楼层

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

我的许多程序都是参考VB、JAVA的,代码和函数不同,我主要看中变成思想和实现步骤,只要有方法,实现不难的,编程无语言障碍,只有思想上有

我没有主页,懒的建立。只有作品放在这个网站上
http://download.gameres.com/production/tank2005/tank2005.rar

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-7-21 21:24:00 | 显示全部楼层

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

已经下载,做的很棒呀! 即时战略游戏? 向你学习,又遇到一高人。
你说你参考VB? 哈哈!我手上基本没什么可以参考的游戏,有也很多也看不太懂,可能自己受DOS的洗脑太深了,目前正在努力学习VB6技术。
你做了个这么好的坦克,我的坦克都不知道怎么做下去,我本来也要叫坦克2005的,现在改名叫小坦克2005吧!

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2005-7-21 21:34:00 | 显示全部楼层

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

多谢楼上各位。我会试一下的

89

主题

822

帖子

847

积分

高级会员

Rank: 4

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

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

我用VB.NET做的例子中有关于子弹的代码,可以参考

我发现了一个问题就是你们写游戏是建立在这么一个概念上,就是你们觉得我写一个绘制子弹的函数,然后调用一下,那么子弹就绘制出来了,这一做法有没有错误呢,没有,但是这种观念有没有问题呢,有。

我们把子弹看作一个对象,屏幕上有很多子弹对象,也可能一个也没有。VB里面我们把很多很多子弹对象叫做一个集合。

其实我们在游戏的绘图函数中是循环绘制的,也就是说每隔一段时间就重新绘制一下屏幕上的东西,我看你们常常用到Timer(暂且不说这个有没有问题)。

Private Sub Timer1_Timer()
    For Each bulletObj In bulletCollection'遍历子弹集合
        bulletObj.Draw '绘制子弹
    Next
End Sub

这样大家看,子弹的绘制就解决了,不管有多少子弹或者没有子弹都行,我们现在所要解决的就是发射子弹怎么办?比如按一下空格键,很简单,按一下空格键我们往bulletCollection集合里Add一个新的子弹对象就可以了,这样的话子弹不是越来越多吗?那我们就要判断子弹是不是飞出屏幕或者碰到飞机爆炸了,如果飞出屏幕或者爆炸了,那么我们就把子弹从bulletCollection集合里Remove掉

Private Sub SendBullet() ' 发射子弹的函数
    bulletCollection.Add newBulletObj
End Sub

把Timer函数改一下
Private Sub Timer1_Timer()
    For Each bulletObj In bulletCollection'遍历子弹集合
        If bulletObj.IsBomb Then ' 检测碰撞,子弹是不是撞倒飞机了
            bulletCollection.Remove bulletObj ' 移出子弹
        ElseIf bulletObj.IsOut Then '子弹飞出去了的判断函数
            bulletCollection.Remove bulletObj ' 移出子弹
        Else
            bulletObj.Draw '绘制子弹
        End If
    Next
End Sub

这样一个发射子弹的功能就完成了,但就像我说的,VB的集合函数Remove将对象从集合中移出,并不能释放内存,这样随着子弹的增多,内存消耗越来越大,这个就不是很好了,那么我们就用一个数组来代替集合,我们可以计算一下,比如,发射子弹的间隔时间是0.3秒,1秒钟按4发计算,子弹的移动速度是1秒100像素,那么子弹从800*600屏幕底部移动到顶部需要6秒钟,6秒钟内最多有24发子弹,也就是说我们只要定义一个长度为24的数组就可以了,为了保险,我们就定义成30个

那上面的函数就要重新写了

Private Sub SendBullet() ' 发射子弹的函数
    Dim i As Integer
    For i = 0 To 29
        If bulletArray(i).IsRemoved = False Then ' 找一个被移出了子弹
            bulletArray(i).Init ' 初始化一个新的子弹
            bulletArray(i).IsRemoved = True
            Exit For  
        End If
    Next i
End Sub

把Timer函数改一下
Private Sub Timer1_Timer()
    Dim i As Integer
    For i = 0 To 29
        If bulletArray(i).IsRemoved = True Then ' 有效的子弹
            If bulletArray(i).IsBomb Then ' 检测碰撞
                bulletArray(i).IsRemoved = False
            ElseIf bulletObj.IsOut Then '子弹飞出去了的判断函数   
                bulletArray(i).IsRemoved = False
            Else
                bulletArray(i).Update ' 注意我在这里加了一个函数
                bulletArray(i).Draw '绘制子弹
            End If
        End If
    Next i
End Sub

这样一个子弹框架就做好了,不管是什么样的子弹,不管子弹如何飞,我们只要改变子弹对象就好了,而不需要去改变这个框架,即使不是子弹是别的什么东西,比如导弹,也可以用这个框架,我们所要做的,就是实现一个子弹对象,下面我们来看看如何实现子弹对象,VB6中虽然没有继承,但是勉强也可以用。如果有继承完全可以从飞机对象继承,其实子弹不就是一个飞机吗?没办法VB6里我们只好重写一边(Copy也很快的,只不过飞机对象改了,子弹对象要重新Copy,别以为Copy可以替代继承)

Class CBullet
    Public IsRemoved As Boolean ' 子弹是不是被移出了
    Public X As Integer  ' 子弹坐标
    Public Y As Integer

    ' 子弹对象的函数,我们上面用到的
    Public Sub Init() ' 初始化一个子弹对象,就是子弹的初始位置等等
    End Sub

    Public Sub IsOut() ' 子弹是不是飞出去了
    End Sub

    Public Sub IsBomb() ' 子弹是不是爆炸了
    End Sub

    Public Sub Draw() ' 绘制子弹
        ' 这里我也用一下Blt函数意思一下,不管是d3d,ddraw,API都行
        BitBlt hdc1, X, Y, w, h, hdc2, 0, 0, flag
    End Sub

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

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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