Wie würdet ihr eure drawings verwalten

Jaiel

Jaiel

Dauergast
235
Hey bräucht ein bisschen Input von euch zu folgendem Thema:

Hab ein canvas auf den ich objekte male

Sollte ich eine generelle klasse/methode haben die die objekte auf den canvas zeichnet oder sollte ich jedem objekt den canvas übergeben und die sollen sich selber anhand derer koordinaten zeichen. Ich seh da den Vorteil dass die Objekte unterschiedliche formen haben können von Images bis ganz normale java shapes(circle rect etc.) und nur sie darüber bescheid wissen müssen wie sie aussehen

Was ist der bessere Weg eurer Meinung nach?

Sonstige Vorschläge wie man sowas anders handhaben könnte?
 
Zuletzt bearbeitet:
In jedem Objekt implementierst du eine Methode, die das Objekt zeichnet. Der übergibst du ein Canvas-Objekt.
Vorteil 1: Deine Objekte sind unabhängig vom verwendetem Canvas
Vorteil 2: Kommen neue Objekte hinzu, musst du keine Änderungen an irgendeiner zentralen Klasse/Methode machen.
Vorteil 3: Saubereres Objekt-Design, dadurch bessere Lesbar- und Wartbarkeit.

Idealerweise hast du eine abstrakte Klasse von der deine zu zeichnenden Objekte erben oder ein Interface, welches von ihnen implementiert wird, was sie zwingt, genau diese "ZeichneDich"-Methode zu implementieren.
 
Also meinst du auch das jedes objekt sich sleber malen sollte und ich nur den canvas zu übergeben hab mmmmmmh ist auch meine idee soweit vllt hat jemand einen anderen weg es anzugehen!
 
Hallo,
Thyrion hat das Wichtigste wohl bereits beschrieben.. Die Trennung der Objekte vom Canvas auf jeden Fall sehr sinnvoll (ich würde fast sagen unabdingbar).

Da dir dem Anschein nach noch die genaue Idee fehlt, hier ein weiterer Versuch:
Du solltest deine "Shapes" zusammenzufassen.
Sprich: die erste Ebene heißt bspw. GrafischesObjekt und besitzt Member für Koorinaten, Farbe, Drehung (nur das was alle grafischen Objekte wirklich gemeinsam haben).
In der zweiten Abstraktionsebene gehst du auf speziellere Eigenschaften ein zB die Eigenschaften, die ein Quadrat, Rechteck, Dreieck spezifizieren.
Deine View-Klasse könnte nun Listen beherbergen, in denen du die Objekte ablegst und lädst bzw. darstellst (hier erfolgt dann der Aufruf der draw-Methode des Objekts - siehe Thyrions Beitrag)
 
Ne ihr versteht mein Beitrag wohl falsch man kann es ja so oder so machen.(Ich wollte nur wissen welche variante ihr nehmt da ich bisher immer die erste variante genommen habe wo eine klasse den supervisor spielt und die objekte malt:der gedanke dahinter bei mir bis jetzt war wenn ich schon kollisionsabfragen durch eine klasse mache dann kann ich doch dort auch die drawings verwalten...ich mach games btw )

Ich will ein kleines game jetzt nciht zu einem vollkommen durchdachten architektonischen software wunderding machen :)

Mir kam nur so die Idee vor paar tagen welche variante wohl andere programmierer bevorzugen oder ob es vllt eine 3. oder 4. möglichkeit gibt sowas besser anzugehen die mein Horizont erweitern würde
 
Viele Wege führen ans Ziel! Es ist auch immer eine Frage des Aufwands/Nutzen!

Das heißt dann, deine "Supervisor"-Klasse muss alle möglichen Objekte kennen und du führst in einem großen Switch-Block je nach Klasse entsprechende Logik aus? Nicht schön, aber funktioniert.

Was das architektonische Wunderding angeht: Klar, manchmal kommen "quick 'n' dirty"-Lösungen zum Einsatz. Vielleicht mag dir der Aufwand bei einem kleinem Game nicht gerechtfertigt, aber es gibt eigentlich gute Gründe, die dennoch dafür sprechen:
- Es übt (falls ein anderes Projekt dann doch mal größer wird)!
- Wenn du dir in einem halben oder einem Jahr den Code nochmal anschaust, wirst du es uns danken :smile:
- Es ist "sauberer". Sämtliche Logik, die die jeweilige Klasse betrifft, gehört einfach zu der Klasse selber.
- Spätestens, wenn mehrere Entwickler an einem Projekt arbeiten, willst du saubere Trennungen der einzelnen Klassen voneinander.
 
ist schon rivchtig was du sagst

im moment ist es imemr so dass ich immer eine ifanweisung benutze --->(if object.boolean) und diese boolean nenne ich meistens active oder so diese ist auch ausgangspunkt ob das objekt seine positionen berechnen soll mit allen geschwindigkeiten oder kräften die auf ihn wirken.

Da ich ja eh diesesn boolean prüfen muss ob ausserhalb oder innerhalb des objektes ist ja egal nur richitg ist das es übersichtlicher wird wenn ich die if anweisungen in die jeweiligen klassen verschiebe.

und ohne eine supervisor klasse ich nenn sie mal jetzt "welt" die vona llen objekten bescheid weiß geht nun mal leider kein Spiel ...

fanke vielmals für den Input
 
Die Klasse "Welt" muss aber nicht die einzelnen Implementierungen deiner Spielobjekte kennen, sondern lediglich die Basisklasse(n) oder Interfaces, die alle für sie notwendigen Eigenschaften definieren.
 
kannst du ein beispiel nennen wie du das machen würdest....

sagen wir mal hab eine ball klasse und eine square klasse

jeweils zwei ball objekte und zwei square objekte(Ball ball1,ball2 und Square sqare1,square2)

wie würdest du jetzt auf deren position zugreifen ohne die objekte zu kennen?
statische methoden oder was?

Der ursprüngliche Beitrag von 21:31 Uhr wurde um 21:33 Uhr ergänzt:

und zwar in eienr world klasse die nur die jeweilige klasse importiert ohne sie zu instanizieren!
 
1) Ich habe eine Klasse für die Koordinaten als jeweils X und Y-Koordinate enthält (Java bietet die schon, je nachdem, wie deine Welt aussieht nutzt du dafür dann Point oder PointF). Als Beispiel nehme ich hier PointF.

2) Ich habe eine abstrakte Klasse WorldObject, die u.a. eine Eigenschaft "center" vom Typ Point/PointF enthält, sowie eine abstrakte Methode "getPosition()", die Point/PointF zurückgibt.

Code:
    public abstract class WorldObject
    {
        protected PointF center;

        public virtual abstract PointF getPosition();

        public virtual abstract void paint();
    }

3) Die Klassen Ball und Square erben von WorldObject - und müssen daher die Methode "getPosition()" mit Leben füllen.

Code:
    public class Ball extends WorldObject
    {
        public int Radius { get; set; }

        public Ball()
        {
            center = new PointF(0,0);
        }

        public override PointF getPosition()
        {
            return center;
        }

        public override void paint(Canvas canvas)
        {
            // den Ball darstellen
        }
    }

    public class Square extends WorldObject
    {
        public int sizeX { get; set; }
        public int sizeY { get; set; }

        public override PointF getPosition()
        {
            // je nachdem, wie du das Square aufbaust, wird center berechnet - da sei hier nun einfach mal gemacht
            return center;
        }

        public override void paint()
        {
            throw new NotImplementedException();
        }
    }

4) Deine Klasse Welt hat vermutlich eine Liste mit allen vorhandenen Objekten. Dies ist typischerweise eine generische Liste mit WorldObject als Typ. Will ich nun die einzelnen Positionen aller bekannten Objekte haben, gehe ich die Liste durch und rufe getPosition() auf.

Code:
// ...
    private List<WorldObject> listWorldObjects = new List<WorldObject>();

    public void displayPositions()
    {
        for (int i = 0; i < listWorldObjects.size(); i++)
        {
            PointF position = listWorldObjects[i].getPosition();
            // mach was mit position.X und position.Y
        }
    }

    public bool addWorldObject(WorldObject worldObject)
    {
        return list.WorldObjects.add(worldObject);  // evtl. vorher mit contains() prüfen, ob das Objekt schon in der Liste ist
    }

    public bool removeWorldObject(WorldObject worldObject)
    {
        return list.remove(worldObject); // vielleicht vorher mit contains() prüfen, ob das Objekt überhaupt in der Liste ist
    }

    public List<WorldObject> getListWorldObjects()
    {
        return listWorldObjects;
    }
Bitte so nicht 100% übernehmen. Sollte sich die Liste während der Abarbeitung ändern (weil Objekte dazukommen oder entfernt werden), wäre das fatal :smile:


Um die Liste zu füllen, muss der füllende Code natürlich die Objekte Ball und Square kennen. Das muss aber nicht unbedingt die Klasse World sein. Diese muss dann nur eine Methode anbieten, die Liste zu bearbeiten (Objekte hinzufügen, löschen, in der Positition verschieben etc.)



So oder ähnlich :smile:
 
Zuletzt bearbeitet:
Danke für die ausführliche Erklärung

An Lsiten ahb ich bisher nciht gedacht hatte immer nur einfache Arrays benutzt wegen der einfachen Iteration.
Kann man in Java mittels ":" von anderen Klassen erben so wie in c++ oder hast du das nur als vereinfachung hingeschrieben? Weil es mir zum ersten mal vorkommt und ich es begrüßen würde da ich das von c++ her so kenne und auch mehr an diese art und weise gewöhnt bin

Klar guter Lösungsansatz auf jeden Fall
 
Mein Fehler :smile: - da ging die berufliche C#-Gewohnheit mit mir durch.
 

Ähnliche Themen

M
Antworten
3
Aufrufe
169
moin
M
C
  • CoderboyPB
Antworten
3
Aufrufe
928
swa00
swa00
OnkelLon
Antworten
13
Aufrufe
1.986
OnkelLon
OnkelLon
Zurück
Oben Unten