Mückenfang

N

Nentiker

Fortgeschrittenes Mitglied
30
Zuletzt bearbeitet von einem Moderator:
Is halt ne große Herausforderung "ich hab ein Programm das nicht funktioniert".

Mein Vorschlag: fang mit 'nem "Hello World" an (z.B. Hello, World | Android Developers )
dann solltest du zumindest mal was zum Laufen bringen.

Und dann geh Step by Step weiter was du aus deinem Beispiel verstehst und weiter entwickeln kannst.


(Wenigstens ein Fehlerprotokoll wäre nötig um dir obern weiterhelfen zu können. Ich geh nämlich davon aus, dass das Programm auf allen Rechnern läuft, wenn man es "richtig" testet.)
 
Zuletzt bearbeitet:
Das Buch was ich habe ist für Programmieranfänger und ich bin nach dem Buch gegangen.
Wieso soll ich jetzt ohne Tutorial in die richtung arbeiten in die das Buch geht?
 
Wenn das Buch / Tutorial nicht funktioniert,
- dann ist es entweder nicht stabil genug für Anfänger
- oder hast du irgendwas nicht genau gelesen / übersehen
- oder ist deine Rechnerkonfiguration nicht "korrekt" und das Buch ght nicht darauf ein

In Fall 1 + 2 kann ich nur empfehlen ein anderes "anfängergerechteres" Tutorial zu testen.

In Fall 3 kann sein, dass du lange Fehler suchst, (insbesonders ohne FehlerLog).

Wie gesagt: ich vermute, das das Programm funktionieren sollte, wenn man die Tutorial-Anleitung exakt befolgt. (Außer das Tutorial wäre sch...)

Probier doch http://developer.android.com/resources/tutorials/hello-world.html!
 
Ich nutze für die Tests ein Android Tablet.

Das das funktionieren sollte weiß ich auch, deswegen suche ich ja nach hilfe.

Log:
05-08 16:12:51.710: I/Process(3173): Sending signal. PID: 3173 SIG: 9
05-08 16:14:48.507: D/skia(3237): Loading ARM decoder...
05-08 16:14:48.570: D/dalvikvm(3237): GC_EXTERNAL_ALLOC freed 44K, 50% free 2711K/5379K, external 1625K/2137K, paused 47ms
05-08 16:14:48.703: D/dalvikvm(3237): GC_EXTERNAL_ALLOC freed 1K, 50% free 2710K/5379K, external 3765K/4702K, paused 56ms
05-08 16:14:48.945: D/dalvikvm(3237): GC_EXTERNAL_ALLOC freed 2K, 50% free 2716K/5379K, external 4051K/5059K, paused 49ms
05-08 16:14:49.062: D/dalvikvm(3237): GC_EXTERNAL_ALLOC freed <1K, 50% free 2716K/5379K, external 5926K/7401K, paused 22ms
05-08 16:14:50.589: D/skia(3237): Loading ARM decoder...
05-08 16:14:50.668: D/dalvikvm(3237): GC_EXTERNAL_ALLOC freed 8K, 50% free 2743K/5379K, external 6161K/8036K, paused 79ms
05-08 16:14:50.793: D/dalvikvm(3237): GC_EXTERNAL_ALLOC freed <1K, 50% free 2742K/5379K, external 8301K/10349K, paused 25ms
05-08 16:14:52.004: D/AndroidRuntime(3237): Shutting down VM
05-08 16:14:52.004: W/dalvikvm(3237): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-08 16:14:52.004: E/AndroidRuntime(3237): FATAL EXCEPTION: main
05-08 16:14:52.004: E/AndroidRuntime(3237): java.lang.NullPointerException
05-08 16:14:52.004: E/AndroidRuntime(3237): at de.Nentiker.mueckenfang.GameActivity.mueckenVerschwinden(GameActivity.java:132)
05-08 16:14:52.004: E/AndroidRuntime(3237): at de.Nentiker.mueckenfang.GameActivity.zeitHerunterzaehlen(GameActivity.java:76)
05-08 16:14:52.004: E/AndroidRuntime(3237): at de.Nentiker.mueckenfang.GameActivity.run(GameActivity.java:157)
05-08 16:14:52.004: E/AndroidRuntime(3237): at android.os.Handler.handleCallback(Handler.java:587)
05-08 16:14:52.004: E/AndroidRuntime(3237): at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 16:14:52.004: E/AndroidRuntime(3237): at android.os.Looper.loop(Looper.java:130)
05-08 16:14:52.004: E/AndroidRuntime(3237): at android.app.ActivityThread.main(ActivityThread.java:3683)
05-08 16:14:52.004: E/AndroidRuntime(3237): at java.lang.reflect.Method.invokeNative(Native Method)
05-08 16:14:52.004: E/AndroidRuntime(3237): at java.lang.reflect.Method.invoke(Method.java:507)
05-08 16:14:52.004: E/AndroidRuntime(3237): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-08 16:14:52.004: E/AndroidRuntime(3237): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-08 16:14:52.004: E/AndroidRuntime(3237): at dalvik.system.NativeStart.main(Native Method)
 
Moin,

da ich mit diesem Buch auch mal angefangen habe (hab aber wegen dieser Fehler frustriert aufgehört und das Internet verwendet ;-)), kenne, glaube ich, deinen Fehler.
Kann es sein, das du die Activity, die mit "Start" aufgerufen wird, nicht im Manifest registriert hast??

Es wäre nämlich einer der klassischen Fehler, die mir oft unterlaufen sind beim abtippen von Programmen.

Grüße, L4e

PS: Hier liegt dein Fehler:
05-08 16:14:52.004: W/dalvikvm(3237): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-08 16:14:52.004: E/AndroidRuntime(3237): FATAL EXCEPTION: main
05-08 16:14:52.004: E/AndroidRuntime(3237): java.lang.NullPointerException
d.h. manchmal, das ein Objekt (Variable etc.) nicht initialisiert ist.
Poste mal deinen Quellcode

PPS: ich habe das Buch zwar nicht dar, aber es gibt den Inhalt als PDF im Internet und da steht bei "NullPointerException": Seite 228, 306, 320
 
Zuletzt bearbeitet:
Die Activty hab ich registriert^^
Sie wird auch aufgerufen, ab da kommt der Fehler.

Nentiker
 
steht ja da nullpointerexception zeile 132 in GameActivity

dort ist was nicht initialisiert
 
Code:
package de.Nentiker.mueckenfang;

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

import android.app.Activity;
import android.app.Dialog;
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.TextView;

public class GameActivity extends Activity implements OnClickListener, Runnable{

	private float massstab;
	private Random zufallsgenerator = new Random();
	private FrameLayout spielbereich;
	private static final long HOECHSTALTER_MS = 2000;
	private int runde;
	private int punkte;
	private int muecken;
	private int gefangeneMuecken;
	private int zeit;
	private static final int ZEITSCHEIBEN = 600;
	private Handler handler = new Handler();
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game);
        spielbereich = (FrameLayout) findViewById(R.id.spielbereich);
        massstab = getResources().getDisplayMetrics().density;
        spielStarten();
    }
        
	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 tvRestzeit = (TextView) findViewById(R.id.time);
		tvRestzeit.setText(Integer.toString(zeit));
		FrameLayout flTreffer = (FrameLayout)findViewById(R.id.bar_hits);
		LayoutParams lpTreffer = flTreffer.getLayoutParams();
		lpTreffer.width = Math.round( massstab * 300 * Math.min( gefangeneMuecken,muecken) / muecken );
		FrameLayout flZeit = (FrameLayout)findViewById(R.id.bar_time);
		LayoutParams lpZeit = flZeit.getLayoutParams();
		lpZeit.width = Math.round( massstab * zeit * 300 / 60 );
		
		
	}
	
	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, 1000);
      		}
   		}
	}
	
	private boolean pruefeSpielende() {
		if ( zeit == 0 && gefangeneMuecken < muecken) {
			gameOver();
			return true;
		}
		return false;
	}
	
	private boolean pruefeRundenende() {
		if ( zeit == 0) {
			starteRunde();
			return true;
		}
		return false;
	}
	
private void eineMueckeAnzeigen() {
    	
		int breite = spielbereich.getWidth();
    	int hoehe = spielbereich.getHeight();
    	

    	ImageView muecke = new ImageView(this);
    	muecke.setImageResource(R.drawable.muecke);
    	muecke.setTag(R.id.geburtsdatum, new Date());
    	muecke.setOnClickListener(this);
    	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);

    	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);
    }
	
private void mueckenVerschwinden() {
	spielbereich = (FrameLayout) findViewById(R.id.spielbereich);
	
	int nummer=0;
	while(nummer<spielbereich.getChildCount()) {
		ImageView muecke = (ImageView) spielbereich.getChildAt(nummer);
		Date geburtsdatum = (Date) muecke.getTag(R.id.geburtsdatum);
		long alter = (new Date()).getTime() - geburtsdatum.getTime();
		if(alter > HOECHSTALTER_MS) {
			[B][I][U]spielbereich.removeView(muecke);[/U][/I][/B]
		} else { 
    		nummer++;
		}
	}
}

	public void onClick(View muecke) {
	// TODO Auto-generated method stub
	gefangeneMuecken++;
	punkte += 100;
	bildschirmAktualisieren();
	spielbereich.removeView(muecke);
	}
	
	public void gameOver() {
		Dialog dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
		dialog.setContentView(R.layout.gameover);
		dialog.show();
	}

	public void run() {
		// TODO Auto-generated method stub
		zeitHerunterzaehlen();
		
	}
	
	private void starteRunde() {
		runde = runde +1;
		muecken = runde *20;
		gefangeneMuecken = 0;
		zeit = 60;
		bildschirmAktualisieren();
		handler.postDelayed(this, 1000);
	}
	
	private void spielStarten() {
		runde = 0;
		punkte = 0;
		starteRunde();
	}
	
	public interface Runnable {
		public void run();
	}
}
 
Zuletzt bearbeitet:
und du glaubst jemand wird jetzt bis zeile 132 zählen ?
 
  • Danke
Reaktionen: SuperHans und programm2008
swordi schrieb:
und du glaubst jemand wird jetzt bis zeile 132 zählen ?

Es wurde nach dem Quellcode verlangt.
Hab mal die Zeile markiert.
 
Aus Neugier hab ich's jetzt mal getestet:

Schmeiß den Schrott weg, und verlang dein Geld zurück!

Bei mir kommt der selbe Fehler.
Nach einigen Nachbesserungen läuft es dann, ist aber immer noch "unspielbar".
(Mir gehts natürlich nicht ums spielen, aber ein Musterprogramm sollte doch funktionieren.)
Nach verändern einiger Werte kriegt man es dann ungefähr hin.
Das darf in einem Lernbeispiel nicht passieren.
 
Hallihallo,

ich bin's nochmal. Hab mir deinen Quellcode mal genauer angesehen und mir ist aufgefallen, das du das ganze INTERVALL-Variablen Zeugs nicht hast.

Hier mal der Orginalcode (probier den mal aus):
PHP:
package de.androidnewcomer.mueckenfang;

public class GameActivity extends Activity implements Runnable,OnClickListener {
      
    private static final int INTERVALL = 100;
    private static final int ZEITSCHEIBEN = 600;
    private Random zufallsgenerator = new Random();
    private Handler handler = new Handler();
    private FrameLayout spielbereich;
    private int runde;
    private int punkte;
    private int muecken;
    private int gefangeneMuecken;
    private int zeit;
    private float massstab;
    private static final long HOECHSTALTER_MS = 2000;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game);
        spielbereich = (FrameLayout) findViewById(R.id.spielbereich);
        massstab = getResources().getDisplayMetrics().density;
        spielStarten();
    }
    
    private void spielStarten() {
        runde = 0;
        punkte = 0;
        starteRunde();
    }
    
    private void starteRunde() {
        runde = runde + 1;
        muecken = runde * 20;
        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 boolean pruefeRundenende() {
        if (zeit == 0) {
            starteRunde();
            return true;
        }
        return false;
    }

    private boolean pruefeSpielende() {
        if (zeit == 0 && gefangeneMuecken < muecken) {
            gameOver();
            return true;
        }
        return false;
    }

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

    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 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 tvRestzeit = (TextView) findViewById(R.id.time);
        tvRestzeit.setText(Integer.toString(zeit));
        FrameLayout flTreffer = (FrameLayout)findViewById(R.id.bar_hits);
        LayoutParams lpTreffer = flTreffer.getLayoutParams();
        lpTreffer.width = Math.round( massstab * 300 * Math.min( gefangeneMuecken,muecken) / muecken );
        FrameLayout flZeit = (FrameLayout)findViewById(R.id.bar_time);
        LayoutParams lpZeit = flZeit.getLayoutParams();
        lpZeit.width = Math.round( massstab * zeit * 300 / ZEITSCHEIBEN );
    }

    private void eineMueckeAnzeigen() {
        
        int breite = spielbereich.getWidth();
        int hoehe = spielbereich.getHeight();
        

        ImageView muecke = new ImageView(this);
        muecke.setImageResource(R.drawable.muecke);
        muecke.setTag(R.id.geburtsdatum, new Date());
        muecke.setOnClickListener(this);
        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);

        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);
    }
    
    private void mueckenVerschwinden() {
        spielbereich = (FrameLayout) findViewById(R.id.spielbereich);
        
        int nummer=0;
        while(nummer<spielbereich.getChildCount()) {
            ImageView muecke = (ImageView) spielbereich.getChildAt(nummer);
            Date geburtsdatum = (Date) muecke.getTag(R.id.geburtsdatum);
            long alter = (new Date()).getTime() - geburtsdatum.getTime();
            if(alter > HOECHSTALTER_MS) {
                spielbereich.removeView(muecke);
            } else { 
                nummer++;
            }
        }
    }

    @Override
    public void run() {
        zeitHerunterzaehlen();
    }

    @Override
    public void onClick(View muecke) {
        
        gefangeneMuecken++;
        punkte += 100;
        bildschirmAktualisieren();
        spielbereich.removeView(muecke);
    }
}

Viele Grüße, L4e
 
Den Original Quellcode hab ich ja auch(durch das Buch), der funktioniert, nur möchte ich das selbst schreiben. Ich hab mich sowieso schon gewundert das mein Code anders aussieht als der im Buch, obwohl ich genau dem Buch gefolgt bin.
 
Hallo Nentiker,

ich habe mich auch an dem Beispiel versucht und bin auf deinen Thread gestossen, weil es nicht auf Anhieb lief.

Bis Seite 152 sind eigentlich alle Methoden gut erklärt und vollständig gelistet. Ab "Eine Mücke anzeigen" darf man sich dann aber selber die Codezeilen der Methoden zusammenstellen. Und ab "Handler" wird´s dann richtig haarig. Das "public interface Runnable" gehört jedenfalls nicht zum Code der GameActivity.

Mal sehen was noch kommt, aber ich bin eigentlich jetzt schon froh, dass ich das Buch nur ausgeliehen und nicht gekauft habe .

Zu deinem Code: Im Prinzip läuft der bei mir, es kommen aber zu wenig Mücken (was in der Realität ja kein Nachteil darstellen muss). Das liegt aber nicht an Autan sondern an deiner Konstanten:

private static final int ZEITSCHEIBEN = 600;

Mach hier mal "60" hin, falls du den Fehler noch nicht gefunden hast. Und vielleicht noch in starteRunde():

muecken = runde * 10;


Hier steht bei dir der Faktor 20.


Gruß
Manni
 
Hallo Linux4Ever,
selbst mit deinem code funzt es noch nicht bei mir.
Folgende Nachricht der Logcat:

Code:
12-06 14:07:33.048: D/AndroidRuntime(579): Shutting down VM
12-06 14:07:33.048: W/dalvikvm(579): threadid=1: thread exiting with uncaught exception (group=0x40015560)
12-06 14:07:33.078: E/AndroidRuntime(579): FATAL EXCEPTION: main
12-06 14:07:33.078: E/AndroidRuntime(579): java.lang.ClassCastException: android.widget.LinearLayout
12-06 14:07:33.078: E/AndroidRuntime(579):     at com.android.mueckenspiel.GameActivity.mueckenVerschwinden(GameActivity.java:157)
12-06 14:07:33.078: E/AndroidRuntime(579):     at com.android.mueckenspiel.GameActivity.zeitHerunterzaehlen(GameActivity.java:104)
12-06 14:07:33.078: E/AndroidRuntime(579):     at com.android.mueckenspiel.GameActivity.run(GameActivity.java:169)
12-06 14:07:33.078: E/AndroidRuntime(579):     at android.os.Handler.handleCallback(Handler.java:587)
12-06 14:07:33.078: E/AndroidRuntime(579):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-06 14:07:33.078: E/AndroidRuntime(579):     at android.os.Looper.loop(Looper.java:123)
12-06 14:07:33.078: E/AndroidRuntime(579):     at android.app.ActivityThread.main(ActivityThread.java:3683)
12-06 14:07:33.078: E/AndroidRuntime(579):     at java.lang.reflect.Method.invokeNative(Native Method)
12-06 14:07:33.078: E/AndroidRuntime(579):     at java.lang.reflect.Method.invoke(Method.java:507)
12-06 14:07:33.078: E/AndroidRuntime(579):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-06 14:07:33.078: E/AndroidRuntime(579):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-06 14:07:33.078: E/AndroidRuntime(579):     at dalvik.system.NativeStart.main(Native Method)
 

Ähnliche Themen

N
Antworten
2
Aufrufe
1.825
Thyrion
Thyrion
S
  • Speedy1985
Antworten
14
Aufrufe
1.566
Khan42
K
M
Antworten
9
Aufrufe
1.910
perpe
P
Zurück
Oben Unten