QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 708|回复: 14

一个想法……

[复制链接]
发表于 2003-12-29 22:23:03 | 显示全部楼层 |阅读模式
以前我们讨论过网络游戏的设计,现在看来当时的起点太高,很不切合实际。
现在有个想法。
不知道各位在用Linux的时候有没有玩过发行版自带的小游戏。在RedHat8.0中,有个小游戏,名字记不得了,它是一个2D游戏,在画面中央有个星球,周围有两个“卫星”,卫星可以发射子弹,可以使用喷射引擎运动,但是有惯性,且星球对子弹和卫星都有引力作用。我玩过几次后发现这个游戏的可玩性很好。于是想到:
以此游戏设计为基础,再发展一下:
1。基于网络的多人游戏(原来只支持同一个机器上两个玩家)
2。扩大游戏世界。原来只是一个固定大小的很小的区域,我觉得可以扩展得更大一点,并且可以加入多个引力源,以及多种物品、“建筑”、背景之类的。
3。扩展游戏内容。原来只是两个玩家间发射子弹打来打去;我觉得可以增加一些“建筑”,可以给飞船提供补给、改造等,还可以做成掩体和迷宫等。
4。提供多人配合机制。因为太空中的飞行比较难控制,特别在有个多个引力源之后会更难,这种情况下还要兼顾攻击等任务,一个玩家往往做不来,所以可以考虑让两个甚至更多的玩家来控制同一艘飞船,各人负责不同的任务。比如有的人负责飞行,有的负责炮塔等。
我想这个游戏实现起来会简单得多。
不知各位有什么想法或看法?
发表于 2003-12-30 11:57:50 | 显示全部楼层
支持,我顶:)

就是感觉玩那游戏有点头晕,不知飞到哪里了。不过版主后面就的功能还可以,建议具体实现一下。

要做就要做好,别扩大战线--先作简单的:)
回复

使用道具 举报

发表于 2003-12-30 18:54:20 | 显示全部楼层
我想最好先实现 1  ,剩下的可以用升级版本来实现!
回复

使用道具 举报

发表于 2003-12-30 19:36:14 | 显示全部楼层
现在的网络游戏比做什么都赚钱啊!努力中~~~
回复

使用道具 举报

发表于 2004-1-1 16:02:05 | 显示全部楼层
这个……能不能放弃游戏……我都N长时间不玩游戏了……
回复

使用道具 举报

 楼主| 发表于 2004-1-1 20:04:41 | 显示全部楼层
游戏和程序有什么区别吗?
回复

使用道具 举报

发表于 2004-1-1 20:39:42 | 显示全部楼层
支持!

不过希望  快点开始
回复

使用道具 举报

发表于 2004-1-1 21:39:56 | 显示全部楼层
支持,我从放假开始 就有时间了,回校后,也可以上网了,期待。。。。
回复

使用道具 举报

发表于 2004-1-1 23:15:35 | 显示全部楼层
[quote:f3a622ffff="sjinny"]游戏和程序有什么区别吗? [/quote]嗯……没什么区别,不过如果搞游戏,那么很大一部分经历要放在美工上,而美工方面……
回复

使用道具 举报

发表于 2004-1-2 08:08:34 | 显示全部楼层
[quote:5050f50ce8="sjinny"]游戏和程序有什么区别吗? [/quote]
游戏还要有情节
回复

使用道具 举报

 楼主| 发表于 2004-1-2 13:16:37 | 显示全部楼层
为了开始开发,我正在思考应该怎样理解“时间”和“空间”,应该怎样在游戏中体现它们。
因为这个游戏中对运动和受力的模拟的真实度得比较高,加速度、合外力的作用等都得真实体现,所以得有一个好的办法来实现“空间”和“时间”这两个概念。

我希望能做到这样:
为所有可以移动的物体定义一个类,类的实例中保存以下数据:
物体的当前位置、速度(矢量)、加速度(矢量)、空间姿态(一个法向量)。

这样的话,就遇到了问题:
在服务器端总要管理这些对象呀,那么使用什么样的数据结构来管理它们呢?
一个链表?那最“方便”,因为物体移动时只需要更新它的坐标并把这个变化告诉客户端就行了;但是应该告诉哪些客户端呢?告诉所有的客户端?对一个客户端来说,太过遥远地方的情况是没必要知道的。那么就想:可以按照空间来管理客户端:
比如使用四叉树(因为这里讨论的是2D游戏),但是这种“n叉树”一般只适用于管理那些静止的东东,这里客户端的飞船都是在到处跑的,所以会很麻烦。那么退一步,按照“场景”这个概念来管理吧?那么就是一个飞船的坐标变化只通知和它在同一个场景的客户端,而在这个客户端内的所有可移动对象都在同一个链表中,当它们哪个移动出了这个场景就把那个对象移到相应场景的链表中。恩,这个方法似乎很不错,但是有个问题:宇宙中的空间是相连的,一般不会有重山峻岭或者城们之类把宇宙空间分割成一块一块的区域,那么当一艘飞船飞到了一个场景的边缘时会怎样呢?因为它不在相临的那个场景的链表里,所以它的信息隔壁场景里的客户端收不到,同样隔壁场景的飞船的信息它也收不到,只有当它真正移入那个场景后才能接收那个场景的信息,反映在游戏画面上就是:我的飞船从一个场景边缘飞向另一个场景,当我接近场景边界时看见那个场景中空空如也,当我越过边界时面前突然出现一群飞船,主炮跑口都对着我……恩,打伏击是不错,但是对于游戏来说这种不真实性也太不真实了,不真实到不公平的程度了,这样可不行~那么便想到,可不可以当一个飞船接近场景边界时,告诉它相临场景中的一些信息呢?我最先想到的就是把接近场景边界的飞船对象同时放进两个场景的链表,不,这似乎不可能,恩,应该这样:它在哪个场景就放在哪个链表里,但是此时在另一个场景中要在一个临时链表中增加一个“代理对象”(或称“引用对象”),这个对象并不是真正的一个可移动物体,它其实只是一个指针,这个指针指向相临场景中边界附近的一个可移动物体,当自己所在场景中有什么消息时就会遍历这个临时链表把消息通知给那些在场景边界附近的对象;这样,当我的飞船即将穿越场景边界时就不用提心吊胆了,但是还有问题,当我在场景边界附近时,我可以知道相临场景中的情况,当时相临场景中的其他飞船却不知道我的飞船接近了,那么就得给飞船对象里增加一个链表,这个链表里都是一些“代理对象”,这些代理对象指向了和我相临的那些场景,这样当我的飞船有什么消息时就会遍历这个链表来通知那些相临场景,这些场景再把通知转发给场景内的对象。这样就明确了:

可移动物体的数据成员:
物体的当前位置、速度(矢量)、加速度(矢量)、空间姿态(一个法向量);
<指针> 应该收到我的信息的那些场景(的“代理对象”)所构成的链表(为了简化设计,我把自己所在的场景也放进这个链表里)。

场景对象的数据成员:
<指针> 应该收到这个场景信息的那些对象(的“代理对象”)所构成的链表(同样为了简化,我把场景中的对象和“场景附近”的对象一起放进来了);
<指针数组> 一个数组,里面每个元素都是一个指针,指向和这个场景相临的一个场景对象;数组元素个数取决于场景的“形状”(这个形状当然是由我们自己来规定的,一般是正方形或矩形)。


呼~~~~~~~~~~~~
原来只是想发个贴以显示自己的“存在”的    ,没想到“渐入佳境”就做了点设计,嘿嘿~~
回复

使用道具 举报

 楼主| 发表于 2004-1-2 13:17:55 | 显示全部楼层
呵呵,上面初步解决了“空间”这个概念的实现,下面就是“时间”的问题了,这个很重要因为会涉及到“运动”这个概念~~
回复

使用道具 举报

发表于 2004-1-3 21:28:03 | 显示全部楼层
我觉得一个物体应该拥有的属性是:
1 当前位置
2 物体质量
3 当前速度
4 姿态
5 加速度
至于加速度,我觉得应该是通过一个方法实现的。
这个方法即:
需要有一个参数指定物体受力大小(一个数值),一个参数指定受力方向(一个长度为1的向量,通过向量坐标表示)。方法实现的功能是:根据手里大小,方向改变加速度和姿态,进而根据加速度的改变来改变当前速度。
回复

使用道具 举报

 楼主| 发表于 2004-1-4 19:26:30 | 显示全部楼层
恩,后来我一想,也发现还少了质量。
现在把我后来的想法写出来:
对于整个游戏世界,从整体上说使用四叉树来管理,局部上,一般是某个游戏场景(甚至是场景中的某个区域)使用链表来管理这个场景(或区域)中的所有“物体”。
对于一个“物体”,它有以下成员变量:
质量(标量)
姿态(矢量:(x,y,z)其中x、y、z表示以x、y、z三个坐标轴为旋转轴的旋转弧度数;当然,在2D游戏中只有其中的一个量。)
位置(使用相对于自身所在场景(或区域)的坐标系的坐标;对于2D游戏只有x、y两个值。)
速度(矢量,使用(x,y,z)分别表示速度在x轴、y轴、z轴三个方向上的分量;对于2D游戏只有x、y两个分量。)
加速度(矢量,使用(x,y,z)分别表示速度在x轴、y轴、z轴三个方向上的分量;对于2D游戏只有x、y两个分量。)
所受合外力(矢量,使用(x,y,z)分别表示速度在x轴、y轴、z轴三个方向上的分量;对于2D游戏只有x、y两个分量。)
以上成员变量一般都只能用成员函数来进行读取和修改。且正常游戏中,只会直接修改姿态和合外力这两个变量。
对于一个物体,每隔一定的时间(在此以t来表示),就会按一定的顺序更新它的状态信息(成员变量),每次更新的过程是:
根据t和速度,更新位置,
根据t和加速度,更新速度,
根据质量和合外力,更新加速度。
注意这些操作是按照从上到下的顺序执行的,每次到了更新的时候就对每个物体做一遍上述操作。
通过修改物体所受合外力来改变物体状态,对于飞船,其姿态决定了它的喷射引擎所产生的推力的方向。
另外,对于物体对象,还有有一个成员函数,使用这个函数可以处理物体受到某个冲量时的情况。
冲量也是矢量,使用(x,y,z)分别表示速度在x轴、y轴、z轴三个方向上的分量;对于2D游戏只有x、y两个分量。
如果要给物体累加一个冲量,那么因为有以下公式:
I=mV2 - mV1
(其中V1是物体原来的速度,V2是物体受到冲量后的速度)
所以对物体分别在x轴、y轴、z轴三个方向上进行操作:
Vx=Vx + Ix/m
Vy=Vy + Iy/m
Vz=Vz + Iz/m
以上没有涉及碰撞检测的问题,下面说说我的思路:
合外力 -> 加速度 -> 速度 -> 位置 -> 碰撞检测 -> 如果发生碰撞就改变合外力 -> 改变加速度 -> ……
以上“->”表示左边的东东引起、影响或改变了右边的东东。
回复

使用道具 举报

发表于 2004-1-5 13:57:20 | 显示全部楼层
你把整体设计写出来,大家可以参考呀。
我觉得需要一个统一的文档,至于实现,那是详细设计时候做的。现在还没到这一步。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-9 02:44 , Processed in 0.126942 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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