Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Сообщ.
#1
,
|
|
|
С целью освоить Android начинаю писать игру, кторую я написал на MobileBasic 5 лет назад.
Надо ловить яблоки, падающие сверху. Когда я запускаю приложение на данном этапе, есть две проблемы. View.getWidth(); вероятно, возвращает null private void initApple() { apple.x = rnd.nextInt(400); //работает apple.x = rnd.nextInt(sw); //не работает apple.y = 0; } где sw public GameView(Context context, AttributeSet attrs) { super(context, attrs); //... sw = this.getWidth(); //... initApple(); } И второе, если делать invalidate() с целью сделать цикл падения яблока - приложение Not Responding. private void startGame() { setContentView(R.layout.game); GameView gv = (GameView)findViewById(R.id.gameView); while (true) { gv.invalidate(); try { Thread.sleep(100); } catch (InterruptedException ie) {} } } для перерисовки и инкрементации координаты. @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(apple.b, apple.x, apple.y, null); apple.y ++; if (apple.y > sh) initApple(); } |
Сообщ.
#2
,
|
|
|
View.getWidth() - вы ее в конструкторе вызываете, в этот момент размер вьюхи не известен и функция вернет 0.
GameView - чей наследник? Для игры лучше использовать SurfaceView и отдельный поток отрисовки. |
Сообщ.
#3
,
|
|
|
Mario Zechner - Beginning Android Games поможет
getWidth обычно вызывается в OnCreate методе |
Сообщ.
#4
,
|
|
|
Цитата mrco @ View.getWidth() - вы ее в конструкторе вызываете, в этот момент размер вьюхи не известен и функция вернет 0. GameView - чей наследник? Для игры лучше использовать SurfaceView и отдельный поток отрисовки. public final class GameView extends View Отдельный поток отрисовк я так понял не это имееться в виду. ViewRootCalledFromWrongThreadException private void startGame() { new Thread() { public void run() { setContentView(R.layout.game); GameView gv = (GameView)findViewById(R.id.gameView); while (true) { gv.invalidate(); try { Thread.sleep(100); } catch (InterruptedException ie) {} } } }.start(); } И так понял не это, так как висит да и вообще подозрительный подход @Override protected void onDraw(final Canvas canvas) { new Thread() { public void run() { canvas.drawBitmap(apple.b, apple.x, apple.y, null); apple.y ++; if (apple.y > sh) initApple(); }}.start(); } Да и так будет ViewRootCalledFromWrongThreadException public class GameView extends View implements Runnable { .... public void run() { while (true) { invalidate(); try { Thread.sleep(100); } catch (InterruptedException ie) {} } } Цитата Хрен @ Mario Zechner - Beginning Android Games поможет Спс, посмотрю. |