2012-11-05 43 views
3

编辑:我看了一下LogCat,它说它不能膨胀com.example.playground。然后我意识到它需要我com.game.myapp.Playground。它在我改变它之后工作。在Android中创建游戏引力(续)?

我最近问我为什么重力不适用于我的Android应用程序(link),我仍然遇到问题。我将视图改为“Playground”类,但现在只是强制关闭。我究竟做错了什么?

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); 
    }  
} 

游乐场类:

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); 
     } 
    } 

} 

继承人的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 
+2

嗨乔丹。你为什么试图将所有的代码放入Ball类中?你不应该尝试使用一个活动作为球!你知道,我为你写这个会更快,并且只是发布它!请,请接受我的建议。了解类和面向对象编程,然后尝试解决Android。如果您不了解OOP的基础知识,那么您将不会成功,并且会在此过程中损失大量时间。 – Simon

回答

4

下面是完整的代码。我只写了这个并测试了它。有用。我在活动中添加了一个计时器,每秒将球向右下移动10个像素。请研究它,从中学习并根据您的需求进行调整。

球类。

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); 
    } 

} 

游乐场类

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); 
     } 
    } 

} 

Activity类

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(); 
     } 
    }; 


} 

[编辑] 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> 

为OOP的关键点。

球没有游乐场或活动的知识。它有一种方法,可能会通过要求在画布上绘制的东西来调用,但对于它所知的所有内容,它可能是一个不可见的画布,或者按钮的画布,或者位图的画布 - 它不会知道或需要知道。不管任何呼叫方法担心这种情况的工作。

游乐场不知道活动或球。它知道它可能有一个Ball类的实例,如果它有,它应该调用它的onDraw方法,但它不知道球是什么或它是如何绘制的。 Ball担心这一点。

该活动除了具有其中的每一个之外并不知晓球或操场,并且调用球移动方法然后告诉游乐场重绘自己。关键是,你可以改变绘制方法,移动方法和其他一切,而不需要重新编码(一般来说)。例如,您可以更改Ball类中的onDraw以绘制矩形。当然,这个班的名字现在是一个不错的选择,但你明白了...

+0

哇!现在它变得更有意义!尽管我使用了确切的代码,但它强制关闭。作为Activity类,我将主类MainActivity和MainActivity中的xml(activity_main.xml)放在一起。我不确定发生了什么,所以我现在就把LogCat加入进来。谢谢,它看起来更清洁和更容易! – Jordan

+0

另外,一旦我解决了这个问题,我会尝试先解决OOP问题,然后我(和你)觉得,如果我首先了解到Android,会更容易。 – Jordan

+0

我在操场类中出现错误:在公共setBall(球球)中,它说“返回类型的方法丢失”,所以它希望我将其更改为public void。但是当我改变它时,它就会关闭。 LogCat在帖子中。 – Jordan

2

您的InGameActivity没有默认构造函数,为Android能够实例化它是必要的。

显式构造函数的存在将不会导致定义隐式无参数构造函数。您可能需要提供您自己的无参数构造函数,以将其成员初始化为默认值。

我会删除显式构造函数,并将初始化放入onCreate(Bundle)方法中。

+0

它已经是,但是谢谢 – Jordan

+0

看看我的编辑。 –

+0

谢谢。我如何广告无参数构造函数? – Jordan