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?

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 

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) .

  • Visor de Logcat en Eclipse parpadea de manera molesta
  • Huawei, logcat no mostrar el registro de mi aplicación?
  • Cliente autónomo de Logcat
  • La aplicación Android falla sin ningún logcat ni ninguna excepción
  • Androide logcat registra la línea del módulo chatty expirar mensaje
  • Logcat de Android registrando sólo el nivel de información en el dispositivo real. No se pueden obtener mensajes de depuración, ni siquiera las excepciones no controladas
  • Los datos de Logcat no se muestran en la ficha Registro de DDMS Eclipse
  • ¿Por qué Logcat no está mostrando nada?
  • Sería mejor ser explícito si se requiere un buffer de 8k-char.
  • La instancia de audiorecord de Android falla
  • WARN in logcat ResourceType: Para el recurso ..., el índice de entrada (...) está más allá del tipo entryCount (1)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.