ActionScript 3.0 (AS3) 完整教程
第一部分:AS3 基础入门
第一章:什么是 ActionScript 3.0?
- 定义:ActionScript 3.0 (简称 AS3) 是一种由 Adobe 公司开发的、基于 ECMAScript 标准的编程语言,它是 Adobe Flash 平台(包括 Adobe Animate, Adobe AIR 等)的核心语言,用于创建交互式内容、游戏、应用程序和富互联网应用程序。
- 为什么是 AS3?
- 性能飞跃:相比前代版本 AS2,AS3 在虚拟机(AVM2)上运行,性能提升了 10 到 100 倍,这使得开发复杂游戏和高性能应用成为可能。
- 面向对象:AS3 是一门真正的面向对象编程语言,支持类、继承、封装和多态,代码结构更清晰、更易于维护和扩展。
- 事件驱动模型:引入了更强大、更统一的事件处理机制,让程序逻辑更清晰。
- 类型安全:支持严格的数据类型检查,可以在编译时发现错误,减少了运行时错误的风险。
第二章:开发环境准备
你需要一个编辑器来编写 AS3 代码,目前最主流的选择是:

-
Adobe Animate (原 Flash Professional CC):
- 简介:Adobe 官方的创作工具,你可以用它来绘制图形、制作动画,并直接编写和测试 AS3 代码。
- 优点:可视化编辑与代码编写无缝结合,非常适合初学者和设计师。
- 如何创建 AS3 文档:
- 打开 Animate,选择
文件->新建。 - 在 "常规" 选项卡中,选择 "ActionScript 3.0"。
- 点击 "创建"。
- 打开 Animate,选择
-
代码编辑器 (推荐):
- Visual Studio Code (VS Code):免费、强大、插件丰富,通过安装 "CreateJS" 或 "ActionScript" 插件,可以获得很好的代码提示和高亮。
- Flash Builder:Adobe 早期的专业 AS3 开发环境,现在已停止更新,但仍有开发者在使用。
- FlashDevelop:一款免费的开源 AS3 开发环境,曾经非常流行,配置稍复杂。
推荐路径:初学者使用 Adobe Animate,因为它能让你立即看到代码和视觉元素的互动效果,进阶开发者可以使用 VS Code 进行纯代码开发。
第三章:第一个 AS3 程序 - "Hello, World!"
-
创建场景和时间轴:
(图片来源网络,侵删)- 在 Animate 中新建一个 AS3 文档。
- 默认情况下,你有一个名为 "图层 1" 的图层和第 1 帧。
-
编写代码:
- 在时间轴上选择第 1 帧。
- 打开 "动作" 面板(快捷键
F9)。 - 在代码编辑区输入以下代码:
// 这是一个单行注释 /* * 这是一个多行注释 * 我们将在这里编写代码 */ // trace() 是一个调试函数,会在"输出"面板中打印信息 trace("Hello, World! 欢迎来到 ActionScript 3.0 的世界!"); // 在舞台上创建一个动态文本框 // 1. 用工具箱中的"文本工具"在舞台上画一个文本框。 // 2. 在"属性"面板中,将其"文本类型"设置为"动态文本"。 // 3. 给这个文本框实例命名,myTextField。 // 4. 在代码中,我们可以通过这个名字来操作它。 // 创建一个文本字段对象 var myTextField:TextField = new TextField(); // 设置文本内容 myTextField.text = "你好,AS3!"; // 设置文本样式(可选) myTextField.textColor = 0xFF0000; // 红色 myTextField.width = 200; myTextField.height = 30; // 将文本字段添加到显示列表中,让它可见 // stage 是整个舞台的容器 addChild(myTextField); -
测试影片:
- 按
Ctrl + Enter(Windows) 或Cmd + Enter(Mac)。 - 你会看到一个 SWF 文件窗口,其中显示 "你好,AS3!"。
- "输出" 面板会显示 "Hello, World! 欢迎来到 ActionScript 3.0 的世界!"。
- 按
第四章:核心语法基础
-
变量与数据类型
- 变量:用于存储数据的容器,使用
var关键字声明。 - 数据类型:AS3 是强类型语言,声明变量时最好指定类型。
String:字符串,如"你好"。Number:数字,如123,14。int:整数,如100。uint:无符号整数,如50。Boolean:布尔值,true或false。Array:数组,用于存储一组数据。Object:对象,最通用的数据类型。
var playerName:String = "Alice"; var playerScore:int = 1000; var isGameOver:Boolean = false; var items:Array = ["sword", "potion", "shield"]; var playerInfo:Object = {name: "Bob", level: 5}; - 变量:用于存储数据的容器,使用
-
运算符
(图片来源网络,侵删)- 算术运算符:, , , , (取余)
- 赋值运算符:, , , ,
- 比较运算符: (等于), (不等于),
>(大于),<(小于) - 逻辑运算符:
&&(与), (或), (非)
-
条件语句
if...else和if...else if...else
var score:int = 85; if (score >= 90) { trace("优秀!"); } else if (score >= 60) { trace("及格。"); } else { trace("不及格。"); } -
循环语句
for循环:用于已知循环次数的场景。while循环:用于未知循环次数,依赖条件判断的场景。
// for 循环:遍历数组 var fruits:Array = ["apple", "banana", "cherry"]; for (var i:int = 0; i < fruits.length; i++) { trace("水果 " + i + ": " + fruits[i]); } // while 循环 var count:int = 0; while (count < 5) { trace("Count is: " + count); count++; // 别忘了增加计数器,否则会死循环! } -
函数
- 函数是一组可重复执行的代码块。
- 使用
function关键字定义。
// 定义一个函数 function sayHello(name:String):void { trace("你好, " + name + "!"); } // 调用(执行)函数 sayHello("Charlie"); // 输出: 你好, Charlie! sayHello("David"); // 输出: 你好, David! // 带返回值的函数 function add(a:Number, b:Number):Number { return a + b; } var sum:Number = add(10, 20); trace("计算结果是: " + sum); // 输出: 计算结果是: 30void表示该函数没有返回值。
第二部分:面向对象编程与显示列表
第五章:面向对象编程
AS3 的核心是 OOP,理解类和对象是关键。
-
类与对象
- 类:是创建对象的“蓝图”或“模板”,它定义了对象具有的属性(数据)和方法(行为)。
- 对象:是类的具体实例。
-
创建一个类
- 在 Animate 中,你可以创建一个 AS 文件(
.as)来存放类代码。 - 创建一个
Player.as文件:
// Player.as package { // 关键字,将类放入一个命名空间中,避免冲突 import flash.display.Sprite; // 导入 Sprite 类,因为 Player 将是一个可视元素 public class Player extends Sprite { // Player 继承自 Sprite,使其可以显示在舞台上 // 属性 - 公开的,外部可以访问 public var name:String; public var health:int; // 构造函数 - 当 new Player() 被调用时执行 public function Player(playerName:String) { trace("Player 对象被创建了!"); this.name = playerName; // this 指代当前对象实例 this.health = 100; } // 方法 - 行为 public function takeDamage(amount:int):void { this.health -= amount; trace(this.name + " 受到 " + amount + " 点伤害,剩余生命值: " + this.health); } public function heal(amount:int):void { this.health += amount; trace(this.name + " 恢复了 " + amount + " 点生命值,当前生命值: " + this.health); } } } - 在 Animate 中,你可以创建一个 AS 文件(
-
使用类
- 回到你的
.fla主时间轴,在帧动作中这样使用:
// 导入我们刚刚创建的 Player 类 import Player; // 创建 Player 类的实例(对象) var player1:Player = new Player("勇士"); var player2:Player = new Player("法师"); // 调用对象的方法 player1.takeDamage(20); player2.heal(10); - 回到你的
第六章:显示列表
显示列表是 AS3 中管理所有可视元素(如形状、图片、文本、影片剪辑等)的层级结构。
stage(舞台):最顶层的容器,是所有显示对象的最终归宿。DisplayObjectContainer(显示对象容器):可以包含其他显示对象的类,如Sprite,MovieClip。DisplayObject(显示对象):所有可视元素的基类,如Shape,TextField,Sprite。
常用操作:
addChild(myObject):将一个对象添加到显示列表的顶层。addChildAt(myObject, index):将对象添加到指定层级。removeChild(myObject):从显示列表中移除一个对象。numChildren:获取当前容器中子对象的数量。getChildAt(index):通过索引获取子对象。
示例:
// 创建一个红色的圆形 var circle:Shape = new Shape(); circle.graphics.beginFill(0xFF0000); // 开始填充,颜色为红色 circle.graphics.drawCircle(0, 0, 50); // 在(0,0)位置画一个半径为50的圆 circle.graphics.endFill(); // 结束填充 // 将圆形添加到舞台,并设置其位置 circle.x = 100; circle.y = 100; addChild(circle); // 创建一个蓝色的方块 var square:Sprite = new Sprite(); square.graphics.beginFill(0x0000FF); square.graphics.drawRect(0, 0, 80, 80); square.graphics.endFill(); // 将方块添加到圆形的上方(层级更高) square.x = 120; square.y = 120; addChild(square); // 移除圆形 // removeChild(circle);
第三部分:事件处理
事件是 AS3 交互的核心,用户的点击、鼠标移动、键盘输入,或者动画的每一帧,都会触发事件。
第七章:事件监听器
使用 addEventListener 方法来“监听”某个事件,当事件发生时,执行指定的函数(称为“事件处理函数”)。
语法:object.addEventListener(eventType, handlerFunction);
eventType:事件类型,是一个字符串,如MouseEvent.CLICK,KeyboardEvent.KEY_DOWN。handlerFunction:事件发生时要调用的函数。
示例1:鼠标点击事件
// 假设舞台上有一个名为 myButton 的 MovieClip 实例
// 导入事件类
import flash.events.MouseEvent;
// 定义事件处理函数
function buttonClickHandler(event:MouseEvent):void {
trace("按钮被点击了!");
// event.target 指向触发事件的对象,也就是 myButton
trace("点击者是: " + event.target.name);
}
// 为 myButton 添加点击事件监听
myButton.addEventListener(MouseEvent.CLICK, buttonClickHandler);
示例2:键盘事件
// 导入事件类
import flash.events.KeyboardEvent;
// 定义事件处理函数
function keyDownHandler(event:KeyboardEvent):void {
// event.keyCode 获取按下的键的代码
if (event.keyCode == Keyboard.LEFT) {
trace("左箭头键被按下");
} else if (event.keyCode == Keyboard.RIGHT) {
trace("右箭头键被按下");
}
}
// 为整个舞台添加键盘事件监听
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
移除监听器: 当代码不再需要响应事件时,最好移除监听器,以避免内存泄漏。
myButton.removeEventListener(MouseEvent.CLICK, buttonClickHandler);
第四部分:项目实战
第八章:制作一个简单的弹球游戏
让我们综合运用所学知识,创建一个经典的弹球游戏。
目标:
- 一个可以左右移动的挡板。
- 一个在屏幕内弹跳的小球。
- 小球碰到挡板会反弹,碰到墙壁也会反弹。
- 小球掉出屏幕底部,游戏结束。
步骤:
-
准备素材:
- 在 Animate 中,绘制一个长方形,转换为影片剪辑,命名为
Paddle,并在"链接"属性中勾选"为 ActionScript 导出"。 - 同样,绘制一个圆形,转换为影片剪辑,命名为
Ball,并勾选"为 ActionScript 导出"。
- 在 Animate 中,绘制一个长方形,转换为影片剪辑,命名为
-
编写主时间轴代码 (在
.fla文件的第1帧):// 导入必要的类 import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; // --- 游戏对象 --- var paddle:Paddle = new Paddle(); var ball:Ball = new Ball(); // --- 游戏状态变量 --- var ballSpeedX:Number = 5; var ballSpeedY:Number = 5; var gameRunning:Boolean = true; // --- 初始化游戏 --- function initGame():void { // 设置挡板初始位置 paddle.x = stage.stageWidth / 2 - paddle.width / 2; paddle.y = stage.stageHeight - 30; addChild(paddle); // 设置小球初始位置 ball.x = stage.stageWidth / 2; ball.y = stage.stageHeight / 2; addChild(ball); // 添加事件监听 stage.addEventListener(Event.ENTER_FRAME, gameLoop); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); } // --- 游戏主循环 --- function gameLoop(event:Event):void { if (!gameRunning) return; // 移动小球 ball.x += ballSpeedX; ball.y += ballSpeedY; // 边界碰撞检测 (左右墙) if (ball.x <= 0 || ball.x >= stage.stageWidth - ball.width) { ballSpeedX *= -1; // 反转X方向速度 } // 边界碰撞检测 (上墙) if (ball.y <= 0) { ballSpeedY *= -1; // 反转Y方向速度 } // 游戏结束检测 (掉出底部) if (ball.y >= stage.stageHeight) { gameRunning = false; trace("游戏结束!"); // 可以在这里显示"游戏结束"的文字 } // 挡板碰撞检测 if (ball.hitTestObject(paddle)) { // 简单的反弹逻辑 ballSpeedY *= -1; // 可以根据小球击中挡板的位置来改变反弹角度,这里简化处理 } } // --- 键盘控制 --- var isLeftPressed:Boolean = false; var isRightPressed:Boolean = false; function keyDownHandler(event:KeyboardEvent):void { if (event.keyCode == Keyboard.LEFT) { isLeftPressed = true; } else if (event.keyCode == Keyboard.RIGHT) { isRightPressed = true; } } function keyUpHandler(event:KeyboardEvent):void { if (event.keyCode == Keyboard.LEFT) { isLeftPressed = false; } else if (event.keyCode == Keyboard.RIGHT) { isRightPressed = false; } } // 在游戏循环中更新挡板位置 function updatePaddle():void { if (isLeftPressed) { paddle.x -= 10; } if (isRightPressed) { paddle.x += 10; } // 限制挡板不超出屏幕 paddle.x = Math.max(0, Math.min(paddle.x, stage.stageWidth - paddle.width)); } // 修改 gameLoop 函数,加入更新挡板的逻辑 function gameLoop(event:Event):void { if (!gameRunning) return; updatePaddle(); // <-- 新增这一行 // ... (其余代码不变) } // 启动游戏 initGame(); -
测试游戏:
- 按
Ctrl + Enter运行。 - 使用键盘的左右方向键控制挡板,尝试接住小球。
- 按
第五部分:进阶与资源
第九章:后续学习方向
完成以上教程后,你可以探索以下更高级的主题:
- 动画与缓动:使用
Tween类或第三方库(如 GreenSock/TweenLite)让动画更流畅。 - 游戏物理:实现简单的重力、摩擦力等物理效果。
- 碰撞检测:学习更精确的碰撞检测算法,如 AABB (轴对齐边界框)。
- 数据加载:使用
URLLoader从外部加载文本、XML 或 JSON 数据。 - 声音处理:使用
Sound类加载和播放背景音乐、音效。 - AIR 应用开发:使用 AS3 开发桌面或移动应用,可以访问文件系统、摄像头等原生功能。
第十章:学习资源
- 官方文档 (最重要):
- Adobe ActionScript 3.0 (AS3) 参考:最权威的资料,查找所有类、方法、属性的详细说明。
- 社区与教程:
- Kirupa.com:经典的 Flash/AS3 教程网站,内容非常扎实。
- Flash Game Dojo:专注于 AS3 游戏开发的教程。
- Gamedev.net - Flash/AS3 板块:一个活跃的游戏开发者社区。
- 代码库与框架:
ActionScript 3.0 是一门功能强大且优雅的语言,虽然 Adobe Flash Player 的时代已经过去,但 AS3 的许多思想(如事件驱动、面向对象)在现代前端开发中依然适用,掌握 AS3 不仅能让你开发经典的 Flash 内容,也能为你学习其他编程语言打下坚实的基础。
祝你学习愉快!
