📄 littleant.as
字号:
package com.view
{
import com.model.ModelLocator;
import flash.display.Sprite;
import flash.events.Event;
public class littleAnt extends Sprite
{
[Bindable]
private var __model:ModelLocator = ModelLocator.getInstance();
private var range:int = 3;
private var remeber:Number = 5;
private var remeberplace:Array = new Array();
private var moveFaultProbability:Number = .02 * Math.random();
private var messagesFaultProbability:Number = .3;
private var speed:Number = 1;
private var award:Number = 360 * Math.random();
private var currentplace:Array = new Array();
private var previousplace:Array = new Array();
private var messagesplace:MapUnit;
private var ant:antswc;
public function littleAnt(xpoint:Number, ypoint:Number){
currentplace = [int(xpoint / __model.mapinfo.unit), int(ypoint / __model.mapinfo.unit)];
remeberplace.push(currentplace);
ant = new antswc();
addChild(ant);
ant.scaleX = ant.scaleY = 0.05;
ant.rotation = award;
this.addEventListener(Event.ENTER_FRAME, conctrolMove);
}
private function conctrolMove(event:Event):void{
//if((messagesplace = lookForMessages()) == null){
moveForMove();
//}else{
//moveForFood(messagesplace);
//}
}
private function moveForMove():void{
if(Math.random() < moveFaultProbability){
changeAward();
}
ant.rotation = award;
var xnext:Number = this.x + speed * Math.sin(award / 57.3);
var ynext:Number = this.y - speed * Math.cos(award / 57.3);
if(againstTheWall(xnext, ynext) && !noBackWay(xnext, ynext)){
this.x = xnext;
this.y = ynext;
}else{
changeAward();
}
}
private function moveForFood(nextMapUnit:MapUnit):void{
var xunitdifference:int = nextMapUnit.xnum - currentplace[0];
var yunitdifference:int = nextMapUnit.ynum - currentplace[1];
var xdifference:Number;
switch(xunitdifference){
case -1:
xdifference = (nextMapUnit.xnum+1)*__model.mapinfo.unit - this.x;
break;
case 1:
xdifference = nextMapUnit.xnum*__model.mapinfo.unit - this.x;
break;
case 0:
xdifference = 0;
break;
}
var ydifference:Number;
switch(yunitdifference){
case -1:
ydifference = (nextMapUnit.ynum+1)*__model.mapinfo.unit - this.y;
break;
case 1:
ydifference = nextMapUnit.ynum*__model.mapinfo.unit - this.y;
break;
case 0:
ydifference = 0;
break;
}
if(!(xdifference == 0 && ydifference == 0)){
//trace(yunitdifference);
//trace(Math.atan(xdifference/ydifference) * 57.3)
ant.rotation = award = Math.atan(xdifference/(0-ydifference)) * 57.3 + (yunitdifference == 1?180:0);
//ant.rotation = Math.atan(xdifference/ydifference) * 57.3;
var difference:Number = Math.sqrt(xdifference*xdifference + ydifference*ydifference);
this.x += xdifference / difference;
this.y += ydifference / difference;
var nextplace:Array = [int(this.x/__model.mapinfo.unit), int(this.y/__model.mapinfo.unit)];
if(nextplace[0] != currentplace[0] || nextplace[1] != currentplace[1]){
currentplace = nextplace;
if(remeberplace.length == remeber){
remeberplace.shift();
}
remeberplace.push(nextplace);
}
}else{
this.x += speed * Math.sin(award / 57.3);
this.y -= speed * Math.cos(award / 57.3);
}
}
private function changeAward(r:Number=360):void{
award = r * Math.random();
//this.rotation = (award += (r * 2 * Math.random() - r));
}
private function againstTheWall(xnext:Number, ynext:Number):Boolean{
if(xnext < 0 || xnext > __model.mapinfo.xnum*__model.mapinfo.unit || ynext < 0 || ynext > __model.mapinfo.ynum*__model.mapinfo.unit)
return false;
else
return true;
}
private function noBackWay(xnext:Number, ynext:Number):Boolean{
var nextplace:Array = [int(xnext/__model.mapinfo.unit), int(ynext/__model.mapinfo.unit)];
if(nextplace[0] != currentplace[0] || nextplace[1] != currentplace[1]){
if(_getIndexOf(remeberplace, nextplace) == -1){
if(remeberplace.length == remeber){
remeberplace.shift();
}
remeberplace.push(nextplace);
currentplace = nextplace;
return false;
}else{
return true;
}
}else{
return false;
}
}
private function _getIndexOf(base:Array, child:Array):int{
for(var i:Number = 0; i < base.length; i ++){
if(base[i][0] == child[0] && base[i][1] == child[1]){
return i;
break;
}
}
return -1;
}
private function lookForMessages():MapUnit{
if(previousplace != currentplace){
//trace(previousplace);
//trace(currentplace);
var step:int = (range - 1) / 2;
var currentxnum:int = currentplace[0];
var currentynum:int = currentplace[1];
var choose:Array = new Array();
var xbegin:int = Math.max(0,currentxnum-step);
var xend:int = Math.min(__model.mapinfo.xnum, currentxnum+step);
var ybegin:int = Math.max(0,currentynum-step);
var yend:int = Math.min(__model.mapinfo.ynum, currentynum+step);
for(var i:int = xbegin; i <= xend; i++){
for(var j:int = ybegin; j <= yend; j++){
if(!(i == currentxnum && j == currentynum) && __model.mapinfo.maps[i][j].Messages > 0){
if(_getIndexOf(remeberplace, [__model.mapinfo.maps[j][i].xnum, __model.mapinfo.maps[j][i].ynum]) == -1)
choose.push(__model.mapinfo.maps[j][i]);
}
}
}
previousplace = currentplace;
var len:int = choose.length;
//trace("***************" + len);
if(len > 0){
choose.sortOn("Messages", Array.NUMERIC);
for(var k:String in choose){
//trace("****" + choose[k].xnum + "," + choose[k].ynum + "," + choose[k].Messages);
}
var nextchoose:MapUnit;
if(Math.random() > messagesFaultProbability){
//trace(choose[len-1].xnum + "," + choose[len-1].ynum + "," + choose[len-1].Messages);
//trace("_____________________________");
nextchoose = choose[len-1];
}else{
var index:int = int((len-1)*Math.random());
nextchoose = choose[index];
}
return nextchoose;
}else{
return null;
}
}else{
return messagesplace;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -