|
修正星幻提的BUG
很简单的游戏:(不过完全是自己编的,成就感 )
swf 和 fla 文件:
http://www.flashbao.com/bbs/Uplo ... 066417453532329.rar
main.fla
第一帧:actionScrtpt(注释一起发了……)
- /**************************************
- * Designed By [email protected]
- *
- *
- * Code By [email protected]
- *
- * Pan's Studio
- * 2006/5/26
- *****************************************/
- /*
- 数据结构:循环链表:
-
- 算法: 每移动一次 {
- 如果(当前前进位置没有豆){
- 表尾的数据改变为表头加前进差数;
- 头指针指向尾部;
- }否则{
- 插入,并头指针指向新元素;
- }
- }
- 图形绘制: 1、FLASH 绘图API
- 2、MC的attach
- 3、MC的隐显(预先排列好,并设为不可见)
- 备忘录:图形绘制中哪个更好 内存的占用哪个更低 (上MM主页查看关于MC结构的内容)
- MC: 空MC两个 bean snake
- bean snake 顾名思义……
- wallMC,透明,占有空间为蛇所能生存的区域。(本想做成真正意义上的wall不过遇到点小问题,
- 不想在这上面花时间就改了,有点名不副实了……)
- */
- /*详细设计
- 主要变量及函数:
- SSetInterval();用于控制 蛇按一定间隔时间移动,
- interval:前进时间间隔
- SIZE:每节蛇的大小(等宽长)
- point[MAXLEN]:指针
- head:头指针
- tail:尾指针
- pos[MAXLEN] 位置,拟用整数表示,下称伪坐标,直观。绘图前再做转换。
- curLen当前蛇的长度
- point[]指针
- creatList()链表初始化
- listAddElem()添加元素
- chHead()头指针指向尾指针所在数据,尾指针指向原尾针之前的数据
- 绘图:(API式)
- drawSnake(x,y,i):画一节蛇,i为0时抹掉
- realX(x)将伪坐标变为真实的坐标
- realY(y)将伪坐标变为真实的坐标
- 判断:
- 处理入口:go()
- 键盘响应:用Key类
- “吃豆”:bean.hitTest(x,y)
- 障碍判断:wall.hitTest(x,y)
- */
- /*
- 豆的生成
-
- 采用蛇的生成函数,改变着色。
-
- */
- /*扩展功能:
- 级别:
- 称动速度,障碍。
- 保存成绩
- 供用户选择的玩法:1、蛇的长度是否在升级后变成初始态
- 2、易难度的选择
- */
- stop();
- //本
- oKey = new Object();
- _global.dir = 1;
- //0 RIGHT 1 UP 3 LEFT 2 DOWN
- _global.XX = 30;
- _root.createEmptyMovieClip("wall", -1);
- _root.wall._x = _global.XX;
- _root.wall._y = _global.XX;
- _global.bChDir = true;
- with (_root.wall)
- {
- lineStyle(1, 0x001399);
- beginFill(0x666666, 50);
- moveTo(0, 0);
- lineTo(480, 0);
- lineTo(480, 320);
- lineTo(0, 320);
- endFill();
- }
- _global.WIDTH = _root.wall._width / 10;
- _global.HEIGHT = _root.wall._height / 10;
- _global.SIZE = 9;
- _global.MAXLEN = 30;
- _global.head = 0;
- _global.curLen = 5;
- _global.tail = curLen - 1;
- _global.point = new Array(MAXLEN);
- _global.pos = new Array(MAXLEN);
- _global.ate = true;
- _global.timer;
- _global.interval = 100;
- _root.createEmptyMovieClip("snake", 1);
- snake._x = _global.XX;
- snake._y = _global.XX;
- _root.createEmptyMovieClip("bean", 2);
- bean._x = _global.XX;
- bean._y = _global.XX;
- /*========================================*/
- /* 开始 链表操作 开始*/
- function creatList()
- {
- for (i = 0; i < _global.curLen; i++)
- {
- _global.pos[i] = new p2d(10, i + 9);
- _global.point[i] = i + 1;
- //trace("X:"+_global.pos[i].x+"Y:"+_global.pos[i].y)
- //trace("Point to:"+_global.point[i]);
- }
- //trace(_global.point[3]);
- _global.point[_global.tail] = head;
- //trace(_global.point[4]);
- }
- function listAddElem(tmp:p2d)
- {
- //trace("Enter Add Elem FUNCTION");
- _global.curLen++;
- if (_global.curLen >= MAXLEN)
- {
- win();
- }
- lTmp = _global.curLen - 1;
- _global.pos[lTmp] = tmp;
- hTmp = _global.head;
- _global.head = lTmp;
- _global.point[head] = hTmp;
- _global.point[tail] = _global.head;
- }
- function chHead()
- {
- _global.head = _global.tail;
- //设置新头位
- this.tmpa = _global.point[head];
- while (1)
- {
- this.tmpa = _global.point[this.tmpa];
- if (_global.point[this.tmpa] == _global.tail)
- {
- _global.tail = this.tmpa;
- break;
- }
- //设置新的尾位
- }
- }
- /* 结束 链表操作 结束*/
- /*========================================*/
- function SSetInterval(time)
- {
- _global.timer = setInterval(go, time);
- }
- function drawOneDot(ptx, pty, MC)
- {
- ptx = ptx * _global.SIZE;
- pty = pty * _global.SIZE;
- with (MC)
- {
- lineStyle(1, 0xffff00);
- var s = _global.SIZE;
- moveTo(ptx + 2, pty + 2);
- beginFill(0xff0000, 90);
- lineTo(ptx + s - 2, pty + 2);
- lineTo(ptx + s - 2, pty + s - 2);
- lineTo(ptx + 2, pty + s - 2);
- endFill();
- //trace("DRAWED"+MC._name+" "+ptx+" "+ pty+" "+(ptx+s)+" "+(pty +s));
- }
- }
- function reDrawSnakes()
- {
- snake.clear();
- tmp = _global.head;
- for (i = 0; i < curLen; i++)
- {
- drawOneDot(_global.pos[tmp].x, _global.pos[tmp].y, _root.snake);
- //trace("In ReDraw FUNCTION :tmp=" + tmp);
- tmp = _global.point[tmp];
- }
- }
- function crtBean()
- {
- x = Math.round(Math.random() * _global.WIDTH);
- y = Math.round(Math.random() * _global.HEIGHT);
- _root.bean._alpha = 50;
- drawOneDot(x, y, _root.bean);
- }
- function go()
- {
- //trace("go!");
- if (_global.ate)
- {
- crtBean();
- _global.ate = false;
- }
- var dx, dy;
- switch (_global.dir)
- {
- case 0 :
- dx = 1;
- dy = 0;
-
- break;
- //Right
- case 3 :
- dx = -1;
- dy = 0;
-
- break;
- //left
- case 1 :
- dx = 0;
- dy = -1;
-
- break;
- //up
- case 2 :
- dx = 0;
- dy = 1;
-
- break;
- //down
- default :
- /*dx = 0;
- dy = -1;
- _global.bChDir = !_global.bChDir;*/
- break;
- }
- //trace(dx+" "+dy);
- dx += _global.pos[_global.head].x;
- dy += _global.pos[_global.head].y;
- for (i = 0; i < _global.curLen; i++)
- {
- if (dx == _global.pos[i].x && dy == _global.pos[i].y)
- {
- trace("Eating Self!!");
- lose();
- }
- }
- //此处……,本想用hitTest的,没想到MM的hitTest方法是最简单的取图形的两点做距形为响应区。。。
- tmpx = _global.XX + dx * _global.SIZE + _global.SIZE / 2;
- tmpy = _global.XX + dy * _global.SIZE + _global.SIZE / 2;
- if (!_root.wall.hitTest(tmpx, tmpy))
- {
- trace("Hit wall!!");
- lose();
- } else
- {
- if (_root.bean.hitTest(tmpx, tmpy))
- {
- _global.ate = true;
- _root.bean.clear();
- tmpP = new p2d(dx, dy);
- listAddElem(tmpP);
- _global.bChDir=true;
- reDrawSnakes();
- } else
- {
- _global.pos[_global.tail].x = dx;
- _global.pos[_global.tail].y = dy;
-
- chHead();_global.bChDir=true;
- reDrawSnakes();
-
- }
- }
- }
- oKey.onKeyDown = function()
- {
- trace("bChDir="+_global.bChDir);
- if (_global.bChDir)
- {
-
- if (Key.getCode() == Key.RIGHT)
- {
- _global.bChDir = !_global.bChDir;
- _global.dir = (_global.dir == 3) ? 3 : 0;
- } else if (Key.getCode() == Key.LEFT)
- {
- _global.bChDir = !_global.bChDir;
- _global.dir = (_global.dir == 0) ? 0 : 3;
- } else if (Key.getCode() == Key.UP)
- {
- _global.bChDir = !_global.bChDir;
- _global.dir = (_global.dir == 2) ? 2 : 1;
- } else if (Key.getCode() == Key.DOWN)
- {
- _global.bChDir = !_global.bChDir;
- _global.dir = (_global.dir == 1) ? 1 : 2;
- }
- }
- };
- function lose()
- {
- clearInterval(timer);
- trace("YOU LOSE");
- startT.text = "YOU LOSE!! Press Any Key To Restart";
- _root.play();
- }
- function win()
- {
- clearInterval(timer);
- startT.text = "You Win!! Press Any Key To Restart";
- _root.play();
- }
- function startGame()
- {
- startT.text = "Press Any Key To BEGIN!为了保证纯AS不设按钮。。。";
- creatList();
- reDrawSnakes();
- SSetInterval(_global.interval);
- Key.addListener(oKey);
- }
- var enterB:Object = new Object();
- enterB.onKeyDown = function()
- {
- startGame();
- Key.removeListener(this);
- };
- Key.addListener(enterB);
- _root.createTextField("startT", _root.getNextHighestDepth(), 30, 0, 400, 90);
- startT.text = "Press Any Key To BEGIN!为了保证纯AS。。。";
复制代码
每二帧
- stop();
- var enterA:Object = new Object();
- enterA.onKeyDown = function()
- {
- play();
- Key.removeListener(this);
- };
- Key.addListener(enterA);
复制代码
p2d.as
此文件要设好FLASH中的 编辑 /首选参数/ActionScript/ActionScript2.0设置 增加路径为 此文件的路径
- class p2d {
- public var x:Number;
- public var y:Number;
- public function p2d (x, y) {
- //trace ("Enter Structor");
- this.x = x;
- this.y = y;
- }
- }
复制代码
[ 本帖最后由 iptton 于 2006-8-29 20:04 编辑 ] |
|