TankGame -erledigt-

  • Java
  • TankGame -erledigt-

    Hallo,

    wir sollen, quasi als Weihnachtsgeschenk den Klassiker TankGame erstellen. Panzer und Hintergrund hab ich schon erstelt und auch in die main-Methode eingefügt, so dass beides in meine Spielfenster zu sehen ist.
    Probleme bereiten mit die Kannone, die ja mit den Pfeiltasten bewegt werde soll und die richtige Position des Panzers.

    Die dropDown-Methode soll den Panzer auf den Boden setzen, da dieser, wenn z.b. ein Geschoss unter ihm explosiert herunterfallen soll.

    Dazu müsste man überprüfen ob sich in der Pixelreihe unterhalb des Panzer der Hintergrund Sky oder eben Boden befindet.
    Ich habe da eine eine for-Schleife gedacht. Aber mit dieser wird ja dann die komplette Zeile überprüft und nicht nur die Pixel unterhalb des Panzers. Evtl könnten man auch mit einer if-Anweisung arbeiten. Also z.b. wenn die Pixel unterhalb des Panzers weiß sind dann soll dieser eine Pixelreihe weiter runter fallen. Dann wird neu überprüft. Solange bis er eben wieder Boden unter den Füßen hat. Ich weiß aber bei besten Willen nicht, wie man einzelner Pixel in einer Reihe überprüft. Habt ihr da ne Idee?
    mfg veloce

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von veloce ()

  • Achso meinst du ich sollte einfach die Pixel unterhalb des Panzers im Array überprüfen lassen?

    Vielleicht geht das. Aber wie überprüft man ein zweidimensinales Array mit einer if-Anweisung gekoppelt an einer bestimmten Position?
    mfg veloce

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von veloce ()

  • Wenn die Spielfeldkoordinaten so verlaufen:

    [0][0];[1,0]
    [0][1];[1,1]

    Und TankXL die Koordinate ganz links des Panzers ist, TankXR entsprechend rechts, TankY den untereren Rand bezeichnet:


    Quellcode

    1. for(int x = TankXL; x <= TankXR; x++)
    2. if(Spielfeld[x][TankY].farbe != 'weiss') {
    3. doSomeThing(); break; //panzer fällt nicht mehr
    4. }



    Wenn du damit nicht weiterkommen solltest poste doch mal die relevanten Codeausschnitte ;)
  • Hi,

    vielen Dank, ich werd mich mal versuchen

    nile schrieb:



    Wenn du damit nicht weiterkommen solltest poste doch mal die relevanten Codeausschnitte ;)


    Lieber nicht, sonst verlernst du womöglich noch was ;-).
    Sprachen lernen war noch nie meine Stärke. Aber wenn ich gar nicht weiter komme, werd ich mir wohl die Blöße geben müssen...

    Wie zu erwarten ist alles rot markiert.

    Der Übersicht halber versuche ich mal den Zusammenhang der Klassen miteinander zu beschreiben.

    Es gibt die Klassen TankGame, Tank, Sprite, Background, Bullet, Generator und DestroyBackground. Die beiden letzten Klassen sind vorgegeben.


    Der Himmel wird in der Klasse Background festgelegt. Das Spielfeld jedoch in einer gegeben Klasse Generator in der Methode generateBackground.

    Quellcode

    1. public static final int WIDTH = 1270; // Konstanten 2.2 Größe des Spielfeldes
    2. public static final int HEIGHT = 960; // Konstanten 2.2
    3. public static final Color SKY = (Color.WHITE); // Konstanten 2.2
    4. private Color[][] color = new Color [HEIGHT] [WIDTH]; // 2.3 array für Farbfeld
    5. public Color [][] getColorArray(){ // getter Methode, damit array von außen zugänglich
    6. return color;



    Der Panzer wurde in der mainMethode auf x,y gesetzt. Das sieht so aus:

    Quellcode

    1. public static void main (String [] args){
    2. TankGame tg = new TankGame(); // Instanz der Klasse TankGame
    3. [COLOR='Red']Tank t = new Tank(100, 300, tg); //Panzer wird auf Stelle x, y gesetzt[/COLOR]
    4. tg.setTank(t);
    5. tg.setGameAreaHeight(700);
    6. tg.setGameAreaWidth(1200);
    7. tg.start(); // vererbte Methode start aufrufen --> schwarzes Fenster öffnet sich


    Die Klasse Tank aber erbt wiederum alle Werte von der Klasse Sprite. Die Initialisierung sieht dann so aus:

    Quellcode

    1. public abstract class Sprite {
    2. private int x;
    3. private int y;
    4. private int width;
    5. private int height;
    6. public Sprite(int x, int y, int width, int height){ // 3.3 Konstruktor der alle Parameter übergeben bekommt und initialisiert
    7. this.x = x;
    8. this.y = y;
    9. this.width = width;
    10. this.height = height;
    Alles anzeigen


    Die dropDown-Methode die den Panzer richtig positionieren soll, befindet sich in der Klasse Tank. Die Schleife hab ich wie folgt geschrieben:

    Quellcode

    1. public int dropDown(){
    2. TankGame tg = new TankGame();
    3. Background bg = new Background();
    4. for (int x = 110; x <= 150; x++ ){
    5. if (bg.[U][COLOR='Red']color[/COLOR][/U][super.getX()][super.getY()+11] == bg.SKY){
    6. Tank t = new Tank(super.getX(), super.getY()-1, tg);
    7. tg.setTank(t);
    8. break;


    super.getX() hab ich genommen, weil die Werte von der Klasse Sprite bereits initialisiert wurden (aber vmtl muss ich die x.werte aus der TankGame-Klasse nehmen) super.getY()+11, weil der Panzer 10 Reihen hoch ist und ich ja die elfte Reihe überprüfen will
    super.getY()-1, weil der Panzer um eine reihen nach unten soll.
    Eclipse markiert die unterstrichenen roten Teile, weil color ja private ist. Das steht aber wiederum so in der Angabe.
    Ich vermute aber, dass noch mehr falsch ist... :D den der Panzer bewegt sich keinen Milimeter auch wenn ich das color public setze
    mfg veloce

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword () aus folgendem Grund: Doppelpost =&gt; Regeln lesen!

  • Du arbeitest ja auch auf lokalen Variablen, das eigentlich TankGame wurde doch schon in der main() initialisiert. Auf dieser Instanz musst du arbeiten. Außerdem verwendest du in deiner Schleife die Laufvariable x nicht, sonder super.getX(), was ja vermutlich nur die (konstante) linke obere Ecke des Hintergrundes zurückgibt.

    Dann erstellt du einen neuen Tank....warum? Was genau macht setTank()?

    Was mir auch sinnig vorkommt ist dass der Tank als Initialisierungsparameter das Tankgame bekommst, das Tankgame aber eben auch den Tank via setTank() bekommt...welche Struktur steckt dahinter?

    Bzgl. der private Variable gibts zwei Möglichkeiten, entweder du fügst entsprechende Getter-Methoden hinzu oder setzt sie eben public.
  • Ich selber vesteh sowieso nicht, was ich da mache. Klingt komisch ist aber so. Ich murkse immer solang rum, bis möglichst wenig rot markiert ist. Dann geh ich damit in die Übung und frag wieso das Rotmarkierte rot markiert ist. Die Tutoren schlagen dann immer die Hände überm Kopf zusammen, sehen aber das ich mich hingesetzt habe und helfen mir so weit es geht.

    Soll ich also komplett auch den super-Koordinante arbeiten oder auf den lokalen?(ich nehme an lokal heißt in der Klasse angelegt)
    die super-Koordianten geben die linke obere Ecke an.

    Ich weiß nicht, was die setTank-Methode macht. Ich dachte sie setzt meine Panzer an eine neue Stelle im Spielfeld. Daher auch das -1 um eben diesen in y-Richtung eins weiter nach unten zu setzen.

    Den dritten Abschnitt verstehe ich überhaupt nicht.

    Aber ich weiß wie man getter-Methoden erstellt.

    Meine Unfähigkeit bezüglich Java wär eigentlich ganz lustig, wenns nicht so traurig wär.... :panik:


    EDIT:

    Quellcode

    1. public int dropDown(){
    2. //TankGame tg = new TankGame();
    3. Background bg = new Background();
    4. for (x = 110; x <= 150; x++ ){
    5. if (bg.color[(int) x][(int) (y+11)] == Background.SKY){
    6. break;

    So ist gar nichts rot, aber mein Panzer bewegt sich noch nicht, weil die Aktion in der Schleife fehlt. Wie setze ich denn den Panzer um eine Reihe nach unten?
    mfg veloce

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von veloce ()

  • Lokal bezieht sich immer auf den kleinstmöglichen Kontext, in diesem Fall also den in der Methode dropdrown(). Die Koordinaten die du brauchst sind die des "echten" Tanks mit dem gespielt wird - wenn du einfach in der Methode einen neuen erstellst und mit dessen Koordinaten arbeitest passiert halt nichts.

    Mein "dritter Abschnitt" bezog sich nur darauf, dass ich die Struktur in diesem Spiel auf Basis deiner Codeausschnitte nicht durchschaue - also wie die Objekthierarchie aussieht, welche Objekte von welchen kontrolliert werden.


    Ich weiß aber nicht ob ich (oder jemand anders hier) dir auf diese Weise effektiv helfen kann. Du scheinst jeden Fehler auf deine eigene "Unfähigkeit" zu schieben, was bei Programmieranfängern ein typisches Phänomen ist aber völlig am eigentlichen Problem vorbeigeht. Programmieren auf diesem Niveau verlangt keine außergewöhnliche Begabung/Intelligenz sondern lediglich etwas Zeit und Willen sich mit dem Stoff auseinanderzusetzen. Schau die bereits abgeschlossene Projekte aus deinem Kurs/deiner Vorlesung/whatever an und versuche ihre Funktionsweise/die dahinter stehenden Konzepte zu verstehen, modifiziere sie, schau ob sie das tun was du erwartest - wenn nicht, beginne mit Schritt 1) ;-).
    Aber nenne es bitte nicht Unfähigkeit - ich kann dir ohne dich genauer zu kennen versichern, dass es damit nichts zu tun hat.


    Wenn du konkrete Fragen hast oder nicht weiß wie man irgendwas spezielles realisieren kann sind Foren wie diese potenziell sehr nützlich, aber sie bieten nicht den Raum um bei solchen Projekten noch mal bei Adam und Eva anzufangen ;)


    Edit verpasst:
    Das kann ich dir so nicht beantworten, es hängt davon ab wie die Abläufe in dem Spiel sind. Vorstellbar wäre z.B. dass die TankGame Klasse dafür Methode bietet.
  • Hi Nile,
    erst mal danke, dass du dich überhaupt damit beschäftigt hast.

    Nein zu dumm bin ich vermutlich nicht. Zu faul denk ich auch nicht. Bzw muss ich mehr Zeit damit verbringen in Elektrotechnik die Prüfung zu bestehen, als in Info nen Schein zu bestehen.

    Das Tempo ist für jemanden der sich noch nie mit so etwas beschäftigt hat wahnsinnig hoch. Und man muss schon eine gewisse "Begabung" mitbringen, um die schlechte Vorlesung und die mittelmäßigen Übungen sofort umzusetzen.

    Aber um die Differenzen, die hauptsächlich aus dem ersten Teil der Übungen stammen (da hat ich einen derart schlechten Tutor... bei dem hab ich nur Bahnhof verstanden) aufzuarbeiten ist ein Forum nicht wirklich geeignet. Zeigt aber auch , dass die Aufgabe schon nicht mehr ganz so trivial sind.

    Vielleicht bin ich ja nach der nächsten Übung schon weiter und hab konkrete Fragen.

    Merci nochmal...
    mfg veloce

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von veloce ()