이것은 안드로이드로 작업 한 첫 작품이며, 스레드 내부에서 반복적으로 캔버스에 그리는 데 어려움을 겪고 있습니다. 스레드가 실행되고 있지만 그 스레드가 실행될 때마다 팝업 된 toast
을 사용하여 실행 되었음에도 불구하고 한 번 그려지는 것처럼 보입니다.하지만 스레드가 실행 중이고 코드가 내부에서 실행 중이므로 제거했습니다. 실행됩니다, 그냥 일종의Android - 캔버스가 Runnable 내부에서 작동하지 않음
public class GameActivity extends Activity implements Runnable{
ImageView gameView;
public int screenWidth, screenHeight, objectSize;
private static int FPS = 30;
private boolean rightPressed = false, leftPressed = false;
private Player player;
private Thread thread;
private Canvas canvas;
private Bitmap blankBitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
screenWidth = size.x;
screenHeight = size.y;
objectSize = screenWidth/8;
player = new Player(objectSize, screenWidth/2 - objectSize/2, screenHeight - (objectSize+10));
blankBitmap = Bitmap.createBitmap(screenWidth,screenHeight,Bitmap.Config.ARGB_8888);
canvas = new Canvas(blankBitmap);
gameView = new ImageView(this);
gameView.setImageBitmap(blankBitmap);
draw();
setContentView(gameView);
thread = new Thread(this);
thread.start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
leftPressed = true;
if((int)event.getX()<=screenWidth/2){
leftPressed = true;
rightPressed = false;
Toast.makeText(this, "left", Toast.LENGTH_SHORT).show();
}
if((int)event.getX()>screenWidth/2){
rightPressed = true;
leftPressed = false;
Toast.makeText(this, "right", Toast.LENGTH_SHORT).show();
}
}
if(event.getAction() == MotionEvent.ACTION_UP) {
rightPressed = false;
leftPressed = false;
Toast.makeText(this, "released", Toast.LENGTH_SHORT).show();
}
return super.onTouchEvent(event);
}
public void draw(){
canvas.drawColor(Color.argb(255, 255, 255, 255));
player.draw(canvas);
}
@Override
public void run() {
while (!player.shouldDie()) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!rightPressed && !leftPressed) player.setDx(0);
if(rightPressed) player.setDx(player.getSpeed());
if(leftPressed) player.setDx(-player.getSpeed());
player.update();
draw();
}
});
Thread.sleep(1000/FPS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
가 나는 또한 플레이어의 x가 실제로 변경 않는 것을 확인 ... 다시 그리기하지 않으며, 내가 수동으로 (100)을 좋아하는 DX를 설정하면 실제로 첫 번째 이동 않습니다 시간이 실행되지만, 스레드가 여전히 어쨌든
를 실행하지 나중에에도 불구하고, 여기에 Player.class 012,343,718,722,339,822,656입니다누군가가 여기에 뭔가 잘못 생각한다면 나는 이것이 정말로 작동하지 않는 이유에 관해서 혼란 스러울만큼 도움이된다고 생각합니다. 특히 이것은 안드로이드로 작업 한 첫 번째 시간입니다.
rePaint() 메소드를 호출하는 것을 잊은 것 같습니다. 안드로이드에는 inValidate()라는 캔버스를 다시 그리는 무언가가 있습니다. 플레이어 드로우 메서드 또는 액티비티 그린 메서드를 추가 할 수 있습니다. 그 트릭을해야합니다. – albeee
예, 그 트릭을 했어! 고마워요 :) –