Hi Android-Freunde,
Ich versuche mir derzeit die Grundkenntnisse in Android anzueignen, habe bereits ein bisschen Java Hintergrundwissen und ein Spiel auf Grundlage des Buches "Android-Apps entwickeln" von Galileo Computing nachgebaut.
nun bin ich auf einem Stand, auf dem es eigentlich funktionsfähig sein sollte (in der einfachsten/schlichtesten Version), erhalte jedoch beim Start der Spielrunde eine NullPointerException und weder ich, noch mein aktuell Informatik studierender Bruder können den Fehler im Code finden
long alter = (new Date()).getTime() - geburtsdatum.getTime(); //Zeile mit error
/* zerteilt in: */long alterakt=aktuell.getTime();
long altergeb= geburtsdatum.getTime();
/* um herauszufinden dass der Fehler beim auslesen des getTime von geburtsdatum ist , geburtsdatum wird hier initiiert: */
Date geburtsdatum = (Date) mueckev.getTag(R.id.geburtsdatum);
/* die id von muecke wird hier geschrieben: */
ImageView muecke = new ImageView(this);
muecke.setImageResource(R.drawable.muecke);
muecke.setTag(R.id.geburtsdatum, new Date());
/* mueckev wird hier initiiert: */
ImageView mueckev = (ImageView) spielbereich.getChildAt(nummer);
Alles anzeigen
hat jemand selbst das Spiel nachgeschrieben und das selbe Problem gehabt/ den Fehler gefunden - oder kann mir jemand anderes meinen Fehler sagen?
mit der funktionierenden Spielversion auf der DVD zum Buch habe ich bereits verglichen - konnte jedoch keine unterschiede finden (außer bei variablenbezeichnungen o.ä. - habe inzwischen nahezu 100% angeglichen - der fehler besteht weiterhin)
Informationen zum System:
Ich schreibe mit Eclipse, Compile in 1.6 (hab inzwischen auch gecheckt dass der Text im Buch in 1.7 so nicht funktioniert) - die Basis des Buches ist auf Android 2.2 also habe ich auch dies eingestellt,
getestet habe ich es auf Virtuellen Android 2.1, 2.2 Geräten, die Version von der DVD läuft auf beiden Problemlos
Liebe Grüße,
Proffni
package de.proffni.mueckenmassaker;
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 static final int INTERVALL = 100;
private static final int ZEITSCHEIBEN = 600;
private static final long HOECHSTALTER_MS = 2000;
private float massstab;
private int zeit;
private int punkte;
private int runde;
private int muecken;
private int gefangeneMuecken;
private Random zufallsgenerator = new Random();
private FrameLayout spielbereich;
private Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
massstab = getResources().getDisplayMetrics().density;
spielbereich = (FrameLayout)findViewById(R.id.spielbereich);
spielStarten();
}
private void spielStarten() {
runde = 0;
punkte = 0;
starteRunde();
}
private void starteRunde() {
runde = runde +1;
muecken = runde * 10;
gefangeneMuecken = 0;
zeit = ZEITSCHEIBEN ;
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 tvMuecken = (TextView)findViewById(R.id.hits);
tvMuecken.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;
}
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 mueckev = (ImageView) spielbereich.getChildAt(nummer);
Date geburtsdatum = (Date) mueckev.getTag(R.id.geburtsdatum);
Date aktuell = new Date();
long alterakt=aktuell.getTime();
long altergeb= ((Date)geburtsdatum).getTime();
long alter = (new Date()).getTime() - geburtsdatum.getTime();
if(alter > HOECHSTALTER_MS) {
spielbereich.removeView(mueckev);
} else {
nummer++;
}
}
}
private void gameOver() {
Dialog dialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
dialog.setContentView(R.layout.gameover);
dialog.show();
}
@Override
public void onClick(View muecke) {
gefangeneMuecken++;
punkte += 100;
bildschirmAktualisieren();
spielbereich.removeView(muecke);
}
@Override
public void run() {
zeitHerunterzaehlen();
}
}
Alles anzeigen