캔버스를 사용하여 비트 맵을 그리는 2D 게임을 만들려고합니다. 그 비트 맵은 게임의 개체입니다. 현재, 나는 화면을 가로 질러 객체를 앞뒤로 움직이는 데 문제가있다. (객체의 이름은 target이다.) 나는 이것을 처리하고 새로운 Handler를 생성하는 방법으로 Timer와 TimerTask를 사용하려고 시도했지만 아무 것도하지 않는다. 작동하는 것 같습니다. 게임이 실행되면 지정된 픽셀 위로 대상이 한 번 이동하는 것을 볼 수 있습니다 (이동하는 반복적 인 타이밍입니다). 그런 다음 응용 프로그램이 충돌하여 미안 해요 .Force Close Dialog. 내가 뭘 잘못하고 있니?Java에서 Timer 및 TimerTask 메소드를 올바르게 사용하여 캔버스에 끊임없이 oscallating하는 움직이는 객체를 만들 수 있습니까?
MainActivity 코드 (정말 중요하지, 단지 문제가 GameActivity 트리거) : 패키지 app.AngryCannonShooterActivity,
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.View.*;
import android.widget.Button;
public class MainActivity extends Activity {
private OnClickListener OptionsButtonListener = new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, OptionsActivity.class);
MainActivity.this.startActivity(intent);
}
};
private OnClickListener HelpButtonListener = new OnClickListener() {
public void onClick(View v) {
Intent intent2 = new Intent(MainActivity.this, HelpActivity.class);
MainActivity.this.startActivity(intent2);
}
};
private OnClickListener LeaveButtonListener = new OnClickListener() {
public void onClick(View v) {
finish();
}
};
private OnClickListener PlayButtonListener = new OnClickListener() {
public void onClick(View v) {
Intent intent3 = new Intent(MainActivity.this, GameActivity.class);
MainActivity.this.startActivity(intent3);
}
};
private OnClickListener TestButtonListener = new OnClickListener() {
public void onClick(View v) {
Intent intent3 = new Intent(MainActivity.this, TestActivity.class);
MainActivity.this.startActivity(intent3);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
Button OptionsButton = (Button)findViewById(R.id.MainScreenOptionsButton);
OptionsButton.setOnClickListener(OptionsButtonListener);
Button LeaveButton = (Button)findViewById(R.id.MainScreenLeaveButton);
LeaveButton.setOnClickListener(LeaveButtonListener);
Button HelpButton = (Button)findViewById(R.id.MainScreenInstructionsButton);
HelpButton.setOnClickListener(HelpButtonListener);
Button PlayButton = (Button)findViewById(R.id.MainScreenPlayButton);
PlayButton.setOnClickListener(PlayButtonListener);
Button TestButton = (Button)findViewById(R.id.TestButtonMainScreen);
TestButton.setOnClickListener(TestButtonListener);
}
}
을 그리고 여기 내 GameActivity 코드입니다 : 내가 제안을 제공합니다
package app.AngryCannonShooterActivity;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.view.View.*;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.widget.Button;
import android.widget.LinearLayout;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.content.res.Resources;
public class GameActivity extends Activity {
//^GameActivity START^
final Handler timerhandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
LinearLayout touchspread;
touchspread = new LinearLayout(this);
setContentView(new Panel(this));
touchspread.requestLayout();
}
class Panel extends SurfaceView implements SurfaceHolder.Callback {
//^Panel Class START^
private Bitmap cannon;
private Bitmap launchbutton;
private Bitmap leftbutton;
private Bitmap rightbutton;
private Bitmap target;
private ViewThread mThread;
private int mX;
private int launchbuttonxvalue;
private int launchbuttonyvalue;
private int leftbuttonxvalue;
private int leftbuttonyvalue;
private int rightbuttonxvalue;
private int rightbuttonyvalue;
private int scoretextviewxvalue;
private int scoretextviewyvalue;
private int cannonincrementmovement;
private int score;
private int cannonrestrictionpoint;
private int cannonresetpoint;
private int targetxvalue;
private int targetyvalue;
private int targetmovementincrementvalue;
public Panel (Context context) {
super(context);
cannon = BitmapFactory.decodeResource(getResources(), R.drawable.testcannon);
launchbutton = BitmapFactory.decodeResource(getResources(), R.drawable.launchbutton);
leftbutton = BitmapFactory.decodeResource(getResources(), R.drawable.leftbutton);
rightbutton = BitmapFactory.decodeResource(getResources(), R.drawable.rightbutton);
target = BitmapFactory.decodeResource(getResources(), R.drawable.testtarget);
getHolder().addCallback(this);
mThread = new ViewThread(this);
}
public Canvas canvas;
@Override
public void onDraw(Canvas canvas) {
Paint paint = new Paint();
canvas.drawColor(Color.BLACK);
paint.setColor(Color.YELLOW);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setAlpha(30+20*1);
canvas.drawPaint(paint);
paint.setTextSize(20);
canvas.drawText("Score: "+score, scoretextviewxvalue, scoretextviewyvalue, paint);
canvas.drawBitmap(launchbutton, launchbuttonxvalue, launchbuttonyvalue, null);
canvas.drawBitmap(cannon, mX, (float) (canvas.getHeight()-(launchbutton.getHeight()*4.2)), null);
canvas.drawBitmap(leftbutton, leftbuttonxvalue, leftbuttonyvalue, null);
canvas.drawBitmap(rightbutton, rightbuttonxvalue, rightbuttonyvalue,null);
canvas.drawBitmap(target, targetxvalue, targetyvalue, null);
launchbuttonxvalue = (int) ((canvas.getWidth()-launchbutton.getWidth())/2);
launchbuttonyvalue = (int) (canvas.getHeight()*0.92);
leftbuttonxvalue = (int) (0);
leftbuttonyvalue = (int) (canvas.getHeight()*0.9);
rightbuttonxvalue = (int) (canvas.getWidth()*0.91);
rightbuttonyvalue = (int) (canvas.getHeight()*0.9);
scoretextviewxvalue = (int) ((canvas.getWidth())/1.4);
scoretextviewyvalue = (int) ((canvas.getHeight())/15);
cannonincrementmovement = (int) (10);
score = (int) (0);
cannonrestrictionpoint = (int) ((canvas.getWidth())-cannon.getWidth());
cannonresetpoint = (int) ((canvas.getWidth()*0.9));
targetxvalue = (int) (0);
targetyvalue = (int) ((canvas.getHeight())/2.2);
targetmovementincrementvalue = (int) (5);
final Runnable timerrunnable = new Runnable() {
public void run() {
movetarget();
}
};
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
timerhandler.post(timerrunnable);
}};
timer.scheduleAtFixedRate(task, 200, 1000);
}
public int getOpacity() {
return 0;
}
public void setAlpha(int alpha) {
}
public void setColorFilter(ColorFilter cf) {
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
public void surfaceCreated(SurfaceHolder holder) {
if (!mThread.isAlive()) {
mThread = new ViewThread(this);
mThread.setRunning(true);
mThread.start();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
if (mThread.isAlive()) {
mThread.setRunning(false);
}
}
public void checkgridleftbutton() {
if (mX < 0) {
mX = (int) (0);
}
}
public void checkgridrightbutton() {
if (mX > cannonrestrictionpoint) {
mX = (int) (cannonresetpoint);
}
}
public void checktargetlocation() {
if (targetxvalue <= -1) {
invertdirection();
}
if (targetxvalue >= (canvas.getWidth()-target.getWidth())); {
invertdirection();
}
}
public void invertdirection() {
targetmovementincrementvalue = targetmovementincrementvalue*-1;
}
public void movetarget() {
targetxvalue = (int) (targetxvalue + targetmovementincrementvalue);
checktargetlocation();
}
public class ViewThread extends Thread {
//^ViewThread Class START^
private Panel mPanel;
private SurfaceHolder mHolder;
private boolean mRun = false;
public ViewThread(Panel panel) {
mPanel = panel;
mHolder = mPanel.getHolder();
}
public void setRunning(boolean run) {
mRun = run;
}
@Override
public void run() {
Canvas canvas = null;
while (mRun) {
canvas = mHolder.lockCanvas();
if (canvas != null) {
mPanel.onDraw(canvas);
mHolder.unlockCanvasAndPost(canvas);
}
}
}
}
//^ViewThread Class END^
@Override
public boolean onTouchEvent(MotionEvent event){
int action = event.getAction();
int x = (int) event.getX();
int y = (int) event.getY();
switch(action){
case MotionEvent.ACTION_DOWN:
if (x >= launchbuttonxvalue && x < (launchbuttonxvalue + launchbutton.getWidth())
&& y >= launchbuttonyvalue && y < (launchbuttonyvalue + launchbutton.getHeight())) {
finish();
}
if (x >= leftbuttonxvalue && x < (leftbuttonxvalue + leftbutton.getWidth())
&& y >= leftbuttonyvalue && y < (leftbuttonyvalue + leftbutton.getHeight())) {
mX = mX - cannonincrementmovement;
checkgridleftbutton();
}
if (x >= rightbuttonxvalue && x < (rightbuttonxvalue + rightbutton.getWidth())
&& y >= rightbuttonyvalue && y < (rightbuttonyvalue + rightbutton.getHeight())) {
mX = mX + cannonincrementmovement;
checkgridrightbutton();
}
break;
}
return super.onTouchEvent(event);
}
//^Panel Class END^
}
}
//^GameActivity Class END^
stacktrace가 도움이 될 것입니다. –