Counter Stickman-Shooter

Nicamya

Mitglied
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

Top Contributor
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

Mitglied
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

Top Contributor
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

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

Nicamya

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

bob_sheknowdas

Aktives Mitglied
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:
Java:
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:
Java:
new Patrone(new Counter())
 

bob_sheknowdas

Aktives Mitglied
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
Java:
private Counter counter;

Zeile 63 änderst du auf
Java:
counter = new Counter();

und deine schießen()-Methode sollte dann so aussehen
Java:
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);
        }
    }
 

Ähnliche Java Themen


Oben