Итак, у меня есть игра для 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];
}
}
попробуйте перезагрузить Android-студию – Prachi
- это TetrisActivity, добавленная в AndroidManifest.xml? – calvinfly
да, конечно! – Sweeper