0
你好我有以下代碼使用Andengine庫。代碼的工作原理基本上是從敵人(一隻黑羊)到達玩家的路徑,然後使用路徑修改器移動羊,在路徑的末尾再次開始進程 - 所以我如果你喜歡,使用線程創建永久運動。我的問題是,這是做這種永久路徑發現的最有效的乾淨方式嗎?由於andengine android動畫線程
public void startThread(){ stop1=true; t1 = new Thread(mMoveBlackSheep); t1.start(); }
public void stopThread(){ if(t1 != null){ stop1=false; t1.interrupt(); }}
public void startThread1(){ stop2=true; t2 = new Thread(mMoveBlackSheep1); t2.start(); }
public void stopThread1(){ if(t2 != null){ stop2=false; t2.interrupt(); }}
private synchronized Path get_coords(int sheep) {
Path retxy=null;
try {
final float[] playerFootCordinates = player.convertLocalToSceneCoordinates(12,31);
final TMXTile tmxTile = tmxLayer.getTMXTileAt(playerFootCordinates[Constants.VERTEX_INDEX_X], playerFootCordinates[Constants.VERTEX_INDEX_Y]);
int pColPlayer = 0;
int pRowPlayer = 0;
if(tmxTile != null) {
pColPlayer = tmxTile.getTileColumn();
pRowPlayer = tmxTile.getTileRow();
}
AnimatedSprite blacksheep = black_sheep.get(sheep);
int pColBlackSheep = 0;
int pRowBlackSheep = 0;
final float[] MonsterFootCordinates = blacksheep.convertLocalToSceneCoordinates(12,31);
final TMXTile tmxTile1 = tmxLayer.getTMXTileAt(MonsterFootCordinates[Constants.VERTEX_INDEX_X], MonsterFootCordinates [Constants.VERTEX_INDEX_Y]);
if(tmxTile1 != null) {
pColBlackSheep = tmxTile1.getTileColumn();
pRowBlackSheep = tmxTile1.getTileRow();
}
int xx1 = (int)(player.getX()/TileWidth);
int yy1 = (int)(player.getY()/TileHeight);
int selectedx = pRowBlackSheep;
int selectedy = pColBlackSheep;
pathfinding.Path path=null;
Random r1 = new Random();
int d1 = r1.nextInt(20);
path = finder_sheep.findPath(new UnitMover(1), selectedx, selectedy, pRowPlayer , pColPlayer);
// still null restart thread.
if (path==null)
{
try {
int randomAmountOfTime=500;
if (!Thread.interrupted()) {
Thread.sleep(randomAmountOfTime);
}
} catch (InterruptedException e) {
return null;
}
catch (Exception e) { e.printStackTrace(); }
}
if (path != null) {
int p1=path.getLength();
float[] x1 = new float[p1];
float[] y1 = new float[p1];
int[] direction = new int[p1];
for (int i=0; i<p1; i++)
{
int vecX = path.getX(i) * TileWidth;
int vecY = path.getY(i) * TileHeight;
x1[i] = vecX;
y1[i] = vecY;
if (i > 0) {
int vecXPrev = path.getX(i-1) * TileWidth;
int vecYPrev = path.getY(i-1) * TileHeight;
} else { direction[0]=0; }
}
retxy = new Path(y1 , x1);
Log.d("END CREATE XY ARRAY", "END CREATE XY ARRAY");
} else { retxy=null; }
}
catch (Exception e) { }
return retxy;
}
Runnable mMoveBlackSheep = new Runnable() {public void run() { if (t1!=null) { while(!t1.isInterrupted()) { run1(); }}}};
Runnable mMoveBlackSheep1 = new Runnable() {public void run() { if (t2!=null) { while(!t2.isInterrupted()) { run2(); }}}};
private void run1() {
try {
Path co1 = get_coords(0);
if (co1 != null) {
followPath(co1 , 0 ,0);
}
} catch (Exception e) {
//Log.d("run1", e.getMessage());
}
}
private void run2() {
try {
// get the Column/Row for the player.
Path co1 = get_coords(1);
if (co1 != null) {
followPath(co1 , 1 ,1);
}
} catch (Exception e) {
//Log.d("run1", e.getMessage());
}
}
private synchronized void followPath(final Path p1 , final int current_sheep , final int threadnum)
{
try
{
float speedOfPlayer= 4;
black_sheep.get(current_sheep).registerEntityModifier(new PathModifier(speedOfPlayer, p1, null, new IPathModifierListener() {
public void onPathStarted(final PathModifier pPathModifier, final IEntity pEntity) {
}
//@Override
public void onPathWaypointStarted(final PathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex) {
final long[] frameDurations = new long[3];
Arrays.fill(frameDurations, 500);
black_sheep.get(current_sheep).animate(frameDurations, 0, 2, true);
}
//@Override
public void onPathWaypointFinished(final PathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex) {
}
//@Override
public void onPathFinished(final PathModifier pPathModifier, final IEntity pEntity) {
if (current_sheep==0) {
stopThread();
startThread(); }
if (current_sheep==1) {
stopThread1();
startThread1(); }
}
}));
}
catch (Exception e) {
//Log.d("ERROR~~~", e.getMessage());
}
}