Problem bei Ausführung von Mueckenfang-Spiel

  • 9 Antworten
  • Letztes Antwortdatum
M

m53

Neues Mitglied
0
Hallo,

ich versuche - wie wohl viele andere vor mir - mir die Android-Programmierung anhand des Buches "Android-Apps entwickeln (...)" von Uwe Post beizubringen und stehe vor dem Problem, dass ich die Fehlermeldung "Leider wurde Mueckenfang beendet." bekomme, sobald ich im Hauptbildschirm den Button anklicke, der mich ins eigentliche Spiel bringen soll.

LogCat gibt folgende Meldungen von sich:

Code:
04-03 10:31:17.656: D/AndroidRuntime(470): Shutting down VM
04-03 10:31:17.656: W/dalvikvm(470): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
04-03 10:31:17.665: E/AndroidRuntime(470): FATAL EXCEPTION: main
04-03 10:31:17.665: E/AndroidRuntime(470): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.androidnewcomer.mueckenfang/de.androidnewcomer.mueckenfang.GameActivity}: java.lang.ClassCastException: android.widget.FrameLayout
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.os.Looper.loop(Looper.java:123)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.app.ActivityThread.main(ActivityThread.java:4627)
04-03 10:31:17.665: E/AndroidRuntime(470):     at java.lang.reflect.Method.invokeNative(Native Method)
04-03 10:31:17.665: E/AndroidRuntime(470):     at java.lang.reflect.Method.invoke(Method.java:521)
04-03 10:31:17.665: E/AndroidRuntime(470):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-03 10:31:17.665: E/AndroidRuntime(470):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-03 10:31:17.665: E/AndroidRuntime(470):     at dalvik.system.NativeStart.main(Native Method)
04-03 10:31:17.665: E/AndroidRuntime(470): Caused by: java.lang.ClassCastException: android.widget.FrameLayout
04-03 10:31:17.665: E/AndroidRuntime(470):     at de.androidnewcomer.mueckenfang.GameActivity.bildschirmAktualisieren(GameActivity.java:79)
04-03 10:31:17.665: E/AndroidRuntime(470):     at de.androidnewcomer.mueckenfang.GameActivity.starteRunde(GameActivity.java:64)
04-03 10:31:17.665: E/AndroidRuntime(470):     at de.androidnewcomer.mueckenfang.GameActivity.spielStarten(GameActivity.java:49)
04-03 10:31:17.665: E/AndroidRuntime(470):     at de.androidnewcomer.mueckenfang.GameActivity.onCreate(GameActivity.java:42)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-03 10:31:17.665: E/AndroidRuntime(470):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-03 10:31:17.665: E/AndroidRuntime(470):     ... 11 more
Ich hoffe, dass man mir helfen kann und bedanke mich im Voraus.
 
Code:
java.lang.ClassCastException

Versuchst du ein Objekt zu instanziieren und dabei den Typ zu ändern?

Schau mal in die GameActivity.java auf Zeile 79.
 
Ja, im Buch wird betont, dass die Umwandlung wichtig ist.
Hab die Methode auch schon mit dem Muster-Code auf der Buch-CD verglichen - da stimmt alles überein.
 
Mh, ohne den Code zu sehen ist das bissel schwer zu sagen, was nun nicht stimmt, weil den Fehler gibt es ja definitiv ;)
 
Okay, dann ist hier einmal die GameActivity. ;)

Code:
package de.androidnewcomer.mueckenfang;

import java.util.Date;
import java.util.Random;

import android.app.Activity;
import android.app.Dialog;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class GameActivity extends Activity implements OnClickListener, Runnable
{
    private static final int ZEITSCHEIBEN = 600;
    private static final int INTERVALL = 100;
    private int runde;
    private int punkte;
    private int muecken;
    private int gefangeneMuecken;
    private int zeit;
    private float massstab;
    private Random zufallsgenerator = new Random();
    private FrameLayout spielbereich;
    private static final long HOECHSTALTER_MS = 2000;
    private Handler handler = new Handler();
    private MediaPlayer mp;
    
   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game);
        spielbereich = (FrameLayout) findViewById(R.id.spielbereich);
        massstab = getResources().getDisplayMetrics().density;
        spielStarten();
        mp = MediaPlayer.create(this, R.raw.summen);
    }
    
    private void spielStarten()
    {
        runde = 0;
        punkte = 0;
        starteRunde();
    }
    
    private void starteRunde()
    {
        runde = runde+1;
        muecken = runde*10;
        gefangeneMuecken = 0;
        zeit = ZEITSCHEIBEN;
        int id = getResources().getIdentifier("hintergrund"+Integer.toString(runde), "drawable", this.getPackageName());
        if(id>0)
        {
            LinearLayout l = (LinearLayout) findViewById(R.id.hintergrund);
            l.setBackgroundResource(id);
        }
        bildschirmAktualisieren();
        handler.postDelayed(this, INTERVALL);
    }
    
    private void bildschirmAktualisieren()
    {
        TextView tvPunkte = (TextView) findViewById(R.id.points);
        tvPunkte.setText(Integer.toString(punkte));
        
        TextView tvRunde = (TextView) findViewById(R.id.round);
        tvRunde.setText(Integer.toString(runde));
        
        TextView tvTreffer = (TextView) findViewById(R.id.hits);
        tvTreffer.setText(Integer.toString(gefangeneMuecken));
        
        TextView tvZeit = (TextView) findViewById(R.id.time);
        tvZeit.setText(Integer.toString(zeit));
        
        FrameLayout flTreffer = (FrameLayout) findViewById(R.id.bar_hits);
        FrameLayout flZeit = (FrameLayout) findViewById(R.id.bar_time);
        
        LayoutParams lpTreffer = flTreffer.getLayoutParams();    
        lpTreffer.width = Math.round( massstab * 300 * Math.min( gefangeneMuecken, muecken) / muecken );
        
        LayoutParams lpZeit = flZeit.getLayoutParams();
        lpZeit.width = Math.round ( massstab * zeit * 300 / ZEITSCHEIBEN);
    }
    
    private void zeitHerunterzaehlen()
    {
        zeit = zeit - 1;
        float zufallszahl = zufallsgenerator.nextFloat();
        double wahrscheinlichkeit = muecken * 1.5 / ZEITSCHEIBEN;
        if( wahrscheinlichkeit > 1 )
        {
            eineMueckeAnzeigen();
        
        if( zufallszahl < wahrscheinlichkeit -1 )
        {
            eineMueckeAnzeigen();
        }
        else
        {
            if( zufallszahl < wahrscheinlichkeit)
            {
                eineMueckeAnzeigen();
            }
        }
        }
        
        mueckenVerschwinden();
        bildschirmAktualisieren();
        if(!pruefeSpielende())
        {
            if(!pruefeRundenende())
            {
                handler.postDelayed(this, INTERVALL);
            }
        }    
    }
    
    private boolean pruefeSpielende()
    {
        if ( zeit == 0 && gefangeneMuecken < muecken)
        {
            gameOver();
            return true;
        }
        return false;
    }
    
    private boolean pruefeRundenende()
    {
        if ( zeit == 0)
        {
            starteRunde();
            return true;
        }
        return false;
    }
    
    @Override
    public void onClick(View muecke)
    {
        gefangeneMuecken++;
        punkte += 100;
        bildschirmAktualisieren();
        spielbereich.removeView(muecke);
        mp.pause();
    }
    
    public void eineMueckeAnzeigen()
    {
        int breite = spielbereich.getWidth();
        int hoehe = spielbereich.getHeight();
        int muecke_breite = (int) Math.round(massstab*50);
        int muecke_hoehe = (int) Math.round(massstab*42);
        int links = zufallsgenerator.nextInt(breite - muecke_breite);
        int oben = zufallsgenerator.nextInt(hoehe - muecke_hoehe);
        
        ImageView muecke = new ImageView(this);
        muecke.setImageResource(R.drawable.muecke);
        muecke.setOnClickListener(this);
        
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(muecke_breite, muecke_hoehe);
        params.leftMargin = links;
        params.topMargin = oben;
        params.gravity = Gravity.TOP + Gravity.LEFT;
        spielbereich.addView(muecke,params);
        muecke.setTag(R.id.geburtsdatum, new Date());
        
        mp.seekTo(0);
        
    }
    
    public void mueckenVerschwinden()
    {
        int nummer = 0;
        while(nummer < spielbereich.getChildCount())
        {
            ImageView muecke = (ImageView)spielbereich.getChildAt(nummer);
            nummer ++;
            Date geburtsdatum = (Date) muecke.getTag(R.id.geburtsdatum);
            geburtsdatum.getTime();
            long alter = (new Date()).getTime() - geburtsdatum.getTime();
        
            if ( alter > HOECHSTALTER_MS)
            {
                spielbereich.removeView(muecke);
                mp.pause();
            }
            else
            {
                nummer++;
            }
        }
    }

    public void gameOver()
    {
        Dialog dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
        dialog.setContentView(R.layout.gameover);
        dialog.show();
    }

    @Override
    public void run()
    {
        zeitHerunterzaehlen();
    }
    
    @Override
    protected void onDestroy()
    {
        mp.release();
        super.onDestroy();
    }


}
 
Und die angegebenen IDs sind auch wirkich die, als was du diese versuchst zu lesen? Sehe so keine Fehler, liegt evt. am Layout.
 
hi, ich beschäftige mich gerade auch mit dem programmieren dieser app aus dem buch, und bei mir funktioniert auch nicht alles. leider habe ich die cd verloren, daher meine frage
@m53 : kannnst du mir bitte den inhalt der cd schicken (zB mit dropbox) ? wär echt nett von dir ;)
 
Zuletzt bearbeitet:
Hallo,

komme leider erst jetzt dazu, zu antworten.
An den IDs zweifle ich nicht; das Layout werde ich heute nochmal überarbeiten.

@olex.: Ich glaube nicht, dass ich das kann. Gibt doch bestimmt Probleme mit dem Urheberrecht oder?

Der ursprüngliche Beitrag von 14:19 Uhr wurde um 14:50 Uhr ergänzt:

Das Spiel stürzt jetzt nicht mehr ab, allerdings tauchen keine Mücken mehr auf. :thumbdn:

Der ursprüngliche Beitrag von 14:50 Uhr wurde um 16:31 Uhr ergänzt:

Danke, hat sich erledigt.
Da war ein Fehler in der Verkettung von if-Schleifen.
 
hi m53,

also das mit dem urheberrecht kann nicht sein, der autor hat das alles ja veröffentlicht, im buch bietet er einem ja an seine dateien zu nutzen. und er zeigt ja auch, wie man das spiel dann im play store veröffentlicht, obwohl die idee für das spiel ja eigentlich seine ist.

wie gesagt wär echt nett wenn du mir den quellcode schicken könntest...
aber wenn du nicht einverstanden bist, ich kann dich ja nicht dazu zwingen
 
Hallo,

unterlasst es bitte die CD vom Buch hier bereitzustellen.
Sollt der Autor/Verlag die CD ins Internet gestellt haben, dürft ihr den Link dazu natürlich teilen. Sollte dem jedoch nicht so sein, dann beachtet bitte die Lizenzbestimmungen der CD und des Codes.
Solange der Code nicht unter der GPL oder einer anderen offenen Lizenz steht, könnt ihr ihn nicht einfach so mit anderen teilen. Welche Lizenz für den Code gilt findet ihr sicher im Code.

Strenger sind die Regeln für eine gesamte CD. Wenn es keine offizielle Downloadmöglichkeit vom Verlag/Autor gibt, gelten für die CD als Gesamtheit die selben urheberrechtlichen Bestimmungen wie für das Buch.
Ob euer gegenüber sich das Buch auch gekauft hat, ist dabei unerheblich.

Danke
perpe
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Themen

koje71
Antworten
0
Aufrufe
370
koje71
koje71
E
Antworten
0
Aufrufe
1.101
ey6799
E
numanoid
Antworten
6
Aufrufe
1.818
numanoid
numanoid
Zurück
Oben Unten