[Java/BlueJ] Pfeiltastensteuerung -need help!

11/16/2014 11:27 Tim0n_#1
Hallo liebe com,

Und zwar habe ich ein kleines problem, ich hab von meinem Lehrer in der schule eine extra Aufgabe bekommen wobei es um das steuern eines objektes (in dem fall einen Wurm/Raupe) per tasteneingabe..
Er selbst weiss nicht ob es möglich ist aber ich denke schon ;)

Zum verständnis: Wir haben von ihm ein sogesehen vorgefertigten code bekommen mit Klassen für Rechtecke, Kreise, Quadrate und Dreiecke insklusive einer ausgabemöglichkeit in Form einer Leinwand.
Unsere aufgabe war es bisher einen Baum zu "zeichen/programmieren"
sprich stamm, krone, äpfel, Vogelhaus und einen Wurm.

mein Ergebnis sieht folgendermaßen aus:

so wie gesagt habe ich nun Die Aufgabe bekommen diesen kleinen aüßerst hübschen wurm :p mit pfeiltasten (vorerst nur nach rechts und links) zu bewegen.

ich hab mir dazu mehrere codes im Internet angesehen (stichwort Keylistener) aber irgendwie nur bahnhof verstanden :D
Außerdem müsste ich den wurm irgendwie gruppieren, da er mittlerweile noch aus 5 verschiedenen Objekten besteht und das denke ich zuviel schreibarbeit ist das alles einzelnd zu verschieben lassen..

meine Idee war folgende: Ich wollte die 5 Objekte zu einem Instanzieren und diese instanz dann per keylistener zu verschieben und dabei brüchte ich ein wenig hilfe weil ich nicht so ganz weiss wie ich das angehen soll .. :(

Ich hoffe das mir jemand helfen kann :) Mfg Timon

Ps: hier ist mein jetziger code den ich mir zusammengeastelt habe aber ich hab den mittlerweile wieder rausgenommen weil der 0 funktioniert hat..

Code:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Steuerung extends JApplet implements KeyListener
{   
    private Raupe r1;
    public void init()
    {
        addKeyListener(this);
        r1 = new Raupe();
    }
    public void keyTyped(KeyEvent event) 
    {
    }
    public void keyPressed(KeyEvent event) 
    {
        if (event.getKeyCode() == KeyEvent.VK_LEFT) r1.horizontalBewegen();
        if (event.getKeyCode() == KeyEvent.VK_RIGHT) r1.horizontalBewegen();
       
        repaint();
    }
    public void keyReleased(KeyEvent event) 
    {
    }
    
}
wie schon zusehen ich würde ich gerne die einzelnden Objekte zu einer Klasse Raupe mit der variable r1 zusammenfügen aber da scheint mein konstructor oder wie das teil heisst nicht funktioniert zu haben (hab den code leider nicht mehr)

rechtschreibfehler behaltet bitte für euch, hatte diese nacht keinen schlaf ich darf das ;)
11/16/2014 12:43 Mostey#2
Die Raupe ist wirklich sehr hübsch. =D

Zur Gruppierung: Bau dir doch ne Klasse die das Skelett (also die Grundform) abbildet. Diese Klasse könnte entweder ne Liste oder Collection (weiß nicht wie das bei Java heißt, ich habe noch nie so wirklich in Java programmiert) haben in der alle Objekte enthalten sind, die gezeichnet werden müssen. Das setzt natürlich eine Schnittstelle (oder zumindest eine Klasse) voraus, die generisch gestaltet ist.

Ich denke nicht, das diese Voraussetzung erfüllt wird. Deshalb würde notfalls auch eine Klasse ausreichen, die alle Objekte enthält die zu zeichnen sind. Dort definierst du einfach mal ne Methode Move(Point destination) und lässt die Objekte verschieben. Somit trennst du den Part auch von der Interaktion, denn wenn du irgendwann mal die Raupe mit deinen Maustasten bewegen willst, würdest du hier entweder redundanten Code haben oder du müsstest alles in den neuen Eventhandler schieben.

C# Code der demonstriert was ich meine:

Code:
    public interface IMoveableShapeGroup
    {
        void Move(Point point);
    }

    public class Shape
    {
        public Point Position { get; set; }
        public string Description { get; set; }

        public Shape(string description, Point position)
        {
            Position = position;
            Description = description;
        }
    }

    public class Raupe : IMoveableShapeGroup
    {
        public List<Shape> ShapeComponents { get; set; }

        public Raupe(List<Shape> shapeComponents)
        {
            ShapeComponents = shapeComponents;
        }

        public void Move(Point point)
        {
            foreach (var shapeComponent in ShapeComponents)
                shapeComponent.Position = point;
        }
    }
PS: Dein Lehrer ist eine Banane, wenn er sich nicht sicher ist ob das umzusetzen ist.
11/16/2014 13:28 Tim0n_#3
Erstmal vielen dank für die Umfangreiche Antwort :)

Also klar, das war auch mein gedankengang aber irgendwie scheitert es dabei weil ich nicht genau weiss wie ich die objekte gruppieren kann :s

Ich kann die Gegenstände per code verscheiben lassen das bekome ich hin, jedoch weiss ich nicht wie ich die überleitung zu den pfeiltasten bekomme bzw wie ich diese dummen objekte in kleine arrays stecken kann ;D

also das mit den listen habe ich kapiert, aber im internet finde ich nur Beispiele für String listen aber ich will ja sogesehen keine random daten zusammenfügen sondern meine schon existierenden objekte :(

(tut mir leid ich bin wie gesagt noch in den anfängen.. )

ja er ist ne banane aber ne coole banane, er schaffts problemlos schüler in seinen bann zu ziehen da fällt die fachkompetenz kaum auf und man bekommt immer super nioten ;)
11/16/2014 13:38 Mostey#4
Quote:
Originally Posted by Tim0n_ View Post
also das mit den listen habe ich kapiert, aber im internet finde ich nur Beispiele für String listen aber ich will ja sogesehen keine random daten zusammenfügen sondern meine schon existierenden objekte :(

(tut mir leid ich bin wie gesagt noch in den anfängen.. )
[Only registered and activated users can see links. Click Here To Register...]

Der von dir gelieferte Code ist nicht ausreichend um dir diesbezüglich zu helfen, da musst du konkreter werden.

Zu der Pfeiltastengeschichte: [Only registered and activated users can see links. Click Here To Register...]
11/16/2014 13:54 Tim0n_#5
das hier ist mein bisheriger code überhaupt nichts besonderes ganz im gegenteil:


wobei meine gruppierung sich nur auf "RKopf", "RKoerper", "RRAuge", "RLAuge" und "RMund" beziehen (das sind die einzelteile der Raupe)

zum verständnis wie ich zu diesen ganzen variablen und so komme packe ich hier nochmal den code der kreis klasse rein, der rest ist ähnlich aufgebaut wennn überhaupt nur mit leichten Abweichungen:


wie ihr schon sehen könnt ein ziemlich einfacher selbsterklärender code :P
und vielleicht gerade weil so simpel ist denke ich vielleicht einfach nur zu kompliziert ..
11/16/2014 19:49 Mostey#6
Fasse doch einfach mal die Raupe zusammen wie ich dir zuvor schon gedeutet habe. Du hast dann ein Objekt der Klasse Raupe die alle Körperteile enthält und kannst damit dann interagieren. Du definierst dort die Move Methode und verschiebst jedes Körperteil einfach um X Stellen nach rechts (oder links, je nach Pfeiltaste) indem du die X Koordinate änderst. Versuch's einfach mal und liefere Ansätze, dann bessert das hier bestimmt nochmal jemand aus wenn es nicht ganz so funktioniert aber du solltest wirklich mal selbst versuchen hier weiterzukommen.

Ich weiß das du dafür nichts kannst aber das Design ist miserabel und dein Lehrer sollte wirklich mal bedenken, ob er sich nicht besser mal weiterbildet bevor er weiter lehrt. Vor allem lässt das eine Kommentar darauf schließen, dass er den Code schon seit mehr als 8 Jahren verwendet und das ist echt traurig.
11/16/2014 22:35 Tim0n_#7
sooooooooooo ich hab mir mal was zusammengeschustert :)


und siehe da ich habe einen kleinen grünen kasten den ich nun am unteren "bildschirmrand" vom applet entlangwandern lassen kann mithilfe der Pfeiltasten LINKS und RECHTS ! :D

jedoch verstehe ich nicht so ganz warum das system in der form funktioniert und nicht mit meinen anderen gezeichneten objekten :/
hier der alte code, überarbeitet mit dem funktionierenden code von oben:


dazu zu sagen das er mir keine errors auspuckt, compilen tut er alles problemlos, es passiert nur nix wenn ich das so im appletviewer öffne :/

PS: Edit: Ich habe den wurm nun komplett nach dem anderen muster "programmiert" und er bewegt sich ohne probleme und das auch ausgesprochen simpel, wenn jedoch jemand noch eine idee hat wie ich das applet nun auf mein baum layout bekomme wäre ich ihm sehr verbunden wenn er mir noch einen Lösungsansatz geben würde, ansonsten Danke ich dir Mostey!
11/17/2014 17:53 Mostey#8
Wieso nennst du eine Klasse Steuerung und implementierst aber in der Klasse Baum genauso die Steuerungsfunktion? Das macht keinen Sinn und ist zu trennen.

Außerdem verstehe ich nicht wo genau das Problem ist. Du bewegst in dem Code nur RKopf (was vermutlich den Kopf der Raupe repräsentiert), kein Wunder das der Baum sich dann nicht bewegt ;O