馬上加入Android 台灣中文網,立即免費下載應用遊戲。
您需要 登錄 才可以下載或查看,沒有帳號?註冊
x
本帖最後由 n790303 於 2011-8-3 11:05 編輯
小弟是在ANDROID初學者
大學三年級開始要做專題 我想說要做遊戲
我要做類似有個人物可以不斷踩著東西往上跳之類的
但現在卡到一個問題?
整個往上跳的邏輯已經寫出來了
但在RUN時有時候很順 但有時候玩到一半會出現"未正常終止的訊息"
我個人覺得是執行緒問題 但怎麼是還是會有這個問題
程式架構:
我把SENSOR偵測跟顯示寫在一起 就是每次偵測到的值會丟到一個副程式去做人物得移動跟人物碰撞東西得邏輯判斷和東西螢幕捲動的索引判斷
我額外有兩個執行緒一個是負責不斷刷新畫面 另一個MOVETHREAD則負責闖關過程的東西的移動和東西超過螢幕的清空刪除(不包括人物本身
- public class GameView extends Activity implements SensorEventListener {
- private SensorManager sensorManager;
- MySurfaceView view;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- requestWindowFeature(Window.FEATURE_NO_TITLE); //設定不顯示標題
- getWindow().setFlags( //設定為全螢幕模式
- WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN
- );
- sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
- view = new MySurfaceView(this);
- setContentView(view);
- }
- @Override
- protected void onResume() {
-
- super.onResume();
- List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
- if (sensors.size() > 0) {
- sensorManager.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_GAME);
- }
- }
- @Override
- protected void onPause() {
-
- super.onPause();
- sensorManager.unregisterListener(this);
- }
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- }
- @Override
- public void onSensorChanged(SensorEvent event) {
- view.onValueChanged(event.values); //Sensor改變值傳入onValueChanged
- }
- class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
- private Bitmap bitmap[]=new Bitmap[2],cloud1,cloud2,bb;
- private float x,y,mov,mov_t,t_x;
- int z=0,w=0;
- int index=0;
- boolean upstate=true;
- private TutorialThread thread;
- MoveThread moveThread;
-
- ArrayList<cloud> clouds;
-
- public MySurfaceView(Context context) {
- super(context);
- getHolder().addCallback(this);
- this.thread = new TutorialThread(getHolder(), this);
- this.moveThread=new MoveThread(this);
- clouds= Map.getFirst();
- initpic();
- }
- public void initpic(){ //初始化圖片
-
- Paint paint = new Paint();
- paint.setColor(Color.BLUE);
- paint.setAntiAlias(true);
- bitmap[0] = BitmapFactory.decodeResource(getResources(), R.drawable.android);
- bitmap[1] = BitmapFactory.decodeResource(getResources(), R.drawable.android);
- cloud1 = BitmapFactory.decodeResource(getResources(), R.drawable.cloud);
- cloud2 = BitmapFactory.decodeResource(getResources(), R.drawable.cloud);
- bb = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
- cloud1 = Bitmap.createScaledBitmap(cloud1, 95, 58, false);
- cloud2 = Bitmap.createScaledBitmap(cloud2, 95, 58, false);
- bb = Bitmap.createScaledBitmap(bb,320 ,800 , false);
-
- for(cloud cd : clouds){//為雲朵初始化圖片
- if(cd.type == 1){
- cd.bitmap = cloud1;
- }
- else if(cd.type == 2){
- cd.bitmap = cloud2;
- }
- }
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- x = (getWidth() - bitmap[z].getWidth()) / 2;
- y = getHeight()-bitmap[z].getHeight() ;
- onValueChanged(new float[3]);
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- this.thread.setFlag(true);//啟動更新視框執行緒
- this.thread.start();
- this.moveThread.setFlag(true);
- moveThread.start();
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- boolean retry = true;
- this.thread.setFlag(false);
- this.moveThread.setFlag(false);
- while (retry) {
- try {
- thread.join();
- moveThread.join();
- retry = false;
- }
- catch (InterruptedException e) {//不斷地迴圈,直到更新視框執行緒結束
- }
- }
- }
-
- void onValueChanged(float[] values) { //Sensor值改變時進去判斷
-
-
-
- x -= values[0]*ConstantUtil.move_value;
- if(t_x<x|x==(getWidth() - bitmap[z].getWidth())){ //sensor方向辦斷主角頭的轉向
- z=1;
- }else z=0;
- t_x=x;
- if(x>(getWidth() - (bitmap[z].getWidth()/2))){ //邊界判斷
- x=( 0-bitmap[z].getWidth()/2);
- }
- if(x< 0 - (bitmap[z].getWidth()/2)){
- x=(getWidth() - (bitmap[z].getWidth()/2));
- }
-
- mov-=2;
- if(y>=(getHeight()-bitmap[z].getHeight())){ //底部碰撞裝置
- mov=ConstantUtil.Jump_value;
- }
- mov_t=mov;
-
- synchronized(this){
- try{
- for(int i=1;i<=Math.abs(mov_t);i++){
- if(mov>=0){
- y--;
- upstate=true;
- }else {
- y++;
- upstate=false;
- }
- if(y<=(ConstantUtil.screenHeight/2)-bitmap[z].getHeight()){ //索引判斷(人物超過螢幕中線 索引值++
- if(upstate==true){
- index++;
- }
- y=(ConstantUtil.screenHeight/2)-bitmap[z].getHeight(); //因為雲動 人物要靜止
- }
-
- for(cloud cd : clouds){
-
- cd.y+=index; //雲執行索引相減
- if(cd.y>=(-1*ConstantUtil.cloud_height_1)){
- cd.status=true;
-
- }
- if(y+bitmap[z].getHeight()==cd.y&(x+bitmap[z].getWidth()/2)<=(cd.x+ConstantUtil.cloud_width_1)&(x+bitmap[z].getWidth()/2)>=cd.x&cd.status==true&upstate==false){
- mov=ConstantUtil.Jump_value;
- y=cd.y-bitmap[z].getHeight();
- break;
- }
- }
- index=0;//索引歸零
- }
- }catch(Exception e){
-
- e.printStackTrace();
- }
- }
- onDraw();
- }
- void onDraw(){
- Canvas canvas = getHolder().lockCanvas();
- if (canvas != null) {
- canvas.drawBitmap(bb, 0, 0, null);
- for(cloud cd:clouds){
- if(cd.status == true){
- cd.draw(canvas);
- }
- }
- canvas.drawBitmap(bitmap[z], x, y, null);
- getHolder().unlockCanvasAndPost(canvas);
- }
- }
- class TutorialThread extends Thread{//更新視框執行緒
- private int sleepSpan = 100;//睡眠的毫秒數
- private SurfaceHolder surfaceHolder;
- private MySurfaceView veiw;
- private boolean flag = false;
- public TutorialThread(SurfaceHolder surfaceHolder , MySurfaceView veiw) {//建構式
- this.surfaceHolder = surfaceHolder;
- this.veiw = veiw;
- }
- public void setFlag(boolean flag) {//設定迴圈標記位元
- this.flag = flag;
- }
- @Override
- public void run() {
-
- while (this.flag) {
- synchronized(this){
- try {
- // 鎖定整個畫布,在記憶體要求比較高的情況下,建議參數不要為null
- synchronized (this.surfaceHolder) {
- veiw.onDraw();//繪製
- }
- }finally {
- }
- try{
- Thread.sleep(sleepSpan);//睡眠指定毫秒數
- }
- catch(Exception e){
-
- e.printStackTrace();//列印堆疊資訊
- }
- }
- }
- }
- }
- }
- }
複製代碼 movethread執行緒部分
- public class MoveThread extends Thread {
- private int sleepSpan = 0;//睡眠的毫秒數
- private boolean flag = true;//迴圈旗標位元
- MySurfaceView View;//GameView的引用
- ArrayList<cloud> deletecloud = new ArrayList<cloud>();
-
- public MoveThread(MySurfaceView view){//建構式
- this.View = view;
- }
- public void setFlag(boolean flag){
- this.flag = flag;
- }
- @Override
- public void run(){
- while(flag){
- synchronized(this){
- try{
- for(cloud cd : View.clouds){//雲移動;索引移動
- cd.move();
- if(cd.y>(ConstantUtil.screenHeight)){
- deletecloud.add(cd);
- }
- }
-
- View.clouds.removeAll(deletecloud);
- deletecloud.clear();
- View.onDraw();
-
- }catch(Exception e){}
- }
-
- try{//睡眠休息
- Thread.sleep(sleepSpan);
- }catch(Exception e){
- e.printStackTrace();
- }
-
- }
-
- }
- }
複製代碼 拜託各位專家幫我解決
以下圖是我的Message error
|
|