动作游戏中多块地板和跳跃的实现

首先画一个矩形,按F8转换成MC(MovieClip电影剪辑)元件名叫判定。专门制作“判定”主要是为了处理方便,而且把画面和游戏内核分开。
从库(F11)中拖放很多个判定MC到场景上,形成你要的场景,用自由变换工具(Q)把所有地板MC编辑成合适的大小。好了,我们的场景上高低起伏的地形做好了。选中所有的判定,F8变成一个新的MC,元件名随便比如叫第一关,F9打开属性页,左边有一个<InstanceName>或者<实例名>,取名叫做背景。
这样 _root.背景 这个mc里面就有大量的判定MC,我们的地图判定就做好了。
把他们都放在在 _root.背景 的好处是:

1 可以用循环
for( var i in _root.背景 ){
_root.背景...........
}
这样访问所有地板(注意最好是正方形的MC,其他形状以后有时间再讨论),而不需要知道有多少块地板、它们在什么位置。

2 如果需要背景移动,正如我以前说过的,只需要移动 _root.背景 这个MC,所有地板都会一起移动。



onClipEvent(load){
 var xStart = _x;
//初始的_x和_y,按了Restart之后主角的坐标恢复到这个数字
 var yStart = _y;
 var yinc = 0;  
//垂直速度
 var g = 1;  
//垂直(重力)加速度
 var inAir = true;
//是否空中
 var moveSpeed = 8;
//主角的移动速度
 var jumpSpeed = -15;
//跳跃垂直初速度
 var landObject = null;
//当前脚下的物体
 var spacePressed = false;
//空格键是否按下
}

onClipEvent(enterFrame){
 
//抛物线和自由落体,如果目前在空中的话
 if(inAir){
  yinc += g;  
//yinc, y轴速度变大,g是重力加速度
   _y += yinc;  
//物体坐标+= yinc,物体根据当前速度下落
 
//如果在下落中(yinc>0),监测是否落到地面
  if(yinc >0){
   for(var i in _root.背景){
    if (hitTest(_root.背景)){
     landObject = _root.背景;
     var newy = landObject.getBounds(_root).yMin;
//得到地板的上表面
     if (_y - yinc < newy){
//如果该块地板在自己脚下,那么就落地了
      _y = newy;
      inAir = false;
      break;
     }else landObject = null;
    }
   }
  }
 }else{
//如果主角不在空中,让主角下落一个像素,测试是否和脚下的物体碰撞。如果不和脚下物体碰撞,证明脚下空了
  if(! hitTest(landObject) ){
//发现下面空了
   yinc = 1;
   inAir = true;
  }
 }
 
//按空格跳跃
 if(Key.isDown(Key.SPACE) && !spacePressed){
  spacePressed = true;
  if(!inAir){
   yinc = jumpSpeed;
   inAir = true;
  }
 }else if(!Key.isDown(Key.SPACE) && spacePressed){
//空格键松开就落下来,注意这里的处理方法
  spacePressed = false;
  if (yinc < -5) {
   yinc += 8;
   if (yinc >0) yinc = 0;
  }
 }
 
//方向控制左右移动,和垂直加速运动合到一起就是自然的抛物线
 if (Key.isDown( Key.LEFT )) _x -= moveSpeed;
 if (Key.isDown( Key.RIGHT )) _x += moveSpeed;
}


pluginspage=http://www.macromedia.com/go/getflashplayer src=/upimg/media/1_070607071406.swf width=400 height=300 type=application/x-shockwave-flash scale="" play="" loop="" menu=""> 
posted @ 2008-10-23 10:10  Landy_di  阅读(421)  评论(0)    收藏  举报