Flash游戏编程基础教程
第一部分:准备工作与环境搭建
-
软件安装:
- 下载并安装 Adobe Animate CC,这是目前官方支持的、可以导出HTML5、SWF等格式的工具,你可以从Adobe官网获取试用版。
- 重要提示:如果你只想学习ActionScript 3的编程逻辑,而不关心最终导出格式,那么旧的 Adobe Flash Professional CS6 或更早版本也可以,但Animate CC是更现代的选择。
-
创建新文档:
- 打开Animate CC,选择
ActionScript 3.0作为文档类型。 - 设置画布大小,
800x600像素,背景色为黑色。 - 将帧率设置为
30或60,帧率越高,动画越流畅,但计算量也越大,对于初学者,30是一个不错的选择。
- 打开Animate CC,选择
-
界面认识:
- 舞台:你看到的主画布,是游戏最终显示的区域。
- 时间轴:控制动画和事件发生的序列,每一帧代表一个时间点。
- 属性:可以修改选中元素的属性,如位置、大小、颜色等。
- 库:存放所有可以使用的资源,如影片剪辑、位图、声音等。
第二部分:ActionScript 3.0 核心概念
在开始编程前,我们需要了解几个核心概念。
-
帧脚本:
- 在时间轴上选择一个关键帧,按
F9打开 动作 面板。 - 在这里写的代码,会在播放头到达该帧时执行一次。
- 游戏循环:游戏的核心是“不断更新画面”,在Flash中,我们通常在第一帧写一个循环,让游戏持续运行。
- 在时间轴上选择一个关键帧,按
-
对象:
- AS3是面向对象的语言,游戏中的一切,比如玩家飞机、敌人、子弹,都是“对象”,对象拥有“属性”(如x, y坐标)和“方法”(如
move()移动)。
- AS3是面向对象的语言,游戏中的一切,比如玩家飞机、敌人、子弹,都是“对象”,对象拥有“属性”(如x, y坐标)和“方法”(如
-
显示列表:
- 所有可见的对象都必须被添加到“显示列表”中才能显示在舞台上。
stage.addChild(myObject);// 将myObject显示在舞台上stage.removeChild(myObject);// 从舞台上移除myObject
-
事件监听:
- 这是处理用户输入和游戏逻辑的关键,让程序“监听”某个事件,当事件发生时,执行指定的代码。
addEventListener(Event.ENTER_FRAME, myFunction);// 监听“进入帧”事件,每帧都执行myFunctionaddEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);// 监听“键盘按下”事件
第三部分:实战!构建一个简单的飞机大战
我们将创建以下元素:
- 玩家飞机:可以用键盘(上下左右)控制移动。
- 敌人:从屏幕上方随机位置出现并向下移动。
- 子弹:按空格键发射,向上移动。
- 碰撞检测:子弹击中敌人后,两者都消失。
步骤1:准备素材
- 绘制一个简单的玩家飞机(比如一个蓝色的三角形),选中它,按
F8将其转换为“影片剪辑”,命名为Player。 - 同样,绘制一个红色的方块作为敌人,转换为影片剪辑,命名为
Enemy。 - 绘制一个黄色的小方块作为子弹,转换为影片剪辑,命名为
Bullet。 - 将这三个影片剪辑拖入 库 中,这样我们就可以用代码来创建它们了。
步骤2:编写主游戏逻辑
在时间轴的第一帧,按 F9 打开动作面板,开始编写代码。
// 1. 导入必要的类
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.ui.Keyboard;
// 2. 创建游戏对象
var player:Player = new Player(); // 从库中创建一个玩家实例
player.x = stage.stageWidth / 2; // 设置初始x坐标为舞台中央
player.y = stage.stageHeight - 50; // 设置初始y坐标为舞台底部
stage.addChild(player); // 将玩家添加到舞台
// 3. 定义变量
var enemyList:Vector.<MovieClip> = new Vector.<MovieClip>(); // 使用Vector存储所有敌人,比数组更高效
var bulletList:Vector.<MovieClip> = new Vector.<MovieClip>(); // 存储所有子弹
// 4. 事件监听
// 监听键盘按下事件
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
// 监听键盘释放事件(可选,用于实现按键持续移动)
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
// 监听游戏循环事件
stage.addEventListener(Event.ENTER_FRAME, gameLoop);
// 5. 游戏主循环
function gameLoop(e:Event):void {
// 更新玩家位置(如果正在移动)
if (isMovingLeft) {
player.x -= 5;
}
if (isMovingRight) {
player.x += 5;
}
if (isMovingUp) {
player.y -= 5;
}
if (isMovingDown) {
player.y += 5;
}
// 限制玩家不能移出舞台
player.x = Math.max(0, Math.min(stage.stageWidth, player.x));
player.y = Math.max(0, Math.min(stage.stageHeight, player.y));
// 生成敌人
if (Math.random() < 0.02) { // 每帧有2%的几率生成一个敌人
var enemy:Enemy = new Enemy();
enemy.x = Math.random() * stage.stageWidth;
enemy.y = -20; // 从屏幕上方外生成
stage.addChild(enemy);
enemyList.push(enemy); // 将新敌人添加到列表
}
// 更新所有敌人位置
for (var i:int = enemyList.length - 1; i >= 0; i--) {
enemyList[i].y += 3; // 敌人向下移动
// 如果敌人移出屏幕底部,则移除它
if (enemyList[i].y > stage.stageHeight) {
stage.removeChild(enemyList[i]);
enemyList.splice(i, 1);
}
}
// 更新所有子弹位置
for (var j:int = bulletList.length - 1; j >= 0; j--) {
bulletList[j].y -= 8; // 子弹向上移动
// 如果子弹移出屏幕顶部,则移除它
if (bulletList[j].y < 0) {
stage.removeChild(bulletList[j]);
bulletList.splice(j, 1);
}
}
// 碰撞检测
for (var k:int = bulletList.length - 1; k >= 0; k--) {
for (var l:int = enemyList.length - 1; l >= 0; l--) {
// hitTestObject 是Flash内置的碰撞检测方法
if (bulletList[k].hitTestObject(enemyList[l])) {
// 击中了!
stage.removeChild(bulletList[k]);
stage.removeChild(enemyList[l]);
bulletList.splice(k, 1);
enemyList.splice(l, 1);
break; // 子子弹已经消失,跳出内层循环
}
}
}
}
// 6. 键盘控制函数
var isMovingLeft:Boolean = false;
var isMovingRight:Boolean = false;
var isMovingUp:Boolean = false;
var isMovingDown:Boolean = false;
function onKeyDownHandler(e:KeyboardEvent):void {
switch (e.keyCode) {
case Keyboard.LEFT:
isMovingLeft = true;
break;
case Keyboard.RIGHT:
isMovingRight = true;
break;
case Keyboard.UP:
isMovingUp = true;
break;
case Keyboard.DOWN:
isMovingDown = true;
break;
case Keyboard.SPACE: // 空格键发射子弹
var bullet:Bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y - 20;
stage.addChild(bullet);
bulletList.push(bullet);
break;
}
}
function onKeyUpHandler(e:KeyboardEvent):void {
switch (e.keyCode) {
case Keyboard.LEFT:
isMovingLeft = false;
break;
case Keyboard.RIGHT:
isMovingRight = false;
break;
case Keyboard.UP:
isMovingUp = false;
break;
case Keyboard.DOWN:
isMovingDown = false;
break;
}
}
步骤3:测试与运行
- 按
Ctrl + Enter(Windows) 或Cmd + Enter(Mac) 来测试你的游戏。 - 你应该能看到:
- 一个蓝色的飞机在屏幕底部。
- 红色的方块从上方不断出现并下落。
- 你可以用方向键控制飞机移动。
- 按空格键可以发射子弹。
- 子弹击中红色方块后,两者都会消失。
第四部分:进阶概念与学习路径
当你掌握了上面的基础后,可以继续学习以下内容来丰富你的游戏:
-
面向对象编程:
- 不要把所有代码都写在时间轴上,为
Player、Enemy、Bullet等创建独立的.as文件(类文件)。 - 在各自的类中封装它们的属性和行为(
Player类有自己的move()方法),这样代码结构更清晰,更易于维护和扩展。
- 不要把所有代码都写在时间轴上,为
-
游戏状态管理:
- 一个游戏通常有多个状态,如“开始画面”、“游戏中”、“游戏结束”。
- 使用一个变量来追踪当前状态(
var gameState:String = "START";),然后在gameLoop中根据不同状态执行不同的逻辑。
-
得分系统:
- 创建一个动态文本框,用来显示分数。
- 每当敌人被击中时,增加分数并更新文本框。
-
音效与背景音乐:
- 使用
Sound和SoundChannel类来加载和播放音效。
- 使用
-
粒子效果:
当飞机或敌人被摧毁时,可以创建大量的小粒子(小圆点)来模拟爆炸效果。
-
从Flash到现代引擎:
- ActionScript 3 (AS3) 的核心思想(事件驱动、面向对象、游戏循环)与 JavaScript 和 TypeScript 几乎完全相同。
- 当你理解了AS3后,学习使用 Construct 3 (可视化逻辑)、Phaser (JS库) 或 Unity (C#) 等现代游戏引擎会非常容易,它们都是将复杂的底层封装起来,让你能更专注于游戏逻辑本身。
总结与资源
- 核心:Flash游戏编程的核心是
ENTER_FRAME游戏循环、事件监听 和 显示列表管理。 - 心态:不要害怕犯错,多尝试、多修改代码,从复制粘贴开始,然后逐步理解每一行代码的作用。
- 官方资源:
- 社区与教程:
- 在B站、YouTube等平台搜索 "Flash AS3 教程" 或 "Animate CC 教程",有大量中文视频资源。
- 寻找一些开源的Flash游戏源码来学习别人的代码结构。
希望这份基础教程能帮助你顺利踏入Flash游戏编程的大门!祝你编码愉快!
