Creando la gravedad del juego en Android (continuación)?
EDIT: He echado un vistazo a la LogCat, y dijo que no podía inflar com.example.playground. Entonces me di cuenta que me necesitaba com.game.myapp.Playground. Funcionó después de que lo cambié.
Recientemente pregunté por qué la gravedad no funcionaba en mi aplicación para Android ( enlace ) y todavía tengo problemas con ella. Cambié la vista a la clase "Playground" pero ahora solo fuerza se cierra. ¿Qué estoy haciendo mal?
- Cómo vaciar (borrar) el búfer logcat en Android
- Qué hacer cuando falla la aplicación y logcat no muestra errores
- Cómo ver una matriz en logcat para android
- Android: Recuperar logcat antes de bloquear (reiniciar) en un dispositivo real
- Android - ¿cómo se filtra el spam de la consola de Eclipse LogCat?
package com.game.myapp; import android.app.Activity; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Bundle; public class InGame extends Activity{ Playground v; private int radius; private int xPosition; private int yPosition; private Paint paint; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Rewrite this, it sucks. Seriously. super.onCreate(savedInstanceState); v = new Playground(this); setContentView(v); } public InGame(int x, int y, int radius, int color) { this.xPosition = x; this.yPosition = y; this.radius = radius; paint = new Paint(color); } void moveBall(int x, int y){ xPosition = x; yPosition =y; } void onDraw(Canvas canvas){ canvas.drawCircle(xPosition, yPosition, radius, paint); } }
Área de juegos:
package com.game.myapp; import android.content.Context; import android.graphics.Canvas; import android.view.View; public class Playground extends View{ public static InGame ball; public Playground(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); if (ball != null ){ ball.onDraw(canvas); } } }
Heres el LogCat:
11-04 16:36:33.945: D/dalvikvm(13177): newInstance failed: no <init>() 11-04 16:36:33.949: D/AndroidRuntime(13177): Shutting down VM 11-04 16:36:33.949: W/dalvikvm(13177): threadid=1: thread exiting with uncaught exception (group=0x4001e578) 11-04 16:36:33.953: E/AndroidRuntime(13177): FATAL EXCEPTION: main 11-04 16:36:33.953: E/AndroidRuntime(13177): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.game.myapp/com.game.myapp.InGame}: java.lang.InstantiationException: com.game.myapp.InGame 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1573) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.os.Handler.dispatchMessage(Handler.java:99) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.os.Looper.loop(Looper.java:130) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.app.ActivityThread.main(ActivityThread.java:3687) 11-04 16:36:33.953: E/AndroidRuntime(13177): at java.lang.reflect.Method.invokeNative(Native Method) 11-04 16:36:33.953: E/AndroidRuntime(13177): at java.lang.reflect.Method.invoke(Method.java:507) 11-04 16:36:33.953: E/AndroidRuntime(13177): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 11-04 16:36:33.953: E/AndroidRuntime(13177): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 11-04 16:36:33.953: E/AndroidRuntime(13177): at dalvik.system.NativeStart.main(Native Method) 11-04 16:36:33.953: E/AndroidRuntime(13177): Caused by: java.lang.InstantiationException: com.game.myapp.InGame 11-04 16:36:33.953: E/AndroidRuntime(13177): at java.lang.Class.newInstanceImpl(Native Method) 11-04 16:36:33.953: E/AndroidRuntime(13177): at java.lang.Class.newInstance(Class.java:1409) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 11-04 16:36:33.953: E/AndroidRuntime(13177): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1565) 11-04 16:36:33.953: E/AndroidRuntime(13177): ... 11 more
- Solucionar 'la aplicación ha detenido' los errores de error
- ¿Cómo desactivar la pausa LogCat completamente?
- Eclipse Android - Logcat Despejar demasiado rápido
- Tratando de enviar mi LogCat a un archivo
- Mostrar Logcat en Terminal?
- Cómo se guardan los mensajes de logcat
- E / art: Error al enviar la respuesta al depurador: Canal roto, pero la aplicación todavía se ejecuta
- Cómo filtrar una variable en el visor de Eclipse LogCat
Aquí está el código completo. Acabo de escribir esto y lo probé. Funciona. He añadido un temporizador a la actividad para mover la bola hacia la derecha y hacia abajo por 10 píxeles cada segundo. Por favor, estudiarlo, aprender de él y adaptarlo a sus necesidades.
Clase de bola.
package com.example; import android.graphics.Canvas; import android.graphics.Paint; public class Ball{ private int radius; private int xPosition; private int yPosition; private int color; private Paint paint; public Ball(int x, int y, int radius, int color) { this.xPosition = x; this.yPosition = y; this.radius = radius; paint = new Paint(); paint.setColor(color); } int getX(){return this.xPosition;} int getY(){return this.yPosition;} void moveBall(int x, int y){ xPosition = x; yPosition =y; } void onDraw(Canvas canvas){ canvas.drawCircle(xPosition, yPosition, radius, paint); } }
Clase de juegos infantiles
package com.example; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.widget.ImageView; public class Playground extends ImageView { private Ball ball; public Playground(Context context) { this(context,null); } public Playground(Context context, AttributeSet attrs) { this(context, attrs,0); } public Playground(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setBall(Ball ball){ this.ball = ball; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); if (ball != null ){ ball.onDraw(canvas); } } }
Clase de actividad
package com.example; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import java.util.Timer; import java.util.TimerTask; public class MyActivity extends Activity { /** * Called when the activity is first created. */ Playground playground; Ball ball; Timer myTimer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); playground = (Playground) findViewById(R.id.playground); ball = new Ball(100, 100, 20, Color.RED); playground.setBall(ball); myTimer = new Timer(); myTimer.schedule(new TimerTask() { @Override public void run() { Update(); } }, 0, 1000); } private void Update() { this.runOnUiThread(moveBall); } private Runnable moveBall = new Runnable() { public void run() { ball.moveBall(ball.getX() + 10, ball.getY() + 10); playground.invalidate(); } }; }
[EDITAR] El XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.example.Playground android:id="@+id/playground" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </LinearLayout>
Puntos clave para OOP.
La pelota no tiene conocimiento del patio o de la actividad. Tiene un método que puede ser llamado por algo que le pide dibujar en un lienzo, pero para todo lo que sabe, puede ser un lienzo invisible, o un lienzo de un botón, o un lienzo de un mapa de bits – no sabe o necesito saber. Es el trabajo de lo que llama el método de preocuparse por eso.
El Parque no tiene conocimiento de la actividad o de la Pelota. Sabe que puede tener una instancia de una clase Ball y si lo tiene, debe llamar a su método onDraw, pero no tiene idea de lo que es la pelota o lo que dibuja. La Bola se preocupa por eso.
La actividad no tiene conocimiento de la pelota o el patio de recreo que no tiene uno de cada uno y llama al método de movimiento de bola y luego le dice al patio de recreo que se vuelva a dibujar.
El punto es, usted podría cambiar los métodos de dibujo, los métodos de movimiento y todo lo demás sin recodificación (OK, en general). Por ejemplo, puede cambiar el onDraw en la clase Ball para dibujar un rectángulo. Por supuesto, el nombre de la clase es ahora una mala elección, pero tienes la idea …
No tienes un constructor predeterminado en tu Activity
InGame
, que es necesario para que Android pueda instanciarlo.
La presencia de un constructor explícito no provocará la definición de ningún constructor no-arg implícito. Puede que tenga que proporcionar su propio constructor no-arg que inicializa a sus miembros a valores predeterminados.
Quiero borrar el constructor explícito y poner la inicialización en el onCreate(Bundle)
.
- Diálogo de progreso de Android show mientras espera la ubicación
- Android: Cannnot guardar datos downladed desde el servidor utilizando DownloadManager a la memoria interna