分享
 
 
 

Flash ActionScript2.0面向对象游戏开发

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

概述:

Flash ActionScript2.0是一种面向对向的编程语言,利用它可以开发出功能强大的应用程序.以早期的ActionScript 1.0相比,它在结构化编程上具有明显的优势,可以使程序具有更强的可移植性,可重性,和伸缩性.

本文通过一个推箱子游戏的开发过程来逐步讲述如何利用ActionScript2.0 进行开发.

结构分析:

在进行一个项目的开发前,项目规化是必不可少的.我们先来思考一下推箱子游戏包含哪些必要的元素呢?

一个玩家(Player)

至少一个箱子(Box)

和箱子数目一样的目标地(Target)

数目不定的砖块(Brick)

砖块连在一下组成了墙壁(Wall)

一个游戏管理者(Manager)

一些显示游戏信息的控件

我们都需要将这些元素抽象化为对象(Object),各个对象包含有各自特有的属性和方法.比如,玩家具有位置属性(currentPos),它表示玩家当全的位置,玩家还有move方法,它使玩家移到下一个位置.等腰三角形这些问题搞清楚了,我们就要进行具体的实现.

实现过程:

打开Flash,新建"动作脚本文件",依次建立如下.as文件,注意要把它们放在同一个目录下.源文件如下:

//*********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;

}

}

//************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++;

}

}

}

}

}

//*************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;

}

}

//*************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;

}

}

}

}

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";

}

}

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

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有