
求一个简单的flash动画 并有详细步奏
1,新建fla文件,选as3.0版本,保存为:象素射击.fla
制作素材
选一张背景图,转换成元件,as连接命名为:BackImage
绘制以下角色:
并将它们转换成元件放在库中,分别as连接命名为EnemyImage,PlayerImage,MissileImage
代表:敌机,玩家,子弹
制作爆炸元件,as连接符命名为:ExplosionImage
第3帧与第5帧放大效果的两张图形成爆炸效果,第7帧输入脚本:stop();
在公用库的声音中找两个声音,分别as连接名为:Explode 和 Shoot
代表爆炸声和发射子弹声音。
回到舞台的属性面板,类______输入:game
2,新建脚本文件:game.as 直接复制就能用,慢慢读懂它。
将game.as与象素射击.fla放在同一个目录下,Ctrl+Enter测试影片
脚本文件内容如下:
package
{//package
import flash.display.MovieClip;//影片剪辑包
import flash.events.Event;//事件包
import flash.events.MouseEvent;//鼠标事件包
import flash.display.*;//显示包
import flash.events.*;//事件包
import flash.geom.Rectangle;//形状包
import flash.media.Sound;//声音
import flash.text.*;//文字包
//public公有 private私有
public class game extends flash.display.MovieClip//声明game包
{//game
public static const STATE_INIT:int = 10;//定义常量对象STATE_INIT=10
public static const STATE_START_PLAYER:int = 20;//定义常量对象
public static const STATE_PLAY_GAME:int = 30;//定义常量对象
public static const STATE_REMOVE_PLAYER:int = 40;//定义常量对象
public static const STATE_END_GAME:int = 50;//定义常量对象
public var gameState:int = 0;//定义变量对象
public var score:int = 0;//定义变量对象
public var chances:int = 0;//定义变量对象
public var bg:MovieClip;//定义影片剪辑对象
public var enemies:Array;//定义数组对象
public var missiles:Array;//定义数组对象
public var explosions:Array;//定义数组对象
public var player:MovieClip;//定义影片剪辑对象
public var level:Number = 0;//定义变量对象
public var scoreLabel:TextField = new TextField ;//定义文本对象
public var levelLabel:TextField = new TextField ;//定义文本对象
public var chancesLabel:TextField = new TextField ;//定义文本对象
public var scoreText:TextField = new TextField ;//定义文本对象
public var levelText:TextField = new TextField ;//定义文本对象
public var chancesText:TextField = new TextField ;//定义文本对象
public const SCOREBOARD_Y:Number = 5;//定义数值对象
public function game()//声明公有函数game()
{//game
addEventListener(Event.ENTER_FRAME,gameLoop);//事件:一直执行, 函数:gameLoop
bg = new BackImage ;//背景 = 新 背景图
addChild(bg);//添加 影片剪辑 bg
scoreLabel.text = "Score:";//分数标签的文字="Score:"
levelLabel.text = "Level:";//等级标签的文字=“Level:”
chancesLabel.text = "Ships:";//机会标签的文字="Ships:"
scoreText.text = "0";//分数文本框的文字=“0”;初始值
levelText.text = "1";//等级文本框的文字=“1”;初始值
chancesText.text = "0";//机会文本框的文字=“0”;初始值
scoreLabel.y = SCOREBOARD_Y;//分数标签的y坐标
levelLabel.y = SCOREBOARD_Y;//等级标签的y坐标
chancesLabel.y = SCOREBOARD_Y;//机会标签的y坐标
scoreText.y = SCOREBOARD_Y;//分数文本框的y坐标
levelText.y = SCOREBOARD_Y;//等级文本框的y坐标
chancesText.y = SCOREBOARD_Y;//机会文本框的y坐标
scoreLabel.x = 5;//分数标签的x坐标
scoreText.x = 50;//分数文本框的x坐标
chancesLabel.x = 105;//机会标签的x坐标
chancesText.x = 155;//机会文本框的x坐标
levelLabel.x = 205;//机会标签的x坐标
levelText.x = 260;//机会文本框的x坐标
scoreLabel.textColor = 0xFF0000;//分数标签的颜色
scoreText.textColor = 0xFFFFFF;//分数文本框的颜色
levelLabel.textColor = 0xFF0000;//等级标签的颜色
levelText.textColor = 0xFFFFFF;//等级文本框的颜色
chancesLabel.textColor = 0xFF0000;//机会标签的颜色
chancesText.textColor = 0xFFFFFF;//机会文本框的颜色
addChild(scoreLabel);//添加分数标签影片剪辑
addChild(levelLabel);//添加等级标签影片剪辑
addChild(chancesLabel);//添加机会标签影片剪辑
addChild(scoreText);//添加分数文本框影片剪辑
addChild(levelText);//添加等级文本框影片剪辑
addChild(chancesText);//添加机会文本框影片剪辑
gameState = STATE_INIT;//游戏状态变量=STATE_INIT常量
}
public function gameLoop(e:Event)//gameLoop函数
{
switch (gameState)//游戏状态条件筛选
{
case STATE_INIT ://STATE_INIT 初始状态
initGame();//调用initGame函数
break;//跳出循环
case STATE_START_PLAYER ://开始玩家状态
startPlayer();//调用开始玩家函数
break;//跳出循环
case STATE_PLAY_GAME ://玩游戏状态
playGame();//调用玩游戏函数
break;//跳出循环
case STATE_REMOVE_PLAYER ://消去玩家状态
removePlayer();//调用消去玩家函数
break;//跳出循环
case STATE_END_GAME ://结束状态
break;//跳出循环
}
}
public function initGame()//初始状态函数
{
stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownEvent);//场景加载帧听鼠标事件,执行鼠标按下事件函数
score = 0;//分数=0
chances = 3;//机会=3
enemies = new Array ;//敌人=新数组
missiles = new Array ;//子弹=新数组
explosions = new Array ;//爆炸=新数组
level = 1;//等级=1
levelText.text = level.toString();//等级文本框的文本=等级转换成文本
player = new PlayerImage ;//玩家=新 玩家图片
gameState = STATE_START_PLAYER;//游戏状态:开始玩家
}
public function startPlayer()//开始玩家函数
{
addChild(player);//添加玩家影片剪辑
player.startDrag(true,new Rectangle(0,365,550,365));//玩家移动范围
gameState = STATE_PLAY_GAME;//游戏状态=玩游戏状态
}
public function removePlayer()//消去玩家函数
{
for (var i:int = enemies.length - 1; i >= 0; i--)//变量i从敌人数组长度循环到0
{
removeEnemy(i);//执行移除敌人函数
}
for (i = missiles.length - 1; i >= 0; i--)//变量i从子弹数组长度循环到0
{
removeMissile(i);//执行移除子弹函数
}
removeChild(player);//移除玩家影片剪辑
gameState = STATE_START_PLAYER;//游戏状态转到开始游戏状态
}
public function playGame()//玩游戏函数
{
makeEnemies();//执行制造敌人函数
moveEnemies();//执行移动敌人函数
testCollisions();//执行
testForEnd();//执行
}
public function makeEnemies()//制造敌人函数
{
var chance:int = Math.floor(Math.random() * 100);//定义随机数0-100
var tempEnemy:MovieClip;//定义临时敌人
if ((chance < 2 + level))//如果(随机数<2+等级)
{
tempEnemy = new EnemyImage ;//临时敌人=新 敌人图片
tempEnemy.speed = 1 + level;//临时敌人的速度=1+等级
tempEnemy.y = -25;//临时敌人的y坐标=-25
tempEnemy.x = Math.floor(Math.random() * 515);//临时敌人的x坐标=随机数0-515
addChild(tempEnemy);//添加临时敌人影片剪辑
enemies.push(tempEnemy);//敌人数组推动临时敌人前进:临时敌人随着数组递增序号
}
}
public function moveEnemies()//移动敌人函数
{
var tempEnemy:MovieClip;//定义临时敌人
for (var i:int = enemies.length - 1; i >= 0; i--)//变量i从敌人数组长度循环到0
{
tempEnemy = enemies[i];//临时敌人=敌人数组[i]
tempEnemy.y += tempEnemy.speed;//临时敌人的y坐标 +=临时敌人的速度
if (tempEnemy.y > 435)//如果 临时敌人的y坐标>435
{//
removeEnemy(i);//执行移除敌人函数
}//
}//
var tempMissile:MovieClip;//定义临时子弹
for (i = missiles.length - 1; i >= 0; i--)//变量i从子弹数组长度-1循环到0
{//
tempMissile = missiles[i];//临时子弹=子弹数组[i]
tempMissile.y -= tempMissile.speed;//临时子弹的y坐标 -= 临时子弹的速度
if (tempMissile.y < -35)//如果 临时子弹的y坐标 < -35
{//
removeMissile(i);//执行移除子弹函数
}//
}//
var tempExplosion:MovieClip;//定义临时爆炸
for (i = explosions.length - 1; i >= 0; i--)//变量i从爆炸数组长度-1循环到0
{//
tempExplosion = explosions[i];//临时爆炸=爆炸数组[i]
if (tempExplosion.currentFrame >= tempExplosion.totalFrames)//如果 临时爆炸的当前帧>=临时爆炸的结束帧
{//
removeExplosion(i);//执行移除临时爆炸函数
}//
}
}
public function testCollisions()//测试碰撞函数
{
var tempEnemy:MovieClip;//定义临时敌人
var tempMissile:MovieClip;//定义临时子弹
enemy:for (var i:int = enemies.length - 1; i >= 0; i--)//行标:enemy 变量i从敌人数组的长度-1循环到0
{
tempEnemy = enemies[i];//临时敌人=敌人数组[i]
for (var j:int = missiles.length - 1; j >= 0; j--)//变量j从子弹数组长度-1循环到0
{
tempMissile = missiles[j];//临时子弹=子弹数组[j]
if (tempEnemy.hitTestObject(tempMissile))//如果临时敌人与临时子弹碰撞
{
score++;//分数+1
scoreText.text = score.toString();//分数文本框的文本=分数值转换到文本
makeExplosion(tempEnemy.x,tempEnemy.y);//执行制造爆炸函数,坐标为(敌人的x坐标,敌人的y坐标)
removeEnemy(i);//执行移除敌人函数
removeMissile(j);//执行移除子弹函数
break enemy;//返回行标enemy
}
}
}
for (i = enemies.length - 1; i >= 0; i--)//变量i从敌人长度-1循环到0
{
tempEnemy = enemies[i];//临时敌人=敌人数组[i]
if (tempEnemy.hitTestObject(player))//如果 临时敌人与玩家碰撞
{
chances--;//机会-1
chancesText.text = chances.toString();//机会文本框的文本=机会值转换到文本
makeExplosion(tempEnemy.x,tempEnemy.y);//执行制造爆炸函数,坐标为(敌人的x坐标,敌人的y坐标)
gameState = STATE_REMOVE_PLAYER;//游戏状态 转到 移除玩家状态
}
}
}
public function makeExplosion(ex:Number,ey:Number)//制造爆炸函数(参数ex,参数ey)
{
var tempExplosion:MovieClip;//定义临时爆炸
tempExplosion = new ExplosionImage ;//临时爆炸=新 爆炸图片
tempExplosion.x = ex;//临时爆炸的x坐标=参数ex
tempExplosion.y = ey;//临时爆炸的y坐标=参数ey
addChild(tempExplosion);//添加临时爆炸影片剪辑
explosions.push(tempExplosion);//爆炸数组尾部添加临时爆炸元素
//数组用法:数组.方法(对象) 例如:爆炸数组。push(临时爆炸对象)
//push 在数组尾部增加一个元素
//pop删除数组最后一个元素
//shift 删除数组的第一个元素
//index of 返回该元素在数组的位置
//sort对数组进行自定义排序
//splice将元素添加到指定的位置并删除所需元素
//concat将指定的元素与原来的数组连接
//join将数组中的元素转换为字符串,在元素之间插入指定分隔符,返回字符串
//unshift在元素的开始增加一个元素
//reverse把现有的数组的顺序完全倒过来这里都是常用的一些方法
var sound:Sound = new Explode ;//声音=新 爆炸声
sound.play();//声音播放
}
public function testForEnd()//测试游戏结束
{
if ((chances <= 0))//如果 机会<=0
{
removePlayer();//执行移除玩家函数
gameState = STATE_END_GAME;//游戏状态 转到 结束游戏状态
}
else if ((score > level * 30))//否则,如果分数>等级*30
{
level++;//等级+1
levelText.text = level.toString();//等级文本框的文本=等级转换到文本
}
}
public function removeEnemy(idx:int)//移除敌人函数(参数idx)
{
removeChild(enemies[idx]);//移除敌人影片剪辑(敌人数组[参数idx])
enemies.splice(idx, 1);//敌人数组的当前参数idx位置删除1个元素
//splice 将元素添加到指定的位置并删除所需的元素
}
public function removeMissile(idx:int)//移除子弹函数(参数idx)
{
removeChild(missiles[idx]);//移除子弹影片剪辑(子弹数组[参数idx])
missiles.splice(idx,1);//子弹数组的当前参数idx位置删除1个元素
}
public function removeExplosion(idx:int)//移除爆炸函数(参数idx)
{
removeChild(explosions[idx]);//移除爆炸影片剪辑(子弹数组[参数idx])
explosions.splice(idx,1);//爆炸数组的当前参数idx位置删除1个元素
}
public function onMouseDownEvent(e:MouseEvent)//鼠标按下事件函数
{
if ((gameState == STATE_PLAY_GAME))//如果 游戏状态
{
var tempMissile:MovieClip = new MissileImage ;//定义临时子弹 = 新 子弹图片
tempMissile.x = player.x + player.width / 2;//临时子弹的x坐标=玩家的x坐标+玩家的宽度
tempMissile.y = player.y;//临时子弹的y坐标=玩家的y座标
tempMissile.speed = 5;//临时子弹的速度=5
missiles.push(tempMissile);//子弹数组尾部添加临时子弹元素
addChild(tempMissile);//添加临时子弹影片剪辑
var sound:Sound = new Shoot ;//定义声音= 新 发射声音
sound.play();//声音播放
}
}
}
}