2015-07-20 1 views
0

Итак, у меня есть игра для Android Tetris, которую я пишу. Когда я запускаю приложение в эмуляторе и нажимаю кнопку «Пуск», он разбивается. Нет диалогового окна, в котором говорится, что приложение перестало работать (обычно вы получаете это, когда генерируется исключение, верно?). И я не знаю, какая строка кода вызывает исключение, потому что я не вижу трассировку стека! Кто-нибудь знает, где находятся отчеты о сбоях или как я могу увидеть трассировку стека? Я начинающий программист для android, и я использовал для написания приложений WinForms.Android разбился, и отчет о сбое не отображается в консоли Android Studio

Я только показал часть кода. Если вы считаете, что проблема в другом месте, скажите мне, чтобы я мог опубликовать ее здесь.

Кстати, извините за мой плохой английский, если я сделал какие-либо грамматические ошибки, так как я китайский.

Вот код: Кнопка запуска:

<Button 
    android:layout_width="319dp" 
    android:layout_height="160dp" 
    android:text="START" 
    android:id="@+id/buttonStart" 
    android:layout_x="8dp" 
    android:layout_y="116dp" 
    android:textSize="30pt" 
    android:onClick="btnStartClick" 
    android:layout_below="@+id/textView" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true"/> 

OnClick обработчик события:

public void btnStartClick (View view) { 
    startActivity (new Intent (StartPage.this, TetrisActivity.class)); 
} 

OnCreate метод TetrisActivity в:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate (savedInstanceState); 
    setContentView (R.layout.activity_tetris); 
    board = new TetrisBoard (this);//board is a TetrisBoard instance 
    board.addTetrimino(); 

} 

TetrisBoard класс

public class TetrisBoard implements ITetrisEventListener{ 
private TetrisActivity activity; 
private Random r; 

public TetrisBlock[][] tetrisBlockMatrix; 

public TetrisBoard (TetrisActivity activity) { 
    tetrisBlockMatrix = new TetrisBlock[16][22]; 
    r = new Random(); 
    this.activity = activity; 
} 

public void addTetrimino() { 
    Tetrimino tetrimino = null; 
    int randomNumber = r.nextInt (140); 
    if (randomNumber < 20) { 
     tetrimino = new OShapedTetrimino (tetrisBlockMatrix, activity); 
    } else if (randomNumber < 40) { 
     tetrimino = new IShapedTetrimino (r.nextInt (2), tetrisBlockMatrix, 
       activity); 
    } else if (randomNumber < 60) { 
     tetrimino = new ZShapedTetrimino (r.nextInt (2), tetrisBlockMatrix, 
       activity); 
    } else if (randomNumber < 80) { 
     tetrimino = new SShapedTetrimino (r.nextInt (2), tetrisBlockMatrix, 
       activity); 
    } else if (randomNumber < 100) { 
     tetrimino = new TShapedTetrimino (r.nextInt (4), tetrisBlockMatrix, 
       activity); 
    } else if (randomNumber < 120) { 
     tetrimino = new JShapedTetrimino (r.nextInt (4), tetrisBlockMatrix, 
       activity); 
    } else { 
     tetrimino = new LShapedTetrimino (r.nextInt (4), tetrisBlockMatrix, 
       activity); 
    } 

    tetrimino.registerLandedListeners (this); 
    tetrimino.setTimerInterval (activity.timerInterval); 
    activity.fallingTetrimino = tetrimino; 
} 

@Override 
public void onLanded(Tetrimino sender) { 
    try { 
     sender.addTetrisBlocksToMatrix (tetrisBlockMatrix); 
     activity.checkScore(); 
     addTetrimino(); 
    } catch (IllegalArgumentException e) { 
     TetrisUtility.showMsgDialog ("Game Over", "Tetris", activity); 
     activity.finish(); 
    } 
} 

}

И, наконец, класс Tetrimino:

public abstract class Tetrimino { 
public TetrisBlock[] blocks; 

protected Timer timer; 
protected TetrisBlock[][] tetrisBlockMatrix; 
protected ArrayList<ITetrisEventListener> landedEventListeners; 
protected TimerTask task = new TimerTask() { 
    @Override 
    public void run() { 
     moveDown(); 
    } 
}; 

public static final int LEFT = -1; 
public static final int RIGHT = 1; 

protected abstract TetrisBlock[] getTouchingSides(); 

protected void landed() { 
    for (int i = 0 ; i < landedEventListeners.size() ; i++) { 
     landedEventListeners.get (i).onLanded (this); 
    } 
} 

public void registerLandedListeners (ITetrisEventListener listener) { 
    landedEventListeners.add (listener); 
} 

public void moveDown() { 
    if (!checkLanded()) { 
     for (TetrisBlock block:blocks) { 
      block.moveDown(); 
     } 
    } else { 
     timer.cancel(); 
     landed(); 
    } 
} 

protected boolean checkLanded() { 
    TetrisBlock[] touchingSides = getTouchingSides(); 
    for (TetrisBlock block:touchingSides) { 
     if (block.getY() >= 21) { 
      return true; 
     } 

     if (tetrisBlockMatrix[block.getX()][block.getY() + 1] != null) { 
      return true; 
     } 
    } 
    return false; 
} 

public boolean checkPositionValid (int x, int y) { 
    if (x < 0 || y < 0 || 
      x > 15 || y > 21) 
     return false; 
    if (tetrisBlockMatrix[x][y] == null) 
     return true; 
    return false; 
} 

public void move (int side) { 
    if (side == 1 || side == -1) { 
     for (TetrisBlock block:blocks) { 
      block.setX (block.getX() + side); 
     } 

     for (TetrisBlock block:blocks) { 
      if (!checkPositionValid (block.getX(), block.getY())) { 
       if (side == LEFT) 
        move (RIGHT); 
       else 
        move (LEFT); 
      } 
     } 
    } else { 
     throw new IllegalArgumentException(); 
    } 
} 

public void addTetrisBlocksToMatrix (TetrisBlock[][] matrix) { 
    for (TetrisBlock block:blocks) { 
     if (matrix[block.getX()][block.getY()] == null) { 
      matrix[block.getX()][block.getY()] = block; 
     } else { 
      throw new IllegalArgumentException(); 
     } 
    } 
} 

public void setTimerEnabled (boolean value) { 
    if (value) { 
     timer.cancel(); 
     timer = new Timer(); 
     timer.scheduleAtFixedRate (task, 0L, 1000L); 
    } else { 
     timer.cancel(); 
    } 
} 

public void setTimerInterval (int milliseconds) { 
    timer.cancel(); 
    timer = new Timer(); 
    timer.scheduleAtFixedRate (task, 0L, milliseconds); 
} 

protected Tetrimino (TetrisBlock[][] matrix, TetrisActivity activity) { 
    this.tetrisBlockMatrix = matrix; 
    timer = new Timer(); 
    timer.scheduleAtFixedRate (task, 0L, 1000L); 
    landedEventListeners = new ArrayList<>(); 
    blocks = new TetrisBlock[4]; 
} 

}

+0

попробуйте перезагрузить Android-студию – Prachi

+0

- это TetrisActivity, добавленная в AndroidManifest.xml? – calvinfly

+0

да, конечно! – Sweeper

ответ

2

исправить его путем многократного зацикливания через следующие:

  • Restart Logcat
  • Изменить фильтр в No Filters из Show o олько выбранное приложение
  • Изменить уровень протоколирования для отладки и обратно многословной
  • Отключите и подключите устройство обратно
  • Запуск ADB убить сервер и ADB запуск сервера
  • Restart Android Studio
  • Restart Computer