1

onDraw 中にビットマップのリストから 1 つを表示しようとしました。
リストをキャンバスに渡すと、すべてが表示され、その場所にとどまります。
ランダムなビットマップを 1 つ渡すと、常にキャンバスが再描画されます。
public void drawEnemy(Canvas canvas) を使用している場合はすべて機能しますが、public void drawEn(Canvas canvas) を使用している場合とまったく同じではありません。
ランダムなビットマップを 1 つ表示し、数秒後にそれを削除して別のビットマップを表示したい。問題は 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);
            }
        }
    }

}

}

サーフェス ビュー:

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
    }

}

}

ダス

4

1 に答える 1

0

あなたがこのようなことをしようとしていることを理解するために(そうでない場合は、私を修正してください):これはすべてのコンポーネントでキャンバスをレンダリングしています:

  • 背景を描く
  • 敵を描く

キャンバスを「リフレッシュ」するには、次のようにします。

  • 背景を描く

アップデート

レンダリングを一時停止するには、次のようにします。

int lastUpdateTime;
int delayTime = 2000; 2 seconds

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

lastUpdateTimeすべての反復ではなく、いつ待機するかのみを定義する必要があります。

注意: レンダリング スレッドで Thread.sleep() を呼び出さないでください。

于 2012-07-30T19:19:15.863 に答える