Flash AS3 TimerEvents:
在通过计时器事件添加snake的部分时遇到问题Flash AS3 TimerEvents:,flash,actionscript-3,timer,Flash,Actionscript 3,Timer,在通过计时器事件添加snake的部分时遇到问题 package { import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.events.TimerEvent; import flash.ui.Keyboard; import flash.utils.Timer; import flash.display.MovieClip; public
package {
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.ui.Keyboard;
import flash.utils.Timer;
import flash.display.MovieClip;
public class Snake extends MovieClip{
private const SPEED :uint = 50;//lower = faster
private const snakeAttach :uint = 400;//lower = faster
private const DIM :int = 71; //keep this number uneven to have the snake starting in the middle
private const INITIAL_SIZE :int = 3; //keep this lower then DIM/2
private var stopped :Boolean;
private var left :Boolean;
private var right :Boolean;
private var up :Boolean;
private var down :Boolean;
private var size :Number;
private var food :Sprite;
private var tmr :Timer;
private var addSnake :Timer;
private var curI :Number;
private var curJ :Number;
private var snake :Array;
private var grid :Array;
public function Snake(){
size = stage.stageWidth / DIM; //change grid size
curI = curJ = Math.floor(DIM * 0.5); //change grid size
initSnake();
fillGrid();
addSnake = new Timer(snakeAttach);
addSnake.addEventListener(TimerEvent.TIMER,placeFood);
addSnake.start();
tmr = new Timer(SPEED);
tmr.addEventListener(TimerEvent.TIMER,move);
tmr.start();
stage.addEventListener(KeyboardEvent.KEY_DOWN,changeDir);
}
private function fillGrid():void{ //grid
grid = Make2DArray();
for (var i:uint = 0; i < DIM; i++){
for (var j:uint = 0; j < DIM; j++){
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xF0F0F0);
sp.graphics.lineStyle(1,0xF5F5F5);
sp.graphics.drawRect(0, 0, size - 1, size - 1);
sp.x = i * size;
sp.y = j * size;
addChild(sp);
grid[i][j] = sp;
}
}
}
private function Make2DArray():Array{ //for the grid
var a:Array = new Array(DIM);
for(var i:uint = 0; i < a.length; i++){
a[i] = new Array(DIM);
}
return a;
}
private function initSnake():void{ //initialises the snake
var center:Number = Math.floor(DIM * 0.5) * size;
snake = new Array(INITIAL_SIZE);
for (var i:uint = 0; i < INITIAL_SIZE; i++){
var sp:Sprite = makeItem(); //adds a body part of makeItem
sp.x = center;
sp.y = center + i * size;
addChild(sp); //adds to the stage
snake[i] = sp; //sets the index to one
}
snake.reverse();
}
private function makeItem(c:uint = 0):Sprite{ //graphics for item
var s:Sprite = new Sprite();
s.graphics.beginFill(c);
s.graphics.lineStyle(2,0x333333);
s.graphics.drawRect(0, 0, size, size);
return s;
}
private function placeFood(event:TimerEvent):void{
var rndI:uint = Math.floor(Math.random() * DIM); //sets a random integer based on the the floor
var rndJ:uint = Math.floor(Math.random() * DIM);
var rndX:Number = grid[rndI][rndJ].x; // sets a grid position for the food item to go
var rndY:Number = grid[rndI][rndJ].y;
if (food != null) removeChild(food); //if there is food on the grid removes the food from the board
food = makeItem(Math.random() * 0xFFFFFF);// random color
food.x = rndX;
food.y = rndY;
addChild(food); //adds the food to the board
for (var i:uint = 0; i < snake.length; i++){
if (rndY == snake[i].y && rndX == snake[i].x){
}
}
}
private function move(e:TimerEvent):void{
if (left){
curI -= 1;
}else if (right){
curI += 1;
}
if (up){
curJ -= 1;
}else if (down){
curJ += 1;
}
if (left || right || up || down){
var s:Sprite = makeItem();
if (curI > DIM - 1) curI = 0;
if (curJ > DIM - 1) curJ = 0;
if (curI < 0) curI = DIM - 1;
if (curJ < 0) curJ = DIM - 1;
s.x = grid[curI][curJ].x;
s.y = grid[curI][curJ].y;
addChild(s);
snake.push(s);
if (Math.floor(s.x) == Math.floor(food.x) && Math.floor(s.y) == Math.floor(food.y) ){
//placeFood(); }
else if((tmr.currentCount % 10) > 0) { removeChild(snake[0]); snake.shift(); }
}
}
private function changeDir(e:KeyboardEvent):void{
if(e.keyCode == Keyboard.LEFT) {if (!right){left = true; up = false; down = false; right = false;}}
if(e.keyCode == Keyboard.UP) {if (!down) {left = false; up = true; down = false; right = false;}}
if(e.keyCode == Keyboard.RIGHT) {if (!left) {left = false; up = false; down = false; right = true;}}
if(e.keyCode == Keyboard.DOWN) {if (!up) {left = false; up = false; down = true; right = false;}}
}
}
}
包{
导入flash.display.Sprite;
导入flash.events.KeyboardEvent;
导入flash.events.TimerEvent;
导入flash.ui.Keyboard;
导入flash.utils.Timer;
导入flash.display.MovieClip;
公共级Snake扩展MovieClip{
私有常量速度:uint=50;//更低=更快
私有const snakeAttach:uint=400;//更低=更快
私有const Dime: int=71;/ /保持这个数目不均匀,使蛇从中间开始
private const INITIAL_SIZE:int=3;//保持此值低于DIM/2
私有变量:布尔值;
私有变量左:布尔;
私有变量权:布尔;
private-var-up:布尔型;
私有变量:布尔值;
私有变量大小:数字;
私人食品:雪碧;
专用var-tmr:定时器;
私有变量addSnake:计时器;
私有var-curI:数字;
私有变量curJ:编号;
私有变量:数组;
私有var网格:数组;
公共职能部门(){
size=stage.stageWidth/DIM;//更改网格大小
curI=curJ=Math.floor(DIM*0.5);//更改网格大小
initSnake();
fillGrid();
addSnake=新计时器(snakeAttach);
addSnake.addEventListener(TimerEvent.TIMER,placeFood);
addSnake.start();
tmr=新定时器(速度);
tmr.addEventListener(TimerEvent.TIMER,move);
tmr.start();
stage.addEventListener(KeyboardEvent.KEY_DOWN,changeDir);
}
私有函数fillGrid():void{//grid
grid=Make2DArray();
对于(变量i:uint=0;iDIM-1)居里=0;
如果(curJ>DIM-1)curJ=0;
如果(居里<0)居里=DIM-1;
如果(curJ<0)curJ=DIM-1;
s、 x=栅格[curI][curJ].x;
s、 y=栅格[curI][curJ].y;
addChild(s);
蛇.推(s);;
如果(数学地板(s.x)=数学地板(food.x)和&数学地板(s.y)=数学地板(food.y)){
//placeFood();}
如果((tmr.currentCount%10)>0){removeChild(snake[0]);snake.shift();}
}
}
私有函数changeDir(e:KeyboardEvent):无效{
if(e.keyCode==Keyboard.LEFT){if(!right){LEFT=true;up=false;down=false;right=false;}}
if(e.keyCode==Keyboard.UP){if(!down){left=false;UP=true;down=false;right=false;}}
if(e.keyCode==Keyboard.RIGHT){if(!left){left=false;up=false;down=false;RIGHT=true;}}
if(e.keyCode==Keyboard.DOWN){if(!up){left=false;up=false;DOWN=true;right=false;}}
}
}
}
您需要向处理TimerEvent的任何函数添加事件参数
private function placeFood(event:TimerEvent):void {
如果您在模型-视图-控制器框架中拥有它,那就太好了。你有很多事情要做