...............................(如示例动画已显示完毕或需再次观看,可刷新------chenye_1976).............. FLASH游戏编程第(1)课——制作重力场从今天开始会给大家讲解FLASH游戏编程的问题(高手不要笑我),因为本人能力有限,所以也只能是抛砖引玉啦。
言归正传。
因为游戏环境并不象FLASH动画一样可以预先作好关键帧,所以在处理“运动”这一问题时就要创造自己的运动规律,让场景内的物体按“规律”去自己运动。我们最熟悉,每天都会接触到的就是重力场了。对于FLASH编程中所涉及到的重力及重力加速度并不用按实际数值引用,你只要记得那是一个常量就行了。其实重力场是一个非常单纯的力场,他只涉及到一个垂直的力。重力加速度就是物体沿垂直方向运动的速度的增量。有了这些基本概念,就可以摸似出似真的重力场了。
来看看AS方面——
首先在场景中制作一个圆形,将它转化为MC,实例名取为“ball”,在第一帧上加入:
ymov = 0;
gravity = 2;
_root.onEnterFrame = function() {
ymov += gravity;
ball._y += ymov;
if (ball._y>400) {
ball._y = 400;
ymov *= -0.9;
}
};
这里设定初速度为0,重力加速度为2,当球运动到400的位置时开始反弹。在理想状态下应该是获得一个相反的速度,即最后一句应该是ymov *= -1。但考虑到我们平时所见到的情况并不是球在毫无能量损失的状态下运动的。我们把它的速度减少了10%,以摸拟在反弹时的能量损失。
有了重力场,我们就可以来看看一个本来水平运动的球会怎样受到重力的影响。在球上加入AS——
onClipEvent (enterFrame) {
speed = 4;
this._x += speed;
if (this._x>400) {
this._x = 0;
}
}
球会沿X轴以速度4向右移动,这里的判断语句if (this._x>400) {this._x = 0;}是说当球运动到水平400个单位时将出现在X=0的坐标上。这也是我们在玩游戏时经常遇到的情况:你的飞机从画面上方飞出,又从画面下方出现。
当球的水平运动与重力场同时作用到球上时,我们便可以看到相当逼真的运动效果了。
FLASH游戏编程第(2)课——初级碰撞今天给大家介绍碰撞问题的初级解决方案。之所以称这一课初级碰撞,其主要原因是因为我们所借助的检测手段是hitTest。这个函数在碰撞问题上要遇到2个瓶颈:
1.它在很大程度上要依赖于MC的边框
2.当你面对一个非常快的动作(比如前一帧2个物体还没有接触,而后一帧则已经互相穿了过去)
这两个瓶颈是hitTest所无法解决的问题,我们将在下一课(高级碰撞)中向大家介绍更为科学的数学方法。
回到hitTest上来,它的标准语法是:myMovieClip.hitTest(target_MovieClip)。记得我们说过的瓶颈吗?它无法真正的检测到MC之间的互相碰撞。只要两个MC的边界*(作一个任意形状的MC,你会发现在它周围有一个矩形的虚线边框,就是它了)相交叠就会判定为碰撞了。虽然这种方法有很多局限性,但如果对象类似于矩形,同时运动速度又不太快,还是有一定的用武之地的。
HitTest的另一种用法是检验MC与特定坐标的碰撞,常见的语法是myMovieClip.hitTest(x, y,true)。最后这个布尔值true是可选的,当其为true时可以严格检测到MC与特定坐标的碰撞情况。当它为false或缺省时则会检测矩形边偶范围内的所有部分与坐标的碰撞。
在很多鼠标事件中我们常可以看到这样的语法:myMovieClip.hitTest(_xmouse,_ymouse ,true)。比如下边这个例子——
FLASH游戏编程第(3)课——动量守恒与能量守恒因为时间不是很多,所以只能告诉大家碰撞要作到逼真就一定要遵守动量守恒和能量守恒定律。具体推导请见下图——
下面是两个方块相互碰撞的例子——
源代码如下——
//设定第一个方块的初始值;
rectangle1 = {};
rectangle1.clip = rectangle_a;
rectangle1.x = rectangle1.clip._x;
rectangle1.y = rectangle1.clip._y;
rectangle1.height = rectangle1.clip._height;
rectangle1.width = rectangle1.clip._width;
rectangle1.xmov = 3;
rectangle1.ymov = 0;
rectangle1.mass = 1;
//
//设定第二个方块的初始值;
rectangle2 = {};
rectangle2.clip = rectangle_b;
rectangle2.x = rectangle2.clip._x;
rectangle2.y = rectangle2.clip._y;
rectangle2.height = rectangle2.clip._height;
rectangle2.width = rectangle2.clip._width;
rectangle2.xmov = -2;
rectangle2.ymov = 0;
rectangle2.mass = 2;
//
function reaction(a, b) {
var m1 = a.mass;
var m2 = b.mass;
var v1i = a.xmov;
var v2i = b.xmov;
var p = m1*v1i+m2*v2i;
var v = v1i-v2i;
//根据动量守恒和动能守恒定理计算出碰撞后的速度;
var v2f = (p+m1*v)/(m1+m2);
var v1f = v2f-v;
a.xmov = v1f;
b.xmov = v2f;
a.tempx = a.x+a.xmov;
b.tempx = b.x+b.xmov;
}
//
function getTemPos() {
rectangle1.tempx = rectangle1.x+rectangle1.xmov;
rectangle1.tempy = rectangle1.y+rectangle1.ymov;
rectangle2.tempx = rectangle2.x+rectangle2.xmov;
rectangle2.tempy = rectangle2.y+rectangle2.ymov;
}
//
function render() {
rectangle1.x = rectangle1.tempx;
rectangle1.y = rectangle1.tempy;
rectangle1.clip._x = rectangle1.x;
rectangle1.clip._y = rectangle1.y;
rectangle2.x = rectangle2.tempx;
rectangle2.y = rectangle2.tempy;
rectangle2.clip._x = rectangle2.x;
rectangle2.clip._y = rectangle2.y;
}
//
function rectangleDetection(r1, r2) {
//r1的左右两个边界;
var x_a1 = r1.x;
var x_a2 = r1.x+r1.width;
//r1的上下两个边界;
var y_a1 = r1.y;
var y_a2 = r1.y+r1.height;
//r2的左右两个边界;
var x_b1 = r2.x;
var x_b2 = r2.x+r2.width;
//r2的上下两个边界;
var y_b1 = r2.y;
var y_b2 = r2.y+r2.height;
//检测是否发生碰撞;
if ((x_a2>x_b1 && x_a1y_b1 && y_a1 reaction(r1, r2);
}
}
_root.onEnterFrame = function() {
getTemPos();
rectangleDetection(rectangle1, rectangle2);
render();
};
FLASH游戏编程第(4)课——游戏场景TBW技术
所谓TBW技术就是tile-based worlds的缩写。
很多朋友在刚开始尝试制作游戏场景的时候都会去动手绘制版图,不过这样并不是一个“专业”游戏制作者的风格。比如闪吧前几天就看到了有朋友在制作“坦克大战”,完全没有规划过的版图设定使得各种属性的实现变得极为复杂。
在TBW技术中,你所要作的就是将地形浓缩为一个MC,它有很多帧*(具体看你的地形种类),然后将这个MC整齐地排列成组,再利用参数来调用其中的特定帧以实现不同的环境效果。这样作的另外一个好处是你可以灵活地控制场景的特定属性。比如你可以设定当你的角色走入“水”中时速度会慢下来,进入“地雷阵”则会被炸飞……等等。
接下来这段mc我加入了用鼠标控制单元格变换的指令,你可以通过按键来变换不同的地形。在以后的内容中我会给大家介绍自制“地图编辑器”,这样在完成游戏后你可以利用“编辑器”来制作不同的关。
FLASH游戏编程第(5)课——场景的制作和调用(上)
上次给大家讲了用TBW来实现游戏场景的基本概念,今天来介绍一下如何自己编辑基于TBW的地图,以及对已经编辑好的地图的调用。
在上次的介绍中,我们已经通过AS实现了鼠标点击来更换“地形”的功能,其实这已经是地图编辑器的一部分功能了,我们只要把经过点击更换后的地形类型记录下来就可以了。看下面的AS——
function createXML() {
var xml = "";
for (j=1; j<=game.rows; j++) {
xml += "";
for (i=1; i<=game.columns; i++) {
var name = "cell"+i+"_"+j;
var type = game[name].type;
var node = "";
xml += node;
}
xml += "";
}
xml += "";
trace(xml);
}
熟悉AS的朋友可以看出,上面的function只是将某种“特定”的结构付给了xml这个变量,我们在场景中设置一个按钮(比如我下面例子中的“产生XML”这个按钮),当点击按钮时则调用此函数,这样在点击时便可以trace出一个标准的xml档案,在output栏中点击右键,另存为xml型文件(我的是产生一个名为“Level1.xml”,其内容可以参见:http://dreamstudio.nease.net/Level1.xml)。
这样,我们便可以把编辑好的地图输出为一个xml文档了。
另,由于trace是一个测试用函数,所以在SWF文件是没法看到输出情况的,只有在你自己编制的fla文件中才可以进行地图的编辑记录。在正式的游戏版本中,要记得将鼠标改变地形和产生XML等功能去掉。这样一来,你的游戏编程将分为两个版本——开发版本和客户端,在开发版本中你可以自己编辑地图,设置属性等;而客户端的主要功能则要实现可以调用已编制好的“地图”。
这个是调用上面所说的那个Level1.xml的效果——
FLASH游戏编程第(6)课——用等距视点表现3D立体世界
[FLASH=450,350][/FLASH] http://www.flash8.net/bbs/uploadfile/20035141803373121.swf
Flash的坐标系示意图——
由于已经进行了坐标系的转换,所以现在按方向键的话可以让球体在新坐标中进行移动了。另外按空格键可以把小球“拍”起来,当然在空中也是可以控制球体的运动的,影子也会随着球体一起活动,球本身也遵循自由落体运动。
未完待续。。。。。。。。。。。。。
