|
楼主 |
发表于 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
以上没有涉及碰撞检测的问题,下面说说我的思路:
合外力 -> 加速度 -> 速度 -> 位置 -> 碰撞检测 -> 如果发生碰撞就改变合外力 -> 改变加速度 -> ……
以上“->”表示左边的东东引起、影响或改变了右边的东东。 |
|