Flash ActionScript2.0物件導向遊戲開發

來源:互聯網
上載者:User
對象

概述:

Flash ActionScript2.0是一種面向對向的程式設計語言,利用它可以開發出功能強大的應用程式.以早期的ActionScript 1.0相比,它在結構化編程上具有明顯的優勢,可以使程式具有更強的可移植性,可重性,和伸縮性.

本文通過一個推箱子遊戲的開發過程來逐步講述如何利用ActionScript2.0 進行開發.

結構分析:

在進行一個項目的開發前,項目規化是必不可少的.我們先來思考一下推箱子遊戲包含哪些必要的元素呢?

  • 一個玩家(Player)
  • 至少一個箱子(Box)
  • 和箱子數目一樣的目標地(Target)
  • 數目不定的磚塊(Brick)
  • 磚塊連在一下組成了牆壁(Wall)
  • 一個遊戲管理者(Manager)
  • 一些顯示遊戲資訊的控制項

我們都需要將這些元素抽象化為對象(Object),各個對象包含有各自特有的屬性和方法.比如,玩傢具有位置屬性(currentPos),它表示玩家當全的位置,玩家還有move方法,它使玩家移到下一個位置.等腰三角形這些問題搞清楚了,我們就要進行具體的實現.

實現過程:

  1. 開啟Flash,建立"動作指令檔",依次建立如下.as檔案,注意要把它們放在同一個目錄下.源檔案如下:
  2. //*********Pos.as*********
    //用來表示遊戲中物體位置的類
    //遊戲中所有對象的位置都為此類的執行個體
    //用col,row 兩個量確定物體的位置
    class Pos {
    var col:Number;// 列值
    var row:Number;// 行值

    //建構函式
    function Pos(c, r) {
    col = c;
    row = r;
    }

    //判斷兩個位置是否重合
    function equals(t):Boolean {
    return (col == t.col && row == t.row);
    }

    //根據方向值,取得此位置的下一個位置
    function getNextPos(d):Pos{
    var nextPos:Pos;
    nextPos=new Pos(col,row);
    switch (d) {
    case 0 :
    nextPos.col++;

    break;
    case 1 :
    nextPos.row++;
    break;
    case 2 :
    nextPos.col--;
    break;
    case 3 :
    nextPos.row--;
    break;
    }
    return nextPos;
    }
    }
  3. //************Wall.as************
    //用來構建遊戲中的牆壁
    class Wall extends MovieClip {
    var brickMatrix:Array;//表示牆壁形狀的數組
    var left:Number;//左位移量
    var top:Number;//上位移量
    var bricks:Array;//用來存放磚塊電影剪輯的數組
    var _stepSize:Number;//每塊磚的位移量

    //建構函式
    function Wall() {
    left = 0;
    top = 0;
    _stepSize = 40;


    }


    //設定牆壁形狀數組
    function setMatrix(b) {

    bricks = new Array();
    brickMatrix = b;
    }

    //按照牆壁形狀數組修牆
    function build():Void {
    var index = 0;
    for (var i = 0; i<brickMatrix.length; i++) {
    for (var j = 0; j<brickMatrix[0].length; j++) {
    if (brickMatrix[i][j] == 1) { //數組值為1,畫一塊磚
    bricks[index] = attachMovie("Brick", "bricks"+index, this.getNextHighestDepth());
    bricks[index]._x = left+j*_stepSize;
    bricks[index]._y = top+i*_stepSize;
    index++;
    }
    }
    }
    }
    }
  4. //*************Target.as*****************
    class Target extends MovieClip{
    var pos:Pos;
    var finished:Boolean;
    var left:Number;
    var top:Number;
    var _stepSize:Number;
    function Target(){
    finished=false;
    left=0;
    top=0;
    _stepSize=40;

    }
    function setPos(p){
    pos=p;
    this._x=left+pos.col*_stepSize;
    this._y=top+pos.row*_stepSize;
    }
    }
  5. //*************Player.as**************
    //遊戲中的player
    class Player extends MovieClip {

    var _stepSize:Number;//步長
    var _wall:MovieClip;//牆壁電影剪綵輯
    var startPos:Pos;//初始置
    var currentPos:Pos;//當前位置
    var left:Number;//左邊距
    var top:Number;//上邊距
    var dir:Number;//移動方向
    var boxes:Array;
    var player_path_stack:Array;//玩家移動的路線
    var boxes_path_stack:Array;//箱子移動的路線

    //建構函式,初始化
    function Player() {
    _stepSize = 40;
    currentPos = null;
    left = 0;
    top = 0;
    dir = 0;
    player_path_stack=new Array();
    boxes_path_stack=new Array();

    boxes = new Array();
    }


    //設定玩家的起始位置
    function setStartPos(p) {
    startPos = new Pos(p.col, p.row);
    currentPos = startPos;
    this._x = currentPos.col*_stepSize+left;
    this._y = currentPos.row*_stepSize+top;

    }

    //為玩家指定一個wall執行個體
    function setWall(w) {
    _wall = w;
    }

    //為玩家指定一個boxes數組,存有所有的箱子執行個體
    function setBoxes(b) {
    boxes = b;
    }


    //通過按鍵控制玩家
    function setKeyHandle() {
    this.onKeyDown = function() {

    if (Key.isDown(Key.LEFT)) {
    dir = 2;//左鍵

    } else if (Key.isDown(Key.RIGHT)) {
    dir = 0;//右鍵

    } else if (Key.isDown(Key.UP)) {
    dir = 3;//上鍵

    } else if (Key.isDown(Key.DOWN)) {
    dir = 1;//下鍵

    }
    var nextObject = this.getNextObject(); //取得玩家下一個位置上的物體

    if (nextObject == "BOX") { //玩家下一個位置上是個箱子
    var box_pushed = getPushedBox();//取得此位置上的這個箱子

    //被推到的箱子存在
    if (box_pushed) {


    if (box_pushed.getNextObject() == "NOTHING") {//被推箱子的下個位置沒有障礙

    boxes_path_stack.push({box:box_pushed,pos:new Pos(box_pushed.pos.col,box_pushed.pos.row)});
    box_pushed.move();//被推箱子移一步
    this.move();//玩家移一步

    }

    }

    } else if (nextObject == "NOTHING") {//玩家的下個位置玩障礙
    this.move();
    boxes_path_stack.push(null);
    }

    };
    Key.addListener(this); //監聽按鍵輸入
    }

    //取得被推到的箱子
    function getPushedBox() {
    var nextPos:Pos;
    nextPos =currentPos.getNextPos(dir);


    for (var i = 0; i<boxes.length; i++) {
    if (boxes[i].pos.equals(nextPos)) {
    return boxes[i];
    break;
    //trace(box_pushed);
    }
    }
    return null;
    }


    //取得玩家下個位置上的物塊類型( 牆壁, 箱子, 無障礙)
    function getNextObject():String {
    //var obj:String;
    var nextPos:Pos;
    nextPos = currentPos.getNextPos(dir);

    if (_wall.brickMatrix[nextPos.row][nextPos.col] == 1) {
    return "WALL";
    }
    for (var i = 0; i<boxes.length; i++) {
    if (boxes[i].pos.equals(nextPos)) {
    return "BOX";
    }
    }
    return "NOTHING";
    }

    //移到下個位置
    function move() {
    player_path_stack.push(currentPos);

    var c=currentPos.getNextPos(dir);
    currentPos=c;
    this._x = left+this.currentPos.col*_stepSize;
    this._y = top+this.currentPos.row*_stepSize;

    }

    //返回上一步
    function reback(){
    if(player_path_stack.length>0){
    var pre=player_path_stack.pop();
    currentPos=pre;
    this._x = left+this.currentPos.col*_stepSize;
    this._y = top+this.currentPos.row*_stepSize;
    }
    if(boxes_path_stack.length>0 ){
    var obj=boxes_path_stack.pop();
    if(obj!=null){
    var box=obj.box;
    var pos=obj.pos;
    box.pos=pos;
    box._x=box.left+box.pos.col*box._stepSize;
    box._y=box.top+box.pos.row*box._stepSize;
    }
    }
    }
    }

  6. class Box extends MovieClip {
    var pos:Pos;
    var left:Number;
    var top:Number;
    var _wall:MovieClip;
    var player:MovieClip;
    var _stepSize:Number;
    var _targets:Array;
    var finished:Boolean;//此箱子是否到達目標地

    function Box() {
    left = 0;
    top = 0;
    finished = false;
    _stepSize = 40;
    }

    //設定目標地
    function setTargets(t) {
    _targets = new Array();
    _targets = t;
    }

    //設定箱子的起始位置若罔聞
    function setStartPos(p) {
    pos = new Pos(p.col, p.row);
    this._x = pos.col*_stepSize+left;
    this._y = pos.row*_stepSize+top;
    }

    //移到下一個位置
    function move() {
    var c = pos.getNextPos(player.dir);
    pos = c;
    this._x = left+pos.col*_stepSize;
    this._y = top+pos.row*_stepSize;
    gotTarget();
    }

    //是否到達目標地
    function gotTarget() {
    for (var i = 0; i<_targets.length; i++) {
    if (this.pos.equals(_targets[i].pos)) {
    if (this.getDepth()>_targets[i].getDepth()) {
    this.swapDepths(_targets[i]);
    }
    this.finished = true;
    return;
    }
    }
    this.finished = false;
    }

    //取得一下個位置上物體的類型
    function getNextObject():String {
    //var obj:String;
    var nextPos:Pos;
    nextPos = pos.getNextPos(player.dir);
    if (_wall.brickMatrix[nextPos.row][nextPos.col] == 1) {
    return "WALL";
    }
    for (var i = 0; i<player.boxes.length; i++) {
    if (player.boxes[i].pos.equals(nextPos)) {
    return "BOX";
    }
    }
    return "NOTHING";
    }
    }
  7. class Matrix{
    //用來存放遊戲各關中初始介面
    static var matrixs:Array;

    function Matrix(){
    matrixs=new Array();
    //0:null
    //1:wall
    //2:player
    //3:box
    //4:target
    //5:target and box
    //1 2 3 4 5 6 7 8 9
    matrixs[0]= [[0, 0, 0, 0, 0, 0, 0, 0, 0],//1
    [0, 0, 0, 0, 0, 0, 0, 0, 0],//2
    [0, 0, 0, 0, 0, 0, 0, 0, 0],//3
    [0, 0, 0, 0, 0, 0, 0, 0, 0],//4
    [0, 0, 0, 0, 0, 0, 0, 0, 0],//5
    [0, 0, 0, 0, 0, 0, 0, 0, 0],//6
    [0, 0, 0, 0, 0, 0, 0, 0, 0],//7
    [0, 0, 0, 0, 0, 0, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];

    //1 2 3 4 5 6 7 8 9
    matrixs[1]= [[0, 1, 1, 1, 1, 1, 1, 0, 0],//1
    [1, 1, 1, 0, 0, 0, 1, 0, 0],//2
    [1, 0, 3, 0, 1, 0, 1, 1, 0],//3
    [1, 0, 1, 0, 0, 4, 0, 1, 0],//4
    [1, 0, 0, 0, 0, 1, 0, 1, 0],//5
    [1, 1, 0, 1, 0, 0, 0, 1, 0],//6
    [0, 1, 2, 0, 0, 1, 1, 1, 0],//7
    [0, 1, 1, 1, 1, 1, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    //1 2 3 4 5 6 7 8 9
    matrixs[2]= [[0, 0, 1, 1, 1, 1, 1, 0, 0],//1
    [1, 1, 1, 0, 0, 0, 1, 0, 0],//2
    [1, 0, 3, 0, 1, 0, 1, 1, 0],//3
    [1, 0, 1, 0, 0, 4, 0, 1, 0],//4
    [1, 0, 0, 0, 0, 1, 0, 1, 0],//5
    [1, 1, 3, 1, 4, 0, 0, 1, 0],//6
    [0, 1, 2, 0, 0, 1, 1, 1, 0],//7
    [0, 1, 1, 1, 1, 1, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];

    //1 2 3 4 5 6 7 8 9
    matrixs[3]= [[1, 1, 1, 1, 1, 1, 1, 1, 0],//1
    [1, 0, 0, 0, 1, 0, 0, 1, 0],//2
    [1, 0, 0, 0, 0, 0, 0, 1, 0],//3
    [1, 1, 3, 1, 1, 0, 0, 1, 0],//4
    [0, 1, 0, 4, 1, 0, 1, 1, 1],//5
    [0, 1, 0, 0, 0, 0, 2, 0, 1],//6
    [0, 1, 0, 0, 1, 0, 0, 0, 1],//7
    [0, 1, 1, 1, 1, 1, 1, 1, 1],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];

    //1 2 3 4 5 6 7 8 9
    matrixs[4]= [[1, 1, 1, 1, 1, 1, 1, 1, 0],//1
    [1, 0, 0, 0, 1, 0, 0, 1, 0],//2
    [1, 0, 0, 0, 0, 0, 0, 1, 0],//3
    [1, 1, 5, 1, 1, 0, 0, 1, 0],//4
    [0, 1, 0, 4, 1, 0, 1, 1, 1],//5
    [0, 1, 0, 5, 0, 3, 2, 0, 1],//6
    [0, 1, 0, 0, 1, 0, 0, 0, 1],//7
    [0, 1, 1, 1, 1, 1, 1, 1, 1],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    //1 2 3 4 5 6 7 8 9
    matrixs[5]= [[0, 0, 1, 1, 1, 1, 0, 0, 0],//1
    [0, 1, 1, 0, 0, 1, 1, 1, 1],//2
    [1, 1, 0, 0, 0, 0, 0, 0, 1],//3
    [1, 0, 3, 0, 1, 2, 1, 0, 1],//4
    [1, 0, 1, 0, 4, 0, 0, 0, 1],//5
    [1, 0, 0, 3, 0, 1, 1, 1, 1],//6
    [1, 1, 1, 0, 4, 1, 0, 0, 0],//7
    [0, 0, 1, 1, 1, 1, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    //1 2 3 4 5 6 7 8 9
    matrixs[6]= [[0, 0, 1, 1, 1, 1, 0, 0, 0],//1
    [0, 1, 1, 0, 0, 1, 1, 1, 1],//2
    [1, 1, 0, 0, 3, 0, 0, 0, 1],//3
    [1, 0, 3, 0, 1, 2, 1, 0, 1],//4
    [1, 0, 1, 0, 4, 0, 0, 0, 1],//5
    [1, 0, 4, 3, 0, 1, 1, 1, 1],//6
    [1, 1, 1, 0, 4, 1, 0, 0, 0],//7
    [0, 0, 1, 1, 1, 1, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    //1 2 3 4 5 6 7 8 9
    matrixs[7]= [[0, 1, 1, 1, 1, 1, 0, 0, 0],//1
    [0, 1, 0, 0, 0, 1, 0, 0, 0],//2
    [1, 1, 3, 1, 0, 1, 1, 1, 0],//3
    [1, 0, 0, 0, 3, 2, 0, 1, 0],//4
    [1, 0, 1, 0, 0, 1, 0, 1, 0],//5
    [1, 0, 1, 4, 0, 4, 0, 1, 0],//6
    [1, 0, 0, 0, 1, 1, 1, 1, 0],//7
    [1, 1, 1, 1, 1, 0, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    //1 2 3 4 5 6 7 8 9
    matrixs[8]= [[0, 1, 1, 1, 1, 1, 0, 0, 0],//1
    [0, 1, 0, 0, 0, 1, 0, 0, 0],//2
    [1, 1, 3, 1, 0, 1, 1, 1, 0],//3
    [1, 0, 0, 4, 3, 2, 0, 1, 0],//4
    [1, 0, 1, 0, 0, 1, 0, 1, 0],//5
    [1, 0, 1, 4, 4, 3, 0, 1, 0],//6
    [1, 0, 0, 0, 1, 1, 1, 1, 0],//7
    [1, 1, 1, 1, 1, 0, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    //1 2 3 4 5 6 7 8 9
    matrixs[9]= [[0, 1, 1, 1, 1, 1, 1, 1, 0],//1
    [0, 1, 0, 2, 4, 4, 4, 1, 0],//2
    [0, 1, 0, 0, 0, 1, 1, 1, 1],//3
    [1, 1, 1, 3, 0, 0, 0, 0, 1],//4
    [1, 0, 0, 0, 1, 3, 1, 0, 1],//5
    [1, 0, 3, 0, 1, 0, 0, 0, 1],//6
    [1, 0, 0, 0, 1, 1, 1, 1, 1],//7
    [1, 1, 1, 1, 1, 0, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    //1 2 3 4 5 6 7 8 9
    matrixs[10]= [[0, 0, 1, 1, 1, 1, 0, 0, 0],//1
    [0, 0, 1, 0, 0, 1, 0, 0, 0],//2
    [0, 0, 1, 0, 0, 1, 0, 0, 0],//3
    [0, 0, 1, 0, 0, 1, 1, 1, 0],//4
    [0, 0, 1, 4, 3, 3, 2, 1, 0],//5
    [0, 0, 1, 0, 0, 4, 0, 1, 0],//6
    [0, 0, 1, 0, 0, 1, 1, 1, 0],//7
    [0, 0, 1, 1, 1, 1, 0, 0, 0],//8
    [0, 0, 0, 0, 0, 0, 0, 0, 0] //9
    ];
    }

    function getMatrix(d){
    return matrixs[d];
    }

    }


  8. //****************Manager.as*************
    //用來管理遊戲
    //所有的對象都入其中
    //MovieClip類的子類
    class Manager extends MovieClip {
    var wall:MovieClip;
    var player:MovieClip;
    var boxes:Array;
    var targets:Array;
    var stageNum:Number;//遊戲的當前關數


    function Manager() {
    _x=50;
    _y=50;
    }

    //遊戲初始化
    function init(s) {
    stageNum = s;

    boxes = new Array();
    targets = new Array();

    var brickMatrixT = new Matrix().getMatrix(stageNum);//根據關數從矩陣類中取得相應的矩陣

    //修牆
    wall = attachMovie("Wall", "wall", this.getNextHighestDepth());
    wall.setMatrix(brickMatrixT);
    wall.build();

    //建立一個玩家
    player = attachMovie("Player", "plyaer", this.getNextHighestDepth());
    player.setWall(wall);
    player.setKeyHandle();//監聽鍵盤輸入


    for (var i = 0; i<brickMatrixT.length; i++) {
    for (var j = 0; j<brickMatrixT[0].length; j++) {
    if (brickMatrixT[i][j] == 2) {
    player.setStartPos(new Pos(j, i));
    }
    if (brickMatrixT[i][j] == 3) {
    var d = this.getNextHighestDepth();
    var box = attachMovie("Box", "box"+i+j, d);
    box.setStartPos(new Pos(j, i));
    box.player = player;
    box._wall = wall;
    boxes.push(box);
    }
    if (brickMatrixT[i][j] == 4) {
    var d = this.getNextHighestDepth();
    var t = attachMovie("Target", "target"+i+j, d);
    t.setPos(new Pos(j, i));
    targets.push(t);
    }
    if (brickMatrixT[i][j] == 5) {
    var d = this.getNextHighestDepth();
    var box = attachMovie("Box", "box"+i+j, d);
    box.setStartPos(new Pos(j, i));
    box.player = player;
    box._wall = wall;
    box.finished = true;
    boxes.push(box);
    var d1 = this.getNextHighestDepth();
    var t = attachMovie("Target", "target"+i+j, d1);
    t.setPos(new Pos(j, i));
    targets.push(t);
    }
    }
    }


    for (var i = 0; i<boxes.length; i++) {
    boxes[i].setTargets(targets);
    }

    player.setBoxes(boxes);
    player.swapDepths(this.getNextHighestDepth());
    }
    //判斷遊戲是否結束
    function ifWin() {
    var win = true;
    for (var i = 0; i<boxes.length; i++) {
    win = boxes[i].finished && win;
    }

    return win;
    }
    }
  9. 建立"Flash文檔",命名為"push_box",並將它和以上指令檔存在同一目錄下.以下要做的就是建立要用到的電影剪輯,並將其和相應的指令檔建立連結.
  10. 按"Ctrl+F8",建立一個電影剪輯,命名為"Player",在編輯狀態下畫一個長,寬都為40象素的小人(_stepSize=40),注意,小人的註冊點放在左上腳.畫完後在電影庫中,右擊"Player",選擇"為動作腳下本匯出",其它不選."標識符","As 2.0類"都為電影剪輯名"Player".要注意,大小寫不能搞錯,否則會出錯.
  11. 按上述方法依次建立"Box","Target"剪輯.
  12. 按10建立名為"Brick"的剪輯,不過由於它不需要外部指令檔,故"As 2.0"中不要添.
  13. 按10建立"Wall"剪輯,稍有不同的是,在編輯狀態下,第一幀中加"stop()",第二幀中加入一個"Brick"剪輯.這樣做是因為"Wall"在修建時需要用到"Brick".
  14. 按12建立"Manager"剪輯,不同的是需要點中“在第一幀匯出”,而且第二幀加入的不是"Brick",而是"Wall","Player","Box","Target".
  15. 好了,一切就緒,我們可以測試一下了.在主時間軸上第一幀中中入語句:attachMovie("Manager","game1",_root.getNextHighestDepth()); game1.init(1);就可以運行第一關了.
  16. 至於如何建立友好的使用者介面,我們只需稍花點力氣就搞定了.

  樣本:

點擊這裡下載源檔案

  如果你還有任何不明白之處,可發郵件或QQ給我.xiake1860@ncepubj.edu.cn QQ:4077130



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。