杰瑞科技汇

Flash AS3教程该怎么学?

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 代码,目前最主流的选择是:

Flash AS3教程该怎么学?-图1
(图片来源网络,侵删)
  1. Adobe Animate (原 Flash Professional CC)

    • 简介:Adobe 官方的创作工具,你可以用它来绘制图形、制作动画,并直接编写和测试 AS3 代码。
    • 优点:可视化编辑与代码编写无缝结合,非常适合初学者和设计师。
    • 如何创建 AS3 文档
      • 打开 Animate,选择 文件 -> 新建
      • 在 "常规" 选项卡中,选择 "ActionScript 3.0"。
      • 点击 "创建"。
  2. 代码编辑器 (推荐)

    • Visual Studio Code (VS Code):免费、强大、插件丰富,通过安装 "CreateJS" 或 "ActionScript" 插件,可以获得很好的代码提示和高亮。
    • Flash Builder:Adobe 早期的专业 AS3 开发环境,现在已停止更新,但仍有开发者在使用。
    • FlashDevelop:一款免费的开源 AS3 开发环境,曾经非常流行,配置稍复杂。

推荐路径:初学者使用 Adobe Animate,因为它能让你立即看到代码和视觉元素的互动效果,进阶开发者可以使用 VS Code 进行纯代码开发。


第三章:第一个 AS3 程序 - "Hello, World!"

  1. 创建场景和时间轴

    Flash AS3教程该怎么学?-图2
    (图片来源网络,侵删)
    • 在 Animate 中新建一个 AS3 文档。
    • 默认情况下,你有一个名为 "图层 1" 的图层和第 1 帧。
  2. 编写代码

    • 在时间轴上选择第 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);
  3. 测试影片

    • Ctrl + Enter (Windows) 或 Cmd + Enter (Mac)。
    • 你会看到一个 SWF 文件窗口,其中显示 "你好,AS3!"。
    • "输出" 面板会显示 "Hello, World! 欢迎来到 ActionScript 3.0 的世界!"。

第四章:核心语法基础

  1. 变量与数据类型

    • 变量:用于存储数据的容器,使用 var 关键字声明。
    • 数据类型:AS3 是强类型语言,声明变量时最好指定类型。
      • String:字符串,如 "你好"
      • Number:数字,如 123, 14
      • int:整数,如 100
      • uint:无符号整数,如 50
      • Boolean:布尔值,truefalse
      • 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};
  2. 运算符

    Flash AS3教程该怎么学?-图3
    (图片来源网络,侵删)
    • 算术运算符:, , , , (取余)
    • 赋值运算符:, , , ,
    • 比较运算符: (等于), (不等于), > (大于), < (小于)
    • 逻辑运算符&& (与), (或), (非)
  3. 条件语句

    • if...elseif...else if...else
    var score:int = 85;
    if (score >= 90) {
        trace("优秀!");
    } else if (score >= 60) {
        trace("及格。");
    } else {
        trace("不及格。");
    }
  4. 循环语句

    • 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++; // 别忘了增加计数器,否则会死循环!
    }
  5. 函数

    • 函数是一组可重复执行的代码块。
    • 使用 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); // 输出: 计算结果是: 30
    • void 表示该函数没有返回值。

第二部分:面向对象编程与显示列表

第五章:面向对象编程

AS3 的核心是 OOP,理解类和对象是关键。

  1. 类与对象

    • :是创建对象的“蓝图”或“模板”,它定义了对象具有的属性(数据)和方法(行为)。
    • 对象:是类的具体实例。
  2. 创建一个类

    • 在 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);
            }
        }
    }
  3. 使用类

    • 回到你的 .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);

第四部分:项目实战

第八章:制作一个简单的弹球游戏

让我们综合运用所学知识,创建一个经典的弹球游戏。

目标

  1. 一个可以左右移动的挡板。
  2. 一个在屏幕内弹跳的小球。
  3. 小球碰到挡板会反弹,碰到墙壁也会反弹。
  4. 小球掉出屏幕底部,游戏结束。

步骤

  1. 准备素材

    • 在 Animate 中,绘制一个长方形,转换为影片剪辑,命名为 Paddle,并在"链接"属性中勾选"为 ActionScript 导出"。
    • 同样,绘制一个圆形,转换为影片剪辑,命名为 Ball,并勾选"为 ActionScript 导出"。
  2. 编写主时间轴代码 (在 .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();
  3. 测试游戏

    • Ctrl + Enter 运行。
    • 使用键盘的左右方向键控制挡板,尝试接住小球。

第五部分:进阶与资源

第九章:后续学习方向

完成以上教程后,你可以探索以下更高级的主题:

  • 动画与缓动:使用 Tween 类或第三方库(如 GreenSock/TweenLite)让动画更流畅。
  • 游戏物理:实现简单的重力、摩擦力等物理效果。
  • 碰撞检测:学习更精确的碰撞检测算法,如 AABB (轴对齐边界框)。
  • 数据加载:使用 URLLoader 从外部加载文本、XML 或 JSON 数据。
  • 声音处理:使用 Sound 类加载和播放背景音乐、音效。
  • AIR 应用开发:使用 AS3 开发桌面或移动应用,可以访问文件系统、摄像头等原生功能。

第十章:学习资源

ActionScript 3.0 是一门功能强大且优雅的语言,虽然 Adobe Flash Player 的时代已经过去,但 AS3 的许多思想(如事件驱动、面向对象)在现代前端开发中依然适用,掌握 AS3 不仅能让你开发经典的 Flash 内容,也能为你学习其他编程语言打下坚实的基础。

祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇