你是男人么?是男人请在枪林弹雨中支撑15秒!哦也,今天给大家带来经典游戏《是男人》系列的《是男人就支撑15秒》,这个游戏我想各位玩过的人也会觉得没什么复杂的,的确,也就区区100来行代码而已(看过之前例子的朋友估计要头大了,因为之前的例子一般不超过50行)。
先看一下结果吧baby们:http://www.iamsevent.com/upload/dodgeBullets.swf
小朋友别怕,不是难,是相当难……才怪。首先依旧使用我们的flash CS工具创建一个那啥,对,就是那啥,你真聪明,之后呢,在创建一个那啥……咳咳,不好意思,今天脑子有点问题。我们需要一架灰机(元件)来充当玩家控制的角色,可以导出为ActionScript也可以不导出,我这里就偷懒没有导出,给他随便去个名字,我还是叫它ball好了,在元件中画个灰机模型,可以玩得逼真点也可以画个大便状,whatever,我这里再次偷懒就画了个白色圆形,最好把你元件的中心点对准十字注册点哈(至于注册点的作用,我上一篇教程有提到过)。好了,我们的灰机元件完工了,把它拖到屏幕最中间吧,一会儿要让他被围攻的说,再给这个元件设个ID,就叫mcBall好了(别骂我俗气)。最后我们要把舞台设置成黑色,让我们有一种在星际中畅游的Feeling。
<ignore_js_op>
接下来呢,我们需要N多的子弹,先像创建灰机一样创建一个元件,名字随便取,不过它可是一定得勾选Export for ActionScript(导出为ActionScript)的哦,因为对于这种需要创建很多个的元件来说,我们不太可能一个个手动将其拖动到舞台上更不可能在每帧操作它们运动,只能在代码中以变量的形式来创建,操纵之。我这里给子弹导出的类名叫做Star,蛮形象的哦?就像星际中一个个行星或陨石,我们的宇宙飞船穿梭在其中,好了,不YY了,继续进入Star元件的绘制界面,画一个圆,为了与我们的灰机区分开来,我把Star的圆涂成了蓝色。把十字注册点对准星星的圆心我们就大功告成啦。
<ignore_js_op>
最后呢,也是最主要,最复杂的环节来了,童鞋们不要怕,叔叔带你们一步步走。先在第一帧按F9添加脚本代码,写上如下代码:
- var ballXSpeed:Number = 0; //小球的x轴速度
- var ballYSpeed:Number = 0; //小球的y轴速度
- //星星数量
- var starNum:int = 50;
- var starArray:Array = new Array();
- //放置小星星,随机移动~
- for(var i:int = 0;i<starNum;i++)
- {//循环的放置所有的砖块
- makeStars();
- }
- //按键改变小球移动速度
- stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
- stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
- //增加球的移动事件
- mcBall.addEventListener(Event.ENTER_FRAME, moveBall);
- this.addEventListener(Event.ENTER_FRAME, moveStar);
- function onKeyDownHandler(evt:KeyboardEvent):void{
- if(evt.keyCode == Keyboard.LEFT){
- ballXSpeed = -4;
- }
- if(evt.keyCode == Keyboard.RIGHT){
- ballXSpeed = 4;
- }
- if(evt.keyCode == Keyboard.UP){
- ballYSpeed = -4;
- }
- if(evt.keyCode == Keyboard.DOWN){
- ballYSpeed = 4;
- }
- }
- function moveStar(evt:Event):void{
- for(var i:uint = 0; i < starArray.length; i++){
- starArray[i].x += starArray[i].speedX;
- starArray[i].y += starArray[i].speedY;
- if(starArray[i].x >= stage.stageWidth
- || starArray[i].x <= 0
- || starArray[i].y >= stage.stageHeight
- || starArray[i].y <= 0)
- {
- removeChild(starArray[i]);
- starArray.splice(i,1);
- i-=1;
- makeStars();
- }
- }
- }
- function onKeyUpHandler(evt:KeyboardEvent):void{
- ballXSpeed = 0;
- ballYSpeed = 0;
- }
- function moveBall(evt:Event):void{
- //将小球按照速度移动,可以更改速度,增加难度
- mcBall.x += ballXSpeed; //水平移动
- mcBall.y += ballYSpeed; //上下移动
- //如果碰到了墙壁就反弹,直接改变速度的方向,这样简单
- if(mcBall.x >= stage.stageWidth-mcBall.width/2){
- mcBall.x = stage.stageWidth-mcBall.width/2 - 0.1;
- }
- if(mcBall.x <= 0){
- mcBall.x = 0;
- }
- if(mcBall.y >= stage.stageHeight-mcBall.height/2){
- mcBall.y = stage.stageHeight-mcBall.height/2 - 0.1;
- }
- if(mcBall.y <= 0){
- mcBall.y = 0;
- }
- for(var i:uint = 0; i < starArray.length; i++){
- if(mcBall.hitTestObject(starArray[i])){
- trace("hit!!!!!");
- mcBall.removeEventListener(Event.ENTER_FRAME, moveBall);
- removeEventListener(Event.ENTER_FRAME, moveStar);
- break;
- }
- }
- }
- function makeStars():void{ //放置砖块
- var star:Star = new Star();
- //随机产生星星初始方向
- var starDirection:int=Math.floor(4*Math.random());//0-3
- //随机产生星星飞行方向,x方向,要么往左要么往右;y方向要么向上要么向下
- var temp:int=Math.floor(2*Math.random());//0,1
- var xyDirection:int=(temp==0)?1:-1;
- switch(starDirection){
- //往下方向的弹幕飞行
- case 0:
- star.x = Math.random() * stage.stageWidth;
- star.y = 0;
- star.speedX = Math.random() * 4 * xyDirection;
- star.speedY = Math.random() * 4;
- break;
- //往上方向的弹幕飞行
- case 1:
- star.x = Math.random() * stage.stageWidth;
- star.y=stage.stageHeight;
- star.speedX = Math.random() * 4 * xyDirection;
- star.speedY = -Math.random() * 4;
- break;
- //往左方向的弹幕飞行
- case 2:
- star.x = stage.stageWidth;
- star.y = Math.random() *stage.stageHeight;
- star.speedX = -Math.random() * 4 ;
- star.speedY = Math.random() * 4 * xyDirection;
- break;
- //往右方向的弹幕飞行
- case 3:
- star.x = 0;
- star.y = Math.random() *stage.stageHeight;
- star.speedX = Math.random() * 4 ;
- star.speedY = Math.random() * 4 * xyDirection;
- break;
- default:
- trace("error!");
- break;
- }
- addChild(star);
- starArray.push(star);
- }
前几行声明变量的工作相信大家都是一眼带过,不过允许我啰嗦一点,就是在变量声明时若未初始化就直接引用是会报错的(错误提示是“不能访问空对象”),例如如下代码:
- var num:int;
- var array:Array;
- function Handler(){
- num++; //报错,num是空对象
- var i:int = num; //依然报错
- array[0]= 2; //array是空对象
- array.push(1); //array是空对象
- array.push(num); //不仅num是空对象,array也是空对象
- }
大家若是碰到报这种错误,先检查下是否忘记了声明吧。之后就是循环创建星星(子弹)以及增加事件侦听,我把创建星星的工作抽成了一个函数,这是非常好的一个习惯,第一是直观,一段代码做一项工作;第二是可重用性高,若你一个函数中多处需要使用一个功能,就只需要多次调用实现这个功能的函数即可,省去冗余代码,甚至待你下次在创建别的工程时需要用到类似功能也不用重新写一个函数了。在添加事件侦听时注意侦听器的对象,通常,键盘事件只能给stage侦听才能接收得到,添加键盘事件后就可以通过键盘来操作flash中的一些行为,这里我们准备用键盘来控制飞机的移动哈。
这个帖子字数太多啦,暂时写不下了,待我下回接着分解。