WIN95游戏编程疑问?请大家帮忙

SanTa 2000-03-27 05:47:00
加精
使用C编一个win9x类《坦克大战》的游戏。

但是使用过程式编程,程序只能控制一个部队。

如何让程序在同一时间控制多个部队?
也就是说如何使两个以上的函数同时运行?
该用哪些API function?

谢谢!

...全文
657 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tlovexyj 2001-03-01
  • 打赏
  • 举报
回复
看看我的游戏;)

tlovexyj.yeah.net
hproof 2001-02-21
  • 打赏
  • 举报
回复
to Spadger(麻雀):
链表、指向基类的虚基类指针、游戏算法、人工只能、运动线程、绘图线程…你,你,你讲得简直是,,,,,(羡慕死我了),哪里可以找到关于它们的网上学习资料,或者书籍???

另:
本人的一个练习作品分为主机、终端模式。
主机:
各玩家数据区,电脑策略,精灵(人物)储存区等。
主控制即主线程:接受系统消息,网络数据;
精灵动作线程:由于使用虚基类,只需遍历调用一次pObject->OnRun();可以为数组或链表;
玩家代理线程:接受系统定时或网络玩家命令,修改数据,控制精灵,并定时取显示数据发送到终端;
终端:
主线程:系统输入,我用的是对话框,前些时候还问大家怎么接受WM_CHAR消息了;网络连接等,它们将被分派到一个“面板类”中实现(视区,小地图,控制区等都继承于一个MWnd类,呵呵,,,)
绘图线程:用的是directdraw,它可以调用“面板类”中的绘图过程;
一个寒假共写了5000多行,不过没有实现预期的功能,用的是定时器触发绘图、命令设置,只能看到一个工兵走路(惨惨惨),不小心就死机。而且没调试好就被同学不小心删除整个目录了。

另:关于地图编辑,我用一个“母”地图,它划分为不同的区域可以组成任何别的地图类型--我是模拟“星际”的,可以有斜坡,平地,高原。进入编辑模式时,左键选择一种地图号码,右键设置一种类型,显示时根据号码来“贴”出不同的区域部分的地图;整个屏幕分为6*4大小,所以卷屏时有点“眼花”。

我很想学习一些正规的组织、策略、算法,可以告诉一些网址、书籍吗?
我很想学习一些正规的组织、策略、算法,可以告诉一些网址、书籍吗?
我很想学习一些正规的组织、策略、算法,可以告诉一些网址、书籍吗?


又一个想学做游戏的菜鸟


jie80 2001-01-18
  • 打赏
  • 举报
回复
to all:
大家好!我一直想知道RPG游戏中的地图是如何做出来的?
一个想学做游戏的菜鸟
Spadger 2000-04-30
  • 打赏
  • 举报
回复
关于游戏多线程编程。我线去两个例子。第一个就是Microsoft的帝国时代,第一代是他就开了一个线程,所以如果人多时,最先表现的是鼠标有滞后感。所以我觉得游戏要有2-3个线程,一个管显示的,一个管计算的(可在开一个管用户输入的),但有一点线程之间的互斥区做好。否则你的游戏还不如就一个线程呢,还有它在一代时管理好象都不用链表。如果用了。为什么一个兵工厂才能生产一个兵呢?(愚蠢)直到二代才支持可生产多个兵但总人数还有限制。但这也有它的好处,第一如果可有无数兵的话(用户的内存足够的话),就要用到链表,这样生产出一个兵的话,就加一个链表元素,死一个兵时就删除一个元素,但我们要考虑到用户玩游戏可能时间很长,那样的话,链表经常动态分配内存时就会造成内存的碎片话。所以,你要有一套很好的管理内存的API(当然是自己编了,如果你全部信仰Microsoft的话,你的游戏不会有发展的),天子传奇就是个例子,玩一会游戏就会因支付不起内存而崩溃。
还有个多线程的例子就是工人物语了。他好像开了6-7个线程,一个管画面,一个管用户输入,一个管兵的,一个管建造房屋,一个管。。(数不清了),不过我也挺羡慕他们的,这么多线程互斥区这么管理的(太天才了吧)。
关于开多线程的例子,你还可以比较一下法老王(速度不受影响)和凯萨大帝(到后来明显有滞后感)。
我在随口谈谈关于,路径问题。我们游戏中的精灵类中有封装一个路径搜索类(比如:A*算法,即Graph-search算法的扩展)。它生成一个有项树(最短路径算法)。这会对你有很大帮助的。这样每个精灵就都会好好走路了。大多数游戏都用了这个算法。
关于消息的轮换机制。你要优化就行了。比如:我们具法老王这个游戏的例子,(你学过操作系统吧,看看它是怎么轮换线程的),在法老王中,你可以把兵的优先调成最高,农民其次。。。。在如小麦生长动画的优先级调成最低。这样。在消息轮换不过来时(即:你不能保证25帧/秒。实际游戏要比这个值高)。在这种情况下。你还管小麦生长不生长干什么。(玩家不会那么细致吧)。等我们的轮换机制比较悠闲了,在生长一下小麦
不就行了吗???还有用户看不到的,地方就不用那么细致了(他又看不到)。这样,我们的游戏差不多都是很简单的数操作。在加上玩家告速的CPU,我们的游戏想慢还不容易呢
最后,一句话。你最好学学Intel MMX技术,它在处理你游戏的alpha混合时,和图像剪贴,处理,拷贝等等时会快许多倍。(到时候你就要想了。我的游戏怎么让它慢些呢?开玩笑的)
我当时学写游戏时,先狂玩了20多种不同类型的游戏(太贪玩了,有半年多吧),但是我总结了很多经验,上边我也说了一些)。如果你框架打好了。编程就不是问题了。好好干吧。记着你的游戏编出来了,先寄我个demo版什么的。
如果,还有什么问题。我们可以继续探讨。我的游戏还用了一些其他技术。比如:敌人的AI算法。我是看了Basic解释程序后,才编的(不过还是挺弱的),你可多学学脚本语言
还有。。。。我好困。我先睡了。以后见。
(这些只是我的片面之言,但我觉得对大家是有用的,如果你有更好的想法可以和我联系,我们继续探讨。但请不要用语言攻击我。谢谢大家看完我的拙念。)
buding 2000-04-07
  • 打赏
  • 举报
回复
请问BitSote,“在该时间片内,轮询各个事件”,如何轮询用链表还是用事件驱动?若是用事件驱动,哪里有相关的例子谢谢!
SanTa 2000-04-06
  • 打赏
  • 举报
回复
遗忘了一个问题。
我很好奇象《星际争霸》、《红警》等即时战略游戏是采用
bigsoft所提出的轮询方法还是象zjsowin所说的消息机制来实现同步操作,
或是其它别的方法?
SanTa 2000-04-06
  • 打赏
  • 举报
回复
非常感谢bigsoft!
在您如此详尽/幽默的解释下,小弟已明白什么是real time了。 :)
我已使用轮询的方法解决了问题,至少30个移动单位速度不成问题。 如果想要达到上百
个移动单位,就要有一个相当好的算法(可惜我对算法不够了解)。
谢谢buding,我看了bc中的例子,尤其是meteor这个示例,的确是一个使用链表实现轮询的经典,同时让我体会到了算法在程序中的重要性。
zjsowin兄提出的消息机制我还不太了解,因为我一直在使用过程式编程方法,所以轮询的方法比较容易上手。我会在了解消息机制后,偿试使用这种方法解决游戏中的分时操作。
到时还请zjsowin多多指点。

to robin:在图形处理方面,我使用bitblt先获取覆盖前背景位图,然后绘制位图,
恢复背景位图。

BTW:哪里有小GAME 的源码?
zjsowin 2000-04-05
  • 打赏
  • 举报
回复
bigsoft兄的描述比较详细。但是用directx写游戏使用消息机制是不可能的的说法,我有意见。
所谓消息机制,难道就一定指windows的特定消息吗?自己程序里用的消息就不能叫消息?我认为消息与轮询的不同在于传递的参数。有参数的时候,是消息,没参数的时候是轮询。其实,都没什么分别啦,关键是理解这个思想就行了。

对AHO的高见:你总不能让我在这么小的地方写些长篇大论吧,我在这里只是讨论一些想法问题,而不是对某个问题的详细解决,对吧?
ahao 2000-04-04
  • 打赏
  • 举报
回复
zjsowin没做过这样的游戏吧?理解有误啊,问题不是下一步做什么,
而是怎样在屏幕上表示出来。一般来说,游戏规模比较大的话,一秒
刷新20楨就不错了,用一个精灵链表,每次刷新时遍历,先进行一些
必要的判断,再在新的位置画出新的状态,等等...
robin 2000-04-04
  • 打赏
  • 举报
回复
请问,你的game图形是怎么处理的?
zjsowin 2000-04-03
  • 打赏
  • 举报
回复
关于“智能算法”的解释,我认为可以用个小例子可以说明一点问题,错误之处,请多指教。
有个士兵,用Soldier表示,当主程序的控制处理Soldier时,伪代码如下:
case CONTRL_SOLDIRE:
{
// 在此加入智能处理
// 如碰撞检测,并判断是敌人、同伴、敌人的子弹、同伴的子弹,等等
.....
case enemy:
// 选择进攻或逃跑
。。。
case friend:
// ...
case bullet:
if (enemy_bullet)
health --;
....
else if (friend_bullet)
....igonore...
.....

}

然后根据这些动作,在Soldier的类里增加进去。不过编码的复杂度是随着一点的智能处理而工作量成倍增加,各OBJECT的关联和互相影响也会越来越复杂。这都需要在设计时考虑好反复修改,再进行编码的工作。
edwardyi 2000-04-01
  • 打赏
  • 举报
回复
bu tai dong ,dan hen gan xing qu
buding 2000-03-31
  • 打赏
  • 举报
回复
Santa,我建议你先去看一下BC5的几个例子,在bc5\EXAMPLES\OWL\GAMES,有俄罗斯方块,流星(meteor)等,我说的链表就在meteor源程序里。还有我觉得 zjsowin 说的很有道理,不过我还没学过DirectX编程,对“关键看你的智能算法”不大明白,希望zjsowin 能讲得明白点谢谢!
LJN 2000-03-30
  • 打赏
  • 举报
回复
我记得半年前我做过一个类'红警'的游戏.
处理同步用的方法是把坦克从(X,Y)移动到(Xn,Yn)这个长时间的操作转换成(X1,Y1) (X2,Y2)...(Xn,Yn)的短时操作,把大的工作变成若干小工作, 完成一次小工作就把进程控制还给主程序.主程序再触发其他坦克的移动(另一个小工作).由此可以实现让人看起来所有的坦克都同时运行一样.
中心思想也是把它们连成链表, 由于所有的飞机,坦克,军人都派生与同一个基类所以
我并不觉得如果游戏要增加新东西通过修改基类会很难.
zjsowin 2000-03-30
  • 打赏
  • 举报
回复
为什么会挨打呢?我认为你的思维还是停留在过程式的编程模式。由于Windows95是抢先式的多任务机制。假如你控制A到(X,Y)坐标,并不是在A到达此坐标之前,别的东西就不能动,实际上B也会在回应指令。所以,挨不打挨打,关键看你的智能算法,而并非消息驱动机制不行。实际上,只要你参考任何一个directX的游戏代码,都是使用消息机制的。
而对于用遍历链表的方法,我是怀有疑问。就是说每一个游戏元素(object)的结构都必须相同或有继承关系,才能将他们连成链表,才能在遍历中使用公用的算法。而一旦游戏需要增加新的东西,要么就必须受限于原来的数据结构,要么就修改原来的数据结构。这从软件工程的角度看并不合理。
我并不在乎什么分数,实际上分数用来作什么我都不知道。我只对编程有兴趣。如果有什么错误的地方,欢迎讨论。
SanTa 2000-03-30
  • 打赏
  • 举报
回复
先谢谢各位高义的帮助。
我认为采用多线程是不可取的,一旦移动单位多达上百个,就象packager兄说的那样,游戏恐怕根本就无法运行。
但是如果象zjsowin兄提的那样采用消息制,当控制A时,由电脑控制的B就会一动不动的在那里等着挨打。
我觉得最合逻辑的就是buding提的链表,使用一个高效的算法。才有可能解决。希望buding兄能够举一个精简的例子,小弟先行谢过。
总之我的意思就是想编象《星际争霸》中将一个农民A移动到C点(它会向C点的方向前进),然后将农民B也移动到C点,当农民A或B移动的时候,不会互相影响(如果使用过程式编程那么就要先移动A,然后移动,当A或B运行时,另一方就会停下来)。

我是初次编WIN9X程序,所以脑袋里装的都是过程式编程,所以还请各位高手指点。
syz 2000-03-29
  • 打赏
  • 举报
回复
多线程也只是对多个CPU有优势,我觉得ZJSOWIN 说的合适一点。就让你的程序
检测你的指令消息,如果没有你的消息程序运行下个函数。
csdn2000 2000-03-28
  • 打赏
  • 举报
回复
多任务.多线程
zjsowin 2000-03-28
  • 打赏
  • 举报
回复
"也就是说如何使两个以上的函数同时运行?"
我认为这种概念不对,This is impossible.
windows95编程是基于消息驱动的,也就是说,你可以用消息来控制你的游戏。当消息A来时,可以控制A部队;消息B来时,可以控制B部队。是由系统来实现多控制,而不是有你的程序实现。你的思维不要限于过程式编程的思维.就是DOS下的中断编程道理其实也是系统实现多任务。
packager 2000-03-28
  • 打赏
  • 举报
回复
我想你的概念恐怕不大对.让程序在同一时间控制多个部队与是不是用过程结构式编程方法并没有什么关系.如果你企图象上面两个人所说的用多线程的方法来实现对多个部队的控制,那你的程序会慢得无法运行.

加载更多回复(3)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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