2011-07-02 3 views
0

캔버스를 사용하여 비트 맵을 그리는 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^ 
+0

stacktrace가 도움이 될 것입니다. –

답변

0

, 그 사용하지 않는 것입니다. 또는 Timer을 입력하여 Canvas을 업데이트하십시오.

캔버스로 업데이트 할 백그라운드 스레드가 있어야하며, 활동 라이프 사이클 메소드는 스레드 시작 및 중지를 관리해야합니다.

This link이 도움이 될 수 있습니다.

관련 문제