# Counter Stickman-Shooter



## Nicamya (25. Apr 2012)

Hallo zusammen,
ein Freund und ich haben ein kleines Projekt gestartet indem wir uns an der Programmierung eines Stickman-Shooters versuchen.
Im Moment sind wir daran einen Counter der unsere für den Abschuss eines Gegners bekommende Punkte zählen soll. Haben uns dazu ein kleines Youtube-Tutorial angeguckt ( Link dazu: The Joy of Code #16: Adding a score counter - YouTube )das wir jedoch nicht ganz genau wie dort gezeigt übernehmen können, da unser Spieler den Gegner mit einer Patrone die auf ihn zufliegt tötet und nicht einfach durch die Berührung des Gegners.

Wir entschuldigen uns im voraus für die Fülle an Quelltext sowie die höchstwarscheinlich unprofessionelle Darstellung des Problems. Und bedanken uns bei denen die sich trotzdem die Mühe machen dies zu lesen und uns evtl. zu helfen.

Unser Übertragungsansatz sieht wie folgt aus: 
Der Counter [JAVA=42] import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Color;

/**
 * A simple counter with graphical representation as an actor on screen.
 * 
 * @author mik
 * @version 1.0
 */
public class Counter extends Actor
{
    private static final Color transparent = new Color(0,0,0,0);
    private GreenfootImage background;
    private int value;
    private int target;

    /**
     * Create a new counter, initialised to 0.
     */
    public Counter()
    {
        background = getImage();  // get image from class
        value = 0;
        target = 0;
        updateImage();
    }

    /**
     * Animate the display to count up (or down) to the current target value.
     */
    public void act() 
    {
        if (value < target) {
            value++;
            updateImage();
        }
        else if (value > target) {
            value--;
            updateImage();
        }
    }

    /**
     * Add a new score to the current counter value.
     */
    public void add(int score)
    {
        target += score;
    }

    /**
     * Return the current counter value.
     */
    public int getValue()
    {
        return value;
    }

    /**
     * Set a new counter value.
     */
    public void setValue(int newValue)
    {
        target = newValue;
        value = newValue;
        updateImage();
    }

    /**
     * Update the image on screen to show the current value.
     */
    private void updateImage()
    {
        GreenfootImage image = new GreenfootImage(background);
        GreenfootImage text = new GreenfootImage("" + value, 22, Color.BLACK, transparent);
        image.drawImage(text, (image.getWidth()-text.getWidth())/2, 
                        (image.getHeight()-text.getHeight())/2);
        setImage(image);
    }
}
[/Java]  


diesen konnten wir komplett übernehmen.
Damit wir Punkte für das töten eines Gegners mit einer Patrone bekommen müssen wir die Patrone und den Counter in Verbindung setzen. Was wir wie folgt getan haben:
Editor unserer Welt:
[JAVA=42] import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Stickman here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Stickman  extends World
{

    /**
     * Constructor for objects of class Stickman.
     * 
     */
    public Stickman(){        
        super(720, 450, 1);        

        prepare();
    }
    public void prepare(){
        Counter counter = new Counter(); 
        addObject(counter, 360, 50);
        EigenerSpieler eigenerspieler = new EigenerSpieler();
        addObject(eigenerspieler, 50, 415);
        Patrone patrone = new Patrone (counter);
        addObject(patrone, 55, 420);
    }    
}
[/code]
 Die Klasse Patrone sieht so aus :
[JAVA=42]import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Patrone here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Patrone  extends Actor
{   
    private Counter counter;
    public Patrone(Counter pointCounter)
    {
        counter = pointCounter;
    }    
    public void act() 
    {
        if(getX() + 5 > getWorld().getWidth())
        {
         getWorld().removeObject(this);
        }
        else
        {
        setLocation(getX() + 4, getY());
        if(getOneIntersectingObject(KleinerGegner.class) != null)
        getWorld().removeObject(getOneIntersectingObject(KleinerGegner.class));
        counter.add(10);
        }
    }

}
[/code]

Mit dem Code:
[JAVA=42]public void schiessen(){
        if(Greenfoot.isKeyDown("space")){
            getWorld().addObject(new Patrone(), getX()+50, getY()+25);
            GreenfootImage blub = new GreenfootImage("H:/Eigene Dateien/Informatik/Java-Spiel/EigenerGamer1Schuss.png");
            setImage(blub);
        }
    }   
[/code]
kann man eine Patrone abfeuern. 

Leider kommt beim Compilen folgender Fehler:
constructor Patrone in class Patrone cannot be applied to given types;
required Counter found: no arguments reason: actual and formal argument lists differ in length

Leider konnten wir uns selber aufgrund unserer erst kürzlich gestarteten Greenfot-Karriere keinen Reim auf das Problem machen noch konnten wir in google oder youtube eine Lösung für unser Problem finden :/
Danke für jede Hilfe


----------



## ARadauer (25. Apr 2012)

ihr könnt nicht new Patrone() schreiben wenn es in Patrone nur den Konstruktor public Patrone(Counter pointCounter)
gibt..

entweder beim erzeugen den Counter mitgeben oder einn Konstruktor ohne parameter machen...


----------



## Nicamya (25. Apr 2012)

Als erstes danke für deine mühe dir alles durchzulesen.
du meinst also anstatt new Patrone() in der klasse eigener spieler zu schreiben new Patrone (counter) zu schreiben ???


----------



## ARadauer (25. Apr 2012)

ja, das Problem ist dann wahrscheinlich, dass eigener Spieler keinen Counter hat...  aber da könnt ihr da dann auch einen Konstruktor machen wo ihr das mitgebt 
und dann im prepare den counter mitgeben... wobei ichs mir jetzt nicht im detail angesehen hab ob das sinn macht..

jedenfalls wenn ihr in patrone ein counter.add(10); aufruft braucht ihr wahrscheinlich auch den counter und müsst ihn mitgeben wenn ihr in schießen eine Patrone erzeugt


----------



## Nicamya (25. Apr 2012)

Ich habe jetzt einen weiteren Konstruktor Patrone ohne parameter erstellt.
Jedoch wird nun keine Patrone mehr über Leertaste ins Spiel gesetzt. ;/


----------



## Nicamya (25. Apr 2012)

Wenn ich den Counter bei schießen der patrone mitgebe : new patrone (counter) meint dat blöde teil cannot find symbol- variable counter -.-


----------



## ARadauer (25. Apr 2012)

> meint dat blöde teil


einen Minute nachdenken würde helfen....


----------



## Nicamya (25. Apr 2012)

Sry aber wir checkens nicht, wie gesagt wir haben erst vor wenigen Tagen angefangen damit zu arbeiten und haben kaum ahnung davon .


----------



## bob_sheknowdas (26. Apr 2012)

was ARadauer euch mitzuteilen versucht:

Der Konstruktor ist (wie der name andeutet) für das Konstruieren eines Objektes einer Klasse zuständig.
Euer Konstruktor für eine Patrone verlangt einen Übergabeparameter, nähmlich einen Counter:

```
public Patrone(Counter pointCounter)
```

Wenn ihr jetzt irgendwo new Patrone() aufruft (also eine neue Patrone erzeugen wollt), dann wird der Konstruktor aktiv. Ihr habt aber nicht wie gefordert einen Counter mitgeliefert, weswegen euer selbst geschriebener Konstruktor nicht aktiviert wird. Stattdessen kommt der Defaultkonstruktor zum einsatz, der keine Übergabeparamter erwartet, in eurem Fall aber leider auch nicht viel macht.

Die Lösung ist also beim erzeugen einer neuen Patrone immer einen Counter mitzuliefern, z.B. so:

```
new Patrone(new Counter())
```


----------



## Nicamya (26. Apr 2012)

Danke für deine Hilfe.
Leider funktioniert es nicht :/


----------



## bob_sheknowdas (26. Apr 2012)

hast du new Patrone(new Counter()) geschrieben?

Dann liegt das mit hoher Wahrscheinlichkeit daran, dass du hier einen neuen Counter erzeugst, wo doch ein bereits erzeugter benutzt werden sollte...

In welcher Klasse steht die schießen()-Methode? Im Stickman?

Dann füg mal Zeile 52 folgendes ein

```
private Counter counter;
```

Zeile 63 änderst du auf 

```
counter = new Counter();
```

und deine schießen()-Methode sollte dann so aussehen

```
public void schiessen(){
        if(Greenfoot.isKeyDown("space")){
            getWorld().addObject(new Patrone(counter), getX()+50, getY()+25);
            GreenfootImage blub = new GreenfootImage("H:/Eigene Dateien/Informatik/Java-Spiel/EigenerGamer1Schuss.png");
            setImage(blub);
        }
    }
```


----------



## Gast2 (26. Apr 2012)

Nicamya hat gesagt.:


> Leider funktioniert es nicht :/



Ist keine Fehlerbeschreibung... 

Poste deinen aktuellen Code und sag was konkret nicht geht. Fehlermeldung ect. Grundsätzlich geht das nämlich schon so.


----------



## ARadauer (26. Apr 2012)

Nicamya hat gesagt.:


> Leider funktioniert es nicht :/


funktioniert nicht ist keine Fehlerbeschreibung.. ich denke ihr verwendet irgendow eine Variable die ihr nicht definiert habt... post mal den ganzen Code


----------



## Gast2 (26. Apr 2012)

:autsch: Ein Echo?!


----------

