Flash贪吃蛇游戏
修正星幻提的BUG很简单的游戏:(不过完全是自己编的,成就感)
swf 和fla文件:
http://www.flashbao.com/bbs/UploadFile/2006-6/20066417453532329.rar
main.fla
第一帧:actionScrtpt(注释一起发了……)
/**************************************
* DesignedBy iptton@gmail.com
*
*
* Code By iptton@gmail.com
*
* Pan's Studio
* 2006/5/26
*****************************************/
/*
数据结构:循环链表:
算法: 每移动一次 {
如果(当前前进位置没有豆){
表尾的数据改变为表头加前进差数;
头指针指向尾部;
}否则{
插入,并头指针指向新元素;
}
}
图形绘制: 1、FLASH绘图API
2、MC的attach
3、MC的隐显(预先排列好,并设为不可见)
备忘录:图形绘制中哪个更好 内存的占用哪个更低(上MM主页查看关于MC结构的内容)
MC: 空MC两个 beansnake
bean snake 顾名思义……
wallMC,透明,占有空间为蛇所能生存的区域。(本想做成真正意义上的wall不过遇到点小问题,
不想在这上面花时间就改了,有点名不副实了……)
*/
/*详细设计
主要变量及函数:
SSetInterval();用于控制 蛇按一定间隔时间移动,
interval:前进时间间隔
SIZE:每节蛇的大小(等宽长)
point:指针
head:头指针
tail:尾指针
pos 位置,拟用整数表示,下称伪坐标,直观。绘图前再做转换。
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 = new p2d(10, i + 9);
_global.point = i + 1;
//trace("X:"+_global.pos.x+"Y:"+_global.pos.y)
//trace("Point to:"+_global.point);
}
//trace(_global.point);
_global.point = head;
//trace(_global.point);
}
function listAddElem(tmp:p2d)
{
//trace("Enter Add Elem FUNCTION");
_global.curLen++;
if (_global.curLen >= MAXLEN)
{
win();
}
lTmp = _global.curLen - 1;
_global.pos = tmp;
hTmp = _global.head;
_global.head = lTmp;
_global.point = hTmp;
_global.point = _global.head;
}
function chHead()
{
_global.head = _global.tail;
//设置新头位
this.tmpa = _global.point;
while (1)
{
this.tmpa = _global.point;
if (_global.point == _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.x, _global.pos.y, _root.snake);
//trace("In ReDraw FUNCTION :tmp=" + tmp);
tmp = _global.point;
}
}
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.x;
dy += _global.pos.y;
for (i = 0; i < _global.curLen; i++)
{
if (dx == _global.pos.x && dy == _global.pos.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.x = dx;
_global.pos.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 编辑 ] 及及。。。
不错,不知可不可以和大家分享一下呢 源文件:只上传了main.fla
http://www.flashbao.com/flashfile/纯AS版贪吃蛇.fla
[ 本帖最后由 iptton 于 2006-6-2 18:49 编辑 ] 两年前做的Flashgame
https://www.gdutbbs.com/thread-52020-2-1.html
那时刚出FlashMX2004, 不过用的还是旧的Actionscript 1.0
[ 本帖最后由 Monkeylee 于 2006-5-28 23:46 编辑 ] 加了个精华,期待楼主更多的作品。。。 原帖由 Monkeylee 于 2006/5/28 15:44 发表
两年前做的Flashgame
https://www.gdutbbs.com/thread-52020-2-1.html
那时刚出FlashMX2004, 不过用的还是旧的Actionscript 1.0
你另外开张帖子吧,贴埋源码出来分享下心得。
本版现在很缺精华贴啊。。。 之所以写成纯AS版是想方便于移到其它语言 因为其它工具一般没有类似MC的东东
[ 本帖最后由 iptton 于 2006-5-29 01:29 编辑 ] 原帖由 Monkeylee 于 2006-5-28 23:44 发表
两年前做的Flashgame
https://www.gdutbbs.com/thread-52020-2-1.html
那时刚出FlashMX2004, 不过用的还是旧的Actionscript 1.0
不知算法和我的有什么不同?分享下……源码…… 源码在家里的机子上...现在文件好像下载不了, 打不开....wool那里还有没有, 传个backup上来.
主要是用了简单的hitTest判断碰撞, 控制方便用鼠标, 写了个简单的缓冲函数来移动, 敌机方面仅是简单的setInterval产生随机的敌机, 击中对象后随机产生bonus... 原来是雷电之类的飞机游戏呀 不过EXE可以转回SWF的,再用精灵转FLA
不过,现在连EXE都没有…… 其实当时刚接触到一个隐藏类ASBroadcast, 一时兴趣就写了这么个游戏.
ASBroadcast可以看我以前写的一个例子
http://www.flashempire.net/showpost.php?p=1164514&postcount=46
现在好像已经作为公开的类了...其实写Flash Actionscript没必要去对隐藏类做什么研究, 都不成熟的..
[ 本帖最后由 Monkeylee 于 2006-5-29 13:48 编辑 ] 偶用AS学编程……并非真想在FLASH上深入研究……
所有类,都自己写……
目前想写个3D引擎…… 不过恐怕要很久…… 维艺上面很早就有3D引擎了, 可以参考一上. 偶也两年没碰Flash Actionscript了, 咔咔....DotNet Coder. 我知道呀
不过,想自己做,从中应该可以学到很多东西
好像有点bug喔……
当我正在前进时,很快的按下后或者上后,就会出现失败了BUG 修正了
原有BUG:同时按下左后或右后会直接输加了个判断
应该可以了 着手面向对象化。。。
发现难度不小。。。
完全没有真正的面向对象编程经验
页:
[1]