2012-07-30 117 views
0

我嘗試在onDraw中顯示位圖列表中的一個。
當我將列表傳遞給畫布時,所有內容都顯示並保留在他們的位置。
當我傳遞一個隨機位圖時,它一直在重繪畫布。
所有作品,當我使用公共無效drawEnemy(畫布畫布),但不完全像我想要使用公共無效drawEn(畫布​​畫布)時。
我想顯示一個隨機位圖,然後幾秒鐘後,刪除它並顯示其他位圖。我認爲問題是我如何實現onDrow()方法。它一直在重繪畫布。刷新畫布?

活動:

public class NewGameActivity extends Activity{ 
NewGame newgame; 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
     // Landscape mode 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
     // no title 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     // content Newgame.java 
     newgame = new NewGame(this); 
     setContentView(newgame); 
} 

螺紋:

public class MainThread extends Thread{ 

private SurfaceHolder surfaceHolder; 
private NewGame screen; 

public MainThread(SurfaceHolder surfaceHolder, NewGame ekran) { 
    super(); 
    this.surfaceHolder = surfaceHolder; 
    this.screen= screen; 
} 

private boolean running; 
public void setRunning(boolean running) { 
    this.running = running; 
} 

@Override 
public void run() { 
    Canvas canvas; 
    while (running) { 
     canvas = null; 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder) { 
       this.screen.onDraw(canvas); 
      } 
     } finally { 
      if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 

} 

}

SurfaceView:

public class NewGame extends SurfaceView implements SurfaceHolder.Callback{ 

private MainThread thread; 
private EnemyManager manager; 

public NewGame(Context context) { 
    super(context); 
    getHolder().addCallback(this); 
    thread = new MainThread(getHolder(), this); 
    manager = new EnemyManager(); 
    // TODO Auto-generated constructor stub 
//adding enemy 
    Enemy e1 = new Enemy(BitmapFactory.decodeResource(getResources(), R.drawable.card), 1); 
    Enemy e2 = new Enemy(BitmapFactory.decodeResource(getResources(), R.drawable.horse), 2); 
    EnemyLocation l1 = new EnemyLocation(60, 180); 
    EnemyLocation l2 = new EnemyLocation(60, 50); 
    manager.AddEnemy(e1, l1); 
    manager.AddEnemy(e2, l2); 
    setFocusable(true); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.saloon), 0, 0, null); 
     manager.drawEn(canvas); 

} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    thread.setRunning(true); 
    thread.start(); 
} 


@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    thread.setRunning(false); 
    thread.stop(); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     manager.handleActionDown((int)event.getX(), (int)event.getY()); 
    } 
    return true; 
} 

}

EnemyManager:

public class EnemyManager { 
private ArrayList<Enemy> enemyList; 
private ArrayList<Enemy> suspects; 
private Enemy cow; 
private String message; 
private int suspectID; 
private Random rnd; 


public String getMessage() { 
    return message; 
} 

public EnemyManager(){ 
    enemyList = new ArrayList<Enemy>(); 
    suspects = new ArrayList<Enemy>(); 
} 


public void AddEnemy(Enemy enemy, EnemyLocation loc){ 
    // set x,y enemy localization 
    enemy.setX(loc.getX()); 
    enemy.setY(loc.getY()); 
    enemyList.add(enemy); 
} 

public void clearEnemy() { 
    enemyList.clear(); 
} 

// message if enemy touched 
public void handleActionDown(int x, int y) { 
    for (Enemy enemy: enemyList) { 
     if (enemy.wasTouched(x, y)) { 
      message = enemy.getId(); 
      return; 
     } 
    } 
} 

public void PrepareEnemy(){ 
    suspectID = enemyList.get(rnd.nextInt(enemyList.size()+1)).getId(); 
    suspects = new ArrayList<Enemy>(); 
    suspects.add(getSuspectByID(suspectID)); 
} 

private Enemy SingleEnemy(){ 
    Double i = 1 + Math.random() * ((enemyList.size()-1)+1); 
    cow = getSuspectByID(i.intValue()); 
    return cow; 
} 

private Enemy getSuspectByID(int suspectID) { 
    for (Enemy s: enemyList) { 
     if (s.getId() == suspectID) { 
      return s; 
     } 
    } 
    return null; 
} 


public void drawEn(Canvas canvas){ 
    try { 
     Enemy k = SingleEnemy(); 
     canvas.drawBitmap(cow.picture, cow.x, cow.y, null); 
    } catch (Exception e) { 
     // TODO: handle exception 
    } 
} 

// draw enemy 
public void drawEnemy(Canvas canvas) { 
    try { 
     for (Enemy enemy: enemyList) { 
      canvas.drawBitmap(enemy.picture, enemy.x, enemy.y, null); 
     } 
    } catch (Exception e) { 
     // TODO: handle exception 
    } 

} 

}

DAS

回答

0

至於因爲理解你正在嘗試做這樣的事情(如果不是,請指正): 這是呈現在畫布上用所有組件:

  • 繪製背景
  • 抽獎敵人

「刷新」 畫布,你只需做這樣的事情:

  • 繪製背景

更新

要暫停渲染,你可以做這樣的事情:

int lastUpdateTime; 
int delayTime = 2000; 2 seconds 

if(System.currenttimeMillis() > lastUpdateTime + delayTime) { 
// Finished waiting 
} 

當您要等待而不是每次迭代時,只應定義lastUpdateTime

注意:不要在渲染線程中調用Thread.sleep()!

+0

沒錯。但是我想停下一段時間的畫布(爲了給敵人一個機會)。如果一段時間後敵人不會被攻擊,那麼它就會消失。如果我使用thread.sleep,我將無法使用ontouch方法。 – Toystoj 2012-07-30 19:49:17

+0

因此,我應該在我的線程中創建類似於您的示例int lastUpdateTime。然後在draw方法中更新這個值並將其發送給線程。什麼時候會更大,然後開始繪畫?我應該使用處理程序? – Toystoj 2012-07-30 20:21:49

+0

是的,那樣做,我認爲不需要處理程序。 – 2012-07-30 20:27:08