在场景中移动

场景是游戏中的一个重要元素,特别对于RPG游戏来说场景的数量就更多了,所以现在我为一些想做游戏的入门新手来讲解一下,游戏中的角色是如何在场景中实现移动的。今天我们要讲的是以游戏角色为中心的场景移动方式。

      以游戏角色为中心的场景移动方式就是:除了到达场景的尽头之外,游戏角色始终在场景的中心的移动方式。现在我们也可分开来考虑问题了,我们可以分为:在未达到场景尽头和已到达场景尽头两种情况。在未到达场景尽头时,游戏角色是在场景的中心位置的,已到达场景尽头时是游戏的角色逐渐向尽头靠拢的动作。还要进行说明的一点是,在很多种情况中都是由视觉产生的错觉,很多人以为是角色的移动造成场景的移动,所以把注意力集中在角色中,其实在编写在场景移动的注意力应该集中在场景上,当按下方向键时场景就开始移动,使我们误认为是角色在移动了。所以我们要分析出最本质的东西才能让我们事半功倍,好接下来我们就开始说说如何制作吧...  

     首先我们找来一幅图片并将它导入到Flash中。然后新建一个MC,把图片拖进去并让它和原点对齐,此步的目的是为了我们日后编程的方便而做的。而这一个MC就是我们的场景了。接着我们把这个MC拖到主场景并取名为map。接着我们再新建一个MC,这个用来表示游戏中的角色,我们随便画一个圆点给它。我们把这个MC也拖进场景取名为CurPoint。接下来我们开始编写脚本,点击主场景第一帧,写下如下代码: 

 





//以角色为中心的场景移动 
//角色移动的速度 
var speed:Number = 3; 
this.onEnterFrame = function() { 
 if (Key.isDown(Key.UP)) { 
  if (map._y>=0) { 
   //达到上边界 
   map._y = 0; 
   curPoint._y -= speed; 
  } else { 
   //未到达上边界,地图下移 
   if (curPoint._y>=Stage.height/2) { 
    curPoint._y -= speed; 
   } else { 
    map._y += speed; 
   } 
  } 
 } 
 if (Key.isDown(Key.DOWN)) { 
  if (map._y<=-(map._height-Stage.height)) { 
   //达到下边界 
   map._y = -(map._height-Stage.height); 
   curPoint._y += speed; 
  } else { 
   //未到达下边界,地图上移 
   if (curPoint._y<=Stage.height/2) { 
    curPoint._y += speed; 
   } else { 
    map._y -= speed; 
   } 
  } 
 } 
 if (Key.isDown(Key.LEFT)) { 
  if (map._x>=0) { 
   map._x = 0; 
   curPoint._x -= speed; 
  } else { 
   if (curPoint._x>=Stage.width/2) { 
    curPoint._x -= speed; 
   } else { 
    map._x += speed; 
   } 
  } 
 } 
 if (Key.isDown(Key.RIGHT)) { 
  if (map._x<=-(map._width-Stage.width)) { 
   map._x = -(map._width-Stage.width); 
   curPoint._x += speed; 
  } else { 
   if (curPoint._x<=Stage.width/2) { 
    curPoint._x += speed; 
   } else { 
    map._x -= speed; 
   } 
  } 
 } 
};
 
 
 
 
 
 
 
  现在我们制作另一种场景移动的方式。这次我们要做的形式就是当游戏角色超出一定范围后才滚动场景。

这种方式需要我们先给出一个角色可以移动的范围,只要游戏角色一超出这个范围地图就开始移动。知道相关的东西后我们就开始编写脚本把,其实我们不用再重新写一遍这个脚本,只要用我在第一篇提供的源码上作修改就能够容易地得出这种方式的场景移动了,那我们现在来看源代码吧:
 

import flash.geom.Rectangle; 
//引入矩形类包 

var rect:Rectangle = new Rectangle(50, 50, Stage.width-100, Stage.height-100); 
var speed:Number = 3; 
this.onEnterFrame = function() { 
   if (Key.isDown(Key.UP)) { 
       if (curPoint._y<=rect.top) { 
           if (map._y>=0) { 
               //到达上边界 
               map._y = 0; 
               curPoint._y -= speed; 
           } else { 
               map._y += speed; 
           } 
       } else { 
           curPoint._y -= speed; 
       } 
   } 
   if (Key.isDown(Key.DOWN)) { 
       if (curPoint._y>=rect.bottom) { 
           if (map._y<=-(map._height-Stage.height)) { 
               map._y = -(map._height-Stage.height); 
               curPoint._y += speed; 
           } else { 
               map._y -= speed; 
           } 
       } else { 
           curPoint._y += speed; 
       } 
   } 
   if (Key.isDown(Key.LEFT)) { 
       if (curPoint._x<=rect.left) { 
           if (map._x>=0) { 
               map._x = 0; 
               curPoint._x -= speed; 
           } else { 
               map._x += speed; 
           } 
       } else { 
           curPoint._x -= speed; 
       } 
   } 
   if (Key.isDown(Key.RIGHT)) { 
       if (curPoint._x>=rect.right) { 
           if (map._x<=-(map._width-Stage.width)) { 
               map._x = -(map._width-Stage.width); 
               curPoint._x += speed; 
           } else { 
               map._x -= speed; 
           } 
       } else { 
           curPoint._x += speed; 
       } 
   } 
};
 

这就是所有的代码了,你可以按Ctrl+Enter来测试一下。
对于新手import flash.geom.Rectangle;这一句可能会感到疑惑,其实这是引入flash包的语句,Rectangle是矩形类,这次我们用了这个类来设定主角的移动范围。要源文件的请给出邮箱,我发给他。
 
 
 
 
 
 
 
 前两篇文章写的是一些关于键盘控制场景移动,有人问我用鼠标怎么控制场景的移动呢?由于前段时间没时间写,所以一直拖到现在。好了,废话就不多说了,关于鼠标控制场景我会分几篇文章来讲述。每篇文章都实现一种不同的控制方式,让大家尽可能地接触所有的方式,现在这篇文章要写的是用鼠标的方式来实现像《场景移动之一》文章中所述的那种方式。
 
   用鼠标来控制场景要解决的问题有以下几个:
   1.获取鼠标点击的位置(在此要为鼠标增加侦听事件,并在事件中记录鼠标点击的位置)
   2.求出角色当前位置与鼠标点击位置的距离,从而求出角色在水平和垂直移动的分速度。我们可以借助下图来理解如何求出水平和垂直的分速度了,不懂的就看源码吧~

 
    求出了水平和垂直的分速度后,我们就可以跟据求出的速度像《场景移动之一》那样判断,实现当鼠标点击时,角色就移动起来。还有一点不同的是Flash主场景的坐标系和影片的坐标系有点不一样,所以像我这种运用角度来求水平和垂直分速度的做法需要判断目标点所在的象限来设定分速度的方向。
 

  

posted @ 2012-12-24 13:50  sinsoul  阅读(352)  评论(0编辑  收藏  举报