# Parameterübergabe bei 2D-Spiel



## oyo (15. Dez 2009)

hallo leute ich bin also dabei das spiele Tutorial 2 von quaxli zu erweitern nun bin ich aber auf etwas gestoßen, was mir ???:L bereitet.

Nun ich habe eine Gegner Klasse(Grandma), die dazugehörige factory Klasse(FactoryGrandma) und eine Level01 klasse. Nun möchte ich in der Level Klasse sowohl das Mapdisplay als auch die Gegner laden.
Wird also die doInitialisations Methode der ScrollGame Klasse aufgerufen, wird das Level01 Objekt erstellt und damit auch das MapDisplay und die Gegner..

```
protected void doInitializations() {
		setLib(SpriteLib.getInstance());
		startscreen = getLib().getSprite("pics/startscreen.gif");
		car = new Car(getLib().getSprite("pics/Airplane.gif",3, 1),400,300,200,this);
                W = new Weapon(getLib().getSprite("pics/W1.gif",1,1),200,200,200,this,50,6);
		L01=new Level01(this);
		L01.doIni();
		
	}
```
soweit so gut.. werfen wir nun einen Blick auf die Level01 Klasse:

```
package LevelC;

import java.awt.Graphics;
import java.awt.geom.Rectangle2D;


import main.ScrollGame;

import tutorial.map.MapDisplay;
import Enemy.FactoryEnemySprite;
import Enemy.FactoryGrandma;
import Enemy.Grandma;
public class Level01 extends LevelI {
	private FactoryGrandma G1Factory;
	Grandma G1[];
	public MapDisplay map;
	FactoryEnemySprite Enemy1Fac;
	private boolean isStarted;
	public Level01(ScrollGame p){
		super(p);
		this.setStarted(true);
		this.map = new MapDisplay("level/newlevel.txt","pics/stars.gif","pics/shadow2.gif",1,1,parent,5,5);
		this.getMap().setVisibleRectangle(new Rectangle2D.Double(50,map.getHeight()-map.getHeight(),
				map.getWidth(),map.getHeight()));
		this.G1Factory = new FactoryGrandma(parent);
		G1 = new Grandma[20];
		
	}
	public void doIni(){
		G1 = G1Factory.Create(20, 100, 50);
		
	}
	public void doLogic(long delta){
		getMap().doLogic(delta);
		for(int i = 0;i<G1.length;i++){
			G1[i].doLogic(delta);
			}
		
	}
	public void drawLvl(Graphics g){
		if(isStarted()){
			g.draw3DRect(0, 0, 800, 600,false);
			getMap().drawVisibleMap(g);
			for(int i = 0;i<G1.length;i++){
				G1[i].drawObjects(g);
			}
		}
	}
	
	
	void setStarted(boolean isStarted) {
		this.isStarted = isStarted;
	}
	boolean isStarted() {
		return isStarted;
	}
	void setMap(MapDisplay map) {
		this.map = map;
	}
	public MapDisplay getMap() {
		return map;
	}
```
in der doIni() methode(zeile 29) soll also nun durch die Factory alle gegner in ein Array geladen werden..Compilieren tut er, schmeißt aber eine Null pointer exeption z.b an der stelle G1_.dologic(delta)(zeile 35). Darum vermute ich, dass die Factory Klasse dem Array keine Objekte übergibt, versteh nur nich warum da ich das auch schon so in anderen Projekten(weniger komplexen) verwendet habe..
Hier noch die Faktory Klasse:


		Java:In die Zwischenablage kopieren


package Enemy;
import main.ScrollGame;

public class FactoryGrandma {
	protected ScrollGame parent;
	public FactoryGrandma(ScrollGame p){
	this.parent= p;
	}
	
 public Grandma[] Create(int anzahl,int x, int firstPos)
	{
		Grandma[] Grandmas = new Grandma[anzahl];
	 
	   for (int i=0 ; i<Grandmas.length ; i++)
	      {
		   Grandmas[i]= new Grandma(parent.getLib().getSprite("pics/Grandma.gif",6,1),200,200,200,parent,x,firstPos);
		   firstPos += 50;
	      }

	   return Grandmas;
	}

_


----------



## radiac (15. Dez 2009)

Hi oyo,


was ist denn

```
G1 = G1Factory.Create(20, 100, 50);
```


----------



## oyo (15. Dez 2009)

hallo
also hehe die create methode liefert ja ein array mit Grandma Objekten zurück und G1 ist eben ein Grandma array ?


----------



## Steev (16. Dez 2009)

Hi,

diese Zeile hier:
[Java]G1 = new Grandma[20];[/Java]
kannst du dir auch sparen, da du nur einen unnötigen Array erzeugst der dann mit
[Java]G1 = G1Factory.Create(20, 100, 50);[/Java]
wieder verworfen wird.

Da die Logik usw. bereits läuft, bevor G1 initialisiert wurde bekommst du ein NPE.

Du solltest die Objekte auf null prüfen:
[Java]
for(int i = 0;i<G1.length;i++)
  if (G1_ != null)
    G1.doLogic(delta);
[/Java]

Gruß
Steev_


----------

