amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Suche [ - Suche - Neue Beiträge - Registrieren - Login - ]

Erste << 43 44 45 46 47 -48- 49 50 51 52 53 >> Letzte Ergebnisse der Suche: 1858 Treffer (30 pro Seite)
Reth   Nutzer

06.03.2006, 16:14 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Zitat:
Original von bubblebobble:
Das ist natürlich sehr oldschool!
Alpha ist aber nicht notwendigerweise für Transparenz Effekte da, sondern vor allem kann man Objekte mit Antialiasing auf den Hintergrund blitten, was ein sehr schönes Bweiches Bild ergibt, man hat also keine Treppchen mehr bei vordergrundobjekten, ähnlich wie Pixelfonts vs. Antialiased Fonts.
Aber auch schatten lassen sich damit gut machen, oder, wenn man die entsprechenden Blit routinen schreibt, auch Beleuchtung etc.
Allerdings brauchst du auf jedenfall 16 oder 24 bit screens.


Dann ist das erstmal nix für mich.

Zitat:
Du bist der sache schon näher, aber ignorierst ziemlich hartnäckig was ich versuche sei mehreren Posts zu vermitteln. Vielleicht drücke ich mich nicht klar genug aus, ist aber auch schwierig ohne Grafiken.

Hm, dachte, Du hast das so gemeint. Man bestimmt das neu zu zeichnende Tile inkl. des Cliprechtecks. Das muss man aber doch bei bewegten Objekten vor und nach der Bewegung machen, denn sie können ja vorher und nachher unterschiedliche Tiles bedecken bzw. während der Bewegung 2 Tiles bedecken. Wenn sich ein Objekt bewegt wird seine alte Position und Größe sowie seine neue Position und seine Größe zur Bestimmung der "beschädigten" Regionen hergenommen, oder nicht?

Zitat:
Ich habe mir jetzt aber die Ultimative Lösung ausgedacht, mit der Landschaften auch Hügel und beliebig hohe Objekte haben können, und man beim Refreshen trotzdem effizient bleibt.
Dazu muss ich aber ein paar Grafiken machen.
Grundsätzlich ist es aber so, wie ich weiter oben beschrieben habe, aber das auffinden der neu zu zeichnenden Objekte wird effizienter.


Da bin ich aber mal gespannt! Mit ist auch noch was eingefallen, wobei C++ bzw. die STL da sehr hilfreich ist, werde ich mal ausprobieren. Das setzt dann Deinen Algorithmus um, hilft aber hoffentlich stark bei der Auffindung "beschädigter" Tiles.

Sind die Bildchen zu Deinen Bsps. denn auch von Dir (das mit der Spielfigur, dem Baum usw.)?
 
Reth   Nutzer

06.03.2006, 10:48 Uhr

[ - Direktlink - ]
Thema: Knight Rider
Brett: Get a Life

Hi,

besser spät als nie von mir noch ein paar Serien, die mir auch sehr gut gefallen haben (hauptsächlich aus den 90ern):

- Al Bundy (unerreicht)
- Hör mal wer da hämmert (Home Improvement mit Tim Allen, einfach ein Superkomiker)
- Space 2063 (Ja! Action! Leider ham die einfach aufgehört)

Gab bestimmt noch mehr, die fallen mir aber spontan nicht ein!

Ciao
 
Reth   Nutzer

05.03.2006, 13:46 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

@bubblebobble:

Hm, Alpha-Channel wäre für mich auch mal interessant. Momentan erreiche ich "Transparenz", in dem ich z.B. bei den Turm-Cursors nur jedes 2. Pixel setze.

Wieso meinst Du eigentlich, dass C++ hier ein Kropf wäre (bin gern für Argumente offen)? Ich finde sogar, es bietet sich hier an, da man für alles seine Objekte mit ihrem Verhalten definieren kann.
Man muss nur die API des AmigaOS halbwegs gut unterbringen.
Das, was mir glaub derzeit selbst ein wenig im Weg steht ist meine alte Klassenaufteilung.
Habe eine Klasse, die alles im Umgang mit den 6-Ecken macht: Einsortieren, Auffinden, Ecken finden, NAchbarn finden etc. Das alles aber losgelöst von der Grafik, da mein erster Grafikansatz so aussah:
Eine Managerklasse kümmert sich um die Animationen, welche selbst entscheiden, wann sie neu gezeichnet werden müssen und davor den zuvor geretteten Hintergrund wiederherstellen. Entscheidend ist dabei immer die Größe des größten Frames der Animation gewesen.

Nun habe ich mir gedacht, dass ich die Grafiken an die Spielobjekte hänge. Dann gekommt jede Animation eine Liste, in der aufsteigend sortiert die Animationen referenziert werden, welche diese Animation überdecken. Das ist allerdings nur für Hintergrundanimationen interessant, alle anderen haben die Liste umsonst.
Wird nun irgendetwas über den Hintergrund geblittet, wird das entsprechende Tile gesucht und die zu zeichnende Animation an der Stelle ihres Z-Wertes (oder Y-Hotspots) in die Liste eingetragen. Das Tile wird in die Damagelist aufgenommen mit der Clipregion in der größe des sich ändernden Objektes. Nun werden alle Nachbarn des Tiles auf die gleiche Weise geprüft und entsprechend in die Damagelist übernommen. Damit hat sichs dann auch schon.
Methoden zum Auffinden von 6-Ecken zu X,Y-Koordinaten hab ich ja schon. Es bleibt nur ein "Problem" ich muss die Damagelist für alle sich änderenden Objekte mit den Koordinaten vor und nach ihrer Änderung bestimmen, damit an der alten Position alles wieder hergestellt wird.
Für jedes Tile in der Damagelist wird folgendes gemacht:
Das Tile selbst wird geblittet und danach alle Objekte in seiner Liste. Als Clipregion wird zur Vereinfachung das Rechteck genommen, welches alle Objekte in der Liste eines Tiles umfasst (so viele sind das nicht).
Das müsste funktionieren und entspricht dem, was Du und Wolfgang mir ja vorgeschlagen haben.

Ciao

[ Dieser Beitrag wurde von Reth am 05.03.2006 um 20:53 Uhr geändert. ]
 
Reth   Nutzer

05.03.2006, 00:06 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Hey, hier gehts ja richtig rund!

Danke für eure Beiträge!

@bubblebobble

Das mit dem z-Index (Layer) stellst Du Dir zu kompliziert vor, ist genauso einfach wie Deine Y-HotSpots, es wird einfach ein int-Wert gesetzt.

@whose
Beim Erstellen meines Spielfeldes werden die 6-Ecke in einer Managerklasse so einsortiert, dass jedes 6-Eck seine Nachbarn zugeordnet bekommt, daher ist während der gesamten Spielzeit die 6-Eck Anordnung bekannt.

Zusätzlich hab ich derzeit eh schon einen Algorithmus, der ein 6-Eck zu einer X,y Koordinate ermittelt (noch bevor ich gamedev.net kannte), der mir das 6-Eck zu einem Turm ermittelt (damit auch dessen Nachbarn), damit der Turm die richtigen Resourcen zugeordnet bekommt.

Aus diesen beiden Mechanismen müsste es ja möglich sein, eure Vorschläge umzusetzen. Einerseits Objekte, welche 6-Ecke überdecken in Listen über diese einzutragen, andererseits bei der Änderung von Objekten die 6-Ecke und deren betroffene Nachbarn zu entdecken.
Muss halt meinen Code umbauen, da die 6-Ecke und Türme z.B. derzeit noch z.T. von den Grafiken entkoppelt sind.

Ciao
 
Reth   Nutzer

03.03.2006, 14:48 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Ja so hab ich das ja auch immer gemeint.
Vor den Listen schrecke ich noch immer ein bischen zurück, da ein Objekt fast immer mehrere andere überdeckt und die Listen ständig umgebaut werden müssten.

Meine Objekte sind eh schon mit Layern versehen (z-Index) und da ich STL-Konstrukte verwende, kommen die automatisch richtig sortiert raus.

Zum Blitten werde ich in einem ersten Versuch immer die gesamte Objektgröße (ca. 30x50 bis 80x80 Pixel) nehmen, dann spar ich erstmal die Clippingberechnungen, die zu den Überdeckungsberechnungen ja noch dazukommen.

Ich muss "nur" ne möglichst performante Methode finden, meine Objekte einzuordnen, so dass sich überdeckende möglichst leicht finden lassen, ohne immer alle zu durchlaufen. Zu jedem Objekt aber ne Überdeckungsliste machen ist m.E. zu viel Aufwand!?
Eine Art der Sortierung ist auf alle Fälle der Layer, dann braucht man nur in den anderen zu suchen. Aber dann? Um Überdeckungen festzustellen, muss ich ja alle Objekte durchgehen. Wenn dann überdeckte gefunden werden, muss ich mit diesen wieder durchgehen. Letzteres kann ich umgehen, wenn ich die ClippingRegions setze (oder zumindest stark einschränken).

Ist ClipBlit eigentlich schneller als BltBitmap?
 
Reth   Nutzer

03.03.2006, 11:56 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

@bubblebobble:

Danke, werd ich mir mal reinziehen.

Aber was bedeuten denn die / ?
Z.B. hier:

struct Rectangle cliprectMinX = x1,y1,x2,y2;

oder hier:

old_region = InstallClipRegion(rpLayer, new_region);

Eine Alternative?
 
Reth   Nutzer

03.03.2006, 09:05 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Zitat:
Original von whose:

Genau, Du hasts im Grunde erfaßt. Und dabei spielt es keine Rolle, welche Größe z.B. das Gebäude aktuell hat, da Du diese Größe in die Berechnung der Überdeckung aktuell mit hinein nehmen kannst. Die Größen ändern sich ja nicht mitten im Zeichenvorgang sondern schon davor. Also kannst Du auch auf die Größen zurückgreifen bei der Berechnung, selbst für die Ermittlung des betroffenen Tiles. Statt fester Werte nimmst Du einfach die tatsächlichen Werte des Objekts.

Grüße


Nur darin bestand glaub ich mein Performanceproblem, die Überdeckungen für jedes Objekt zu finden (rekursiv, wenn andere Objekte betroffen waren).
Ein Objekt kann ja ein darunterliegendes überdecken. Wenn es sich aber bewegt, muss ich auch die darüberliegenden berücksichtigen.
Darum hab ich die Layer eingeführt.
Nun brauch ich "nur" noch ne performante Methode, wie ich überdeckte Objekte in unterschiedlichen Layern finde.
Eine Suche über die Objektkoordinaten in einem Tilearray scheidet aus, da ja nicht nur die Hintergründe betroffen sind.

Zur Vereinfachung kann ich ja bei meinen 6-Ecken von ner festen Größe ausgehen, auch wenn sie mal mehrere Animationen und Frames haben. Da es keinen Sinn macht, die Tile-Größe während der Spielzeit zu ändern (zumindest seh ich keinen).

Ciao

[ Dieser Beitrag wurde von Reth am 03.03.2006 um 09:12 Uhr geändert. ]
 
Reth   Nutzer

03.03.2006, 00:44 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

So langsam entwickelt sich das zum Brainstorming meinerseits.

Ich hab das Gefühl, ich steh auf sämtlichen Schläuchen und wenn ich von einem runtergeh, tret ich auf 2 neue!

Also mal für die statischen Objekte gesprochen, die da Hintergrund oder Gebäude sein können in unterschiedlichen Layern.
Die Gebäude überdecken bis zu 3 Hintergrundobjekte. Ändert ein Gebäude seine Grafik, sind bis zu 3 Hintergrundobjekte betroffen. Diese gilt es zu finden und neu zu zeichnen. Davor wird eine ClipRegion in der Größe des Gebäudes angelegt, damit nicht andere Gebäude betroffen werden, wenn die Hintergründe neu gezeichnet werden. Da Hintergrund und Gebäude unterschiedliche Größen haben, wird es schwierig die Überdeckungen zu ermitteln. Mir fällt da nur ein die 4 Ecken des Gebäudes zu nehmen und überdeckte Hintergründe zu finden.

Finde alles gerade mords kompliziert aufgrunde des Systems, welches ich mir hier gebaut habe.

Ciao
 
Reth   Nutzer

03.03.2006, 00:14 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Jetzt kam doch eine Antwort auf den von mir nun schon geänderten Beitrag.

Zitat:
Original von whose:
Zitat:
Original von Reth:
Hm, jetzt hab ich mein Hauptproblem (?) wieder entdeckt.
Ich habe meine Animationsklassen so entworfen, dass sie mit flexiblen Framegrößen umgehen können und ihre aktuelle Höhe und Breite kennen.
Es gibt dazu noch eine maximale Höhe und Breite.
Eine Animation kann aus beliebig vielen Frames mit unterschiedlichen Größen bestehen.

Das macht das Ganze nicht unbedingt leichter (im Hinblick auf Umsetzung von Pixelkoordinaten auf Arraykoordinaten).

Hm, muss ich mir nochmal reinziehen.


Nein, im Grunde ists auch dann genau das Gleiche. Du nimmst als Berechnungsgrundlage halt die dann aktuellen Größen (Position X/Y, Höhe und Breite des Animationsframes) und weißt, was so alles überdeckt wird davon.


Schon, aber durch die unterschiedlichen Framegrößen kann ich keinen einfachen Algorithmus für das Auffinden überdeckter Teile in einem Array hernehmen, da die Breite der Frames unterschiedlich ist und ich daher nicht mehr eine feste Zahl nehmen kann.

Zitat:
Unter anderem erfährst Du dann auch, ob dieses Objekt bereits in einem Damage-Bereich (ClipRect später!) liegt und ob es da noch ganz reinpaßt. Paßts nicht mehr ganz rein, ists an der Zeit, den Damage-Bereich zu vergößern

Nimm Dir dazu auch mal Michas, Thilos und meinen Rat zu Herzen, informier Dich über Sinn und Zweck von ClipRects. Wenn Du diese ClipRects in ihrer Größe so berechnest, daß alle Objekte auf ihren jeweiligen Positionen und in ihren aktuellen Größen da reinpassen, kannst Du für die Ermittlung der betroffenen Tiles (also die unterste Ebene!) sogar ganz simpel die ClipRect-Koordinaten nehmen.


Über ClipRects usw. hab ich schon diverses gelesen, auch etwas Code (aus Amiga intern und autodocs). Aber das Hauptproblem bleibt ja die Ermittlung von Überdeckungen, v.a. wenn die Hintergründe auch animiert sind.

Zitat:
Die Tiles müssen im Refresh dann ja als erstes gezeichnet werden und eben auch durch Clipping beim Zeichnen begrenzt werden, damit nicht am Refresh beteiligte Objekte unbehelligt bleiben.

Auf dieser Grundlage will ich ja auch aufbauen.
Hab mir das so gedacht: Ich unterscheide meine Objekte in statische und bewegliche.
Die beweglichen werden immer neu gezeichnet, nach den statischen.
Die statischen werden dann neu gezeichnet, wenn sie sich ändern.
Beide Objektarten sind mit Layern versehen, die in aufsteigender Reihenfogle gezeichnet werden.
So sollte es erst mal klappen. Wenn das mal tut, kann ich mich ans optimieren machen.
Oder ist das grundverkehrt?

Ciao
 
Reth   Nutzer

02.03.2006, 23:11 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Hm, jetzt hab ich mein Hauptproblem (?) wieder entdeckt.
Ich habe meine Animationsklassen so entworfen, dass sie mit flexiblen Framegrößen umgehen können und ihre aktuelle Höhe und Breite kennen.
Es gibt dazu noch eine maximale Höhe und Breite.
Eine Animation kann aus beliebig vielen Frames mit unterschiedlichen Größen bestehen.

Das macht das Ganze nicht unbedingt leichter (im Hinblick auf Umsetzung von Pixelkoordinaten auf Arraykoordinaten).

Am besten erklär ich mal mein System, so wie es derzeit bei WizardGrounds zum Einsatz kommt:

Es gibt eine Frameklasse, die das eigentliche Bild beherbergt (Bitmap). Jedes Bild gibts nur einmal im Speicher.
Dann gibt es Animationsklassen, die beliebig viele Frames mit unterschiedlichen Größen enthalten können (zur Vereinfachung beim Blitten wird die maximale Größe über alle Frames bestimmt).
Darüber gibt es die Animationsklasse, die beliebig viele Animationen beherbergen kann (z.B. ein Gebäude kann untersch. Animationen haben für den Aufbau, den Ausbau, beschädiger Zustand, zerstörter Zustand etc.).
Abschließend gibt es noch die Verwalterklasse, die alle Animationsobjekte verwaltet.
Dieser Aufbau gilt für alle Elemente, auch die Hintergrundtiles, die animiert sein können. Damit geht das ganze Konzept mit Tilearray usw. flöten!

Das ist das ganze Prinzip. Warum einfach, wenns auch kompliziert geht!?

Naja, bin ja selbst schuld!

Ciao

[ Dieser Beitrag wurde von Reth am 02.03.2006 um 23:55 Uhr geändert. ]
 
Reth   Nutzer

02.03.2006, 12:47 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Zitat:
Original von whose:

8 ist Binär 00000111.


Halt! 8 ist binär 00001000 !
D.h. Du verknüpfst mit 11110111.

Zitat:
Und was passiert bei, sagen wir, 12/8? Das ist 1.5. Wie wird das gerundet?

Das ist implementierungsabhängig ;) Je nach Compiler/Typ der Operanden geht das in die Hose und Du bekommst 2 statt 1. Richtig kritisch wirds ab 13...


Halt, halt! Von Runden hab ich nichts gesagt. Es ist eine reine Ganzzahldivision von Integerwerten ohne Rest.
D.h. alles geteilt durch 8, was einen Rest ergibt ergibt die Zahl vorm Komma, also:

...
9/8 = 1
10/8 = 1
11/8 = 1
12/8 = 1
...
15/8 = 1
16/8 = 2
...

Zitat:
Das bedeutet, es wird immer automatisch zum richtigen Index umgeschalten, wenn Deine Tiles 8 Pixel breit sind.

Mit dem Verfahren oben bekommst Du immer die (fast) korrekt für unsere Zwecke gerundete Ganzzahl. Bei x=9 käme dabei 2 raus, was dem richtigen Index+1 (!) entspricht. Bei x=17 gäbe das 3, was ja auch richtig ist, da die Koordinate 17 das dritte Tile berührt (immer davon ausgegangen, daß ein Tile 8 Pixel groß ist). Einziger Fallstrick hierbei ist die in C/C++ verwendete Indexierung, die nun einmal bei 0 beginnt und nicht bei 1. Daher mußt Du das Ergebnis um 1 verringern, um den korrekten Index im Array zu erhalten.


Und eben hier hast Du keine Probleme mit dem von mir beschriebenen Verfahren, denn alles < 8 (also 0 bis 7) geteilt durch 8 gibt damit immer 0.

Ciao
 
Reth   Nutzer

02.03.2006, 12:32 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Zitat:
Original von whose:
Zu dem Thema ist auf gamedev.net der Artikel, von dem ich sprach. Ich weiß jetzt nicht mehr genau, welcher das war, aber da gings auch um Hextiles und deren Anordnung in einem 2D-Array. Wenn ich mich recht erinnere, war das so gelöst, daß die Tiles einer Reihe auch in die entsprechende Reihe des 2D-Arrays eingetragen wurden und bei Berechnungen/Zeichenoperationen der Zeichen-Offset berücksichtigt wurde.


Den hab ich gelesen, aber nicht sosehr auf mich gemünzt, da deren Tiles immer am linken und oberen Rand beginnen, ich aber ja die weißen Bereiche habe, aber die kann ich ja ignorieren und die entspr. Felder leer lassen.

Ciao
 
Reth   Nutzer

02.03.2006, 11:59 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Zitat:
Original von whose:
Zitat:
Original von Reth:
Die Damagelist wird dann Layer für Layer komplett neu gezeichnet (in dem einen Artikel auf gamedev.net steht glaub, dass erst alle Layer eines Bereiches gezeichnet werden, bevor die des anderen Bereiches drankommen, um Abschneiden von Objekten zu verhindern. Also entweder hab ich in dem Artikel was missverstanden oder passiert dadurch doch genau das: Objekte können abgeschnitten werden.


Es kann Dir passieren, daß Objekte "aus Versehen" von Objekten einer unteren Ebene übermalt werden, wenn Du die Reihenfolge nicht korrekt einhältst. Das kann so weit gehen, daß ein neu zu zeichnendes Tile ein gerade neu gezeichnetes Objekt eines Nachbartiles übermalt. Das wäre dann abgeschnitten.


Darum meinte ich ja, dass man alle Bereiche Ebene für Ebene zeichnen muss und zwar auf einmal. Nicht Bereich1 alle Ebenen, dann Bereich2 alle Ebenen, etc. Dann sollte es klappen, denke ich.

Zitat:
(char angenommen) Es wird mit 11111000 UND-verknüpft.

Aber wie kommt da das NICHT (~) zum tragen?

Zitat:
Der Gag dabei ist die vorherige Addition von 7. Mit der Mimik erreichst Du, daß Du nur ganze Zahlen erhältst, die durch 8 teilbar sind. Wenn Du z.B. ein Objekt auf der Koordinate x = 9 liegen hast, muß diese Koordinate für die Umrechnung in einen Array-Index irgendwie auf "ganze" Indizes erweitert werden. Mit dem Krempel von oben käme dann (9 + 7) = 16 heraus, das &~8 hätte darauf keinen Einfluß. 16 läßt sich gut durch 8 teilen...

Ich nehm dafür immer Ganzzahl-Division ohne Rest (/).
Ist das von Dir beschriebene Verfahren schneller?
Also wenn ich den Index im Array zu einer Koordinate ermitteln will nehm ich die Koordinatenwerte dividiert durch 8 ohne Rest.
Z.B. (x,y) = (10,10) => Arrayindex = (10/8=1,10/8=1)
also an Position (1,1) im Array (dieses beginnt bei (0,0)).

Ciao
 
Reth   Nutzer

02.03.2006, 10:52 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

@bubblebobble:

Danke. Aber wie siehts mit dem Ablegen einer solchen Karte
http://people.freenet.de/WizardGrounds/images/Beginn.png
in ein Array aus? Mit der Formel y*Breite + x bekomme ich ne eindeutige lineare Zuordnung.
Allerdings würde ich bei einer Map wie im Bild die weißen Bereiche mit ins Array legen müssen, obwohl die nie verwendet werden.
Du arbeitest mit DoubleBuffering, oder. Aber ist das auch noch ratsam (bezogen auf den ganzen Bildschirm), wenn man mit nem 1024x768x8 Screen arbeitet?

@Micha1701:

Auch danke. Werde mir die diesbezüglichen Dokumente mal reinziehen.
 
Reth   Nutzer

02.03.2006, 09:12 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Zitat:
Original von Micha1701:
Hi!

Ich hab in Realms of Power ebenfalls Tiles verwendet. Und diese überlagern meist das darüber liegende Tile (z.B. Berge oder auch Einheiten). Damit ich jetzt nicht alles neu zeichnen mußte, hab ich einfach den zu bemalenden Bereich beschränkt. Dazu einfach mit Region() und InstallClipRegion() den Bereich beschränkt. Dann mußte ich nur den Teil um das zu ändernde Tile neu zeichnen. Alles andere wird dann ja nicht "zerstört".

Vielleicht hilft Dir das weiter.
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com


Wie funktioniert das denn genau? Kannst Du da n kleines Bsp. posten?
Was machst Du wenn die umgebenden Bereiche, die Du neu zeichnest wieder andere Sachen überdecken, die aber über ihnen liegen und daher auch neu gezeichnet werden müssten?

Ciao
 
Reth   Nutzer

02.03.2006, 08:49 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Hi nochmal,

wow, das ist wieder ausführlich!
Danke für Deine Mühen!

Zitat:
Original von whose:
@Reth:

Bekannt sein muß dafür die Anzahl der X-Koordinaten pro Zeile.

Dann ist Eintrag(x, y): Array[y * x]

Simpel, oder?


Aber dann haben die Objekte mit gleichen vertauschten Koordinatenwerten ja denselben Eintrag!
Also x=3 und y=4 bilden auf dieselbe Arrayposition ab wie x=4 und y=3!? Oder meintest Du Array[x, y]?

Zitat:
2D-Arrays sind kein wirkliches Geschwindigkeitsproblem. Der Compiler arbeitet mit 2D-Arrays genau so. Du kannst also beruhigt 2D-Arrays verwenden.
Geschwindigkeitsmäßig ist das natürlich OK. Da ich aber in C++ mit der STL arbeite und so leckere Sachen wie HashMaps habe, wollte ich die gern verwenden, da sie einen schnellen direkten Zugriff auf Objekte erlauben. Wenn ich daher die Koordinaten von 2D nach 1D eindeutig transformieren kann, dann kann ich direkt in der HashMap die entsprechende Position ermitteln. Da ich ja mit Layern arbeite, ist an jeder dieser Positionen eine Liste mit Objekten in der Reihenfolge ihres Layers eingetragen.

Zitat:
Worauf Du unbedingt achten mußt ist, so wenig Zeichenvorgänge wie möglich pro Frame zu erreichen und nicht zu lange durch die Koordinatenberechnungen zu laufen.

Das will ich ja mit den Layerlisten erreichen. Allerdings bei den Koordinatenberechnungen weiss ich noch nicht, wie ich das optimal gestalten kann. Habe mir im Moment diesen Ansatz überlegt:

Wenn ein Objekt seine Position ändert => finden seiner Liste in der Map. Aufnehmen der Layerliste an dieser Position in die Damagelist. Durchgehen aller Objekte in der Liste, prüfen der 4 Eckpunkte jedes dieser Objekte (also jeden Layer an dieser Position), ob diese andere Objekte überlappen (hier wärs halt sehr von Vorteil, wenn ich eindimensional arbeiten könnte, da ich dann direkt in der HashMap die überlappenden Objekte finde). Für jede so gefundene andere Layerliste diese in die Damagelist aufnehmen und den Vorgang wiederholen.
Denke aber nicht, dass das performant ist (Dominoeffekt).
Die Damagelist wird dann Layer für Layer komplett neu gezeichnet (in dem einen Artikel auf gamedev.net steht glaub, dass erst alle Layer eines Bereiches gezeichnet werden, bevor die des anderen Bereiches drankommen, um Abschneiden von Objekten zu verhindern. Also entweder hab ich in dem Artikel was missverstanden oder passiert dadurch doch genau das: Objekte können abgeschnitten werden.

Zitat:
Ich kann Dir auch gern mal Sourcecode zu meiner Sprite-Engine schicken. Die ist zwar derzeit nicht besonders komplex, aber läuft butterweich auf allen Maschinen und zeichnet nur so viel, wie unbedingt nötig ist (also bewegte Objekte vor fixem Tile-Hintergrund, der fixe Hintergrund muß unter jedem Sprite dann ja restauriert werden). Da habe ich sogar noch wesentlich komplizierter gearbeitet, als nötig wäre. Interessanterweise läuft die sogar mittels OS-Doublebuffering, also mit der ChangeScreenBuffer()-Mimik. Das scheint ürigens die einzige Methode zu sein, die sowohl unter CGFX als auch P96 rasterstrahlsynchron läuft.

Gern, immer her damit. Hoffentlich kapier ichs auch (fremder Sourcecode ist nicht immer gleich für Außenstehende verständlich).

Zitat:
Einziger Nachteil bei dieser Engine ist bisher nur, daß die noch nicht mit überlappenden Sprites klarkommt, da wird der Hintergrund noch doppelt gezeichnet unnötigerweise.

Genau das Problem hab ich momentan. Wenns nur ein Objekt überm Hintergrund wäre, wärs einfacher. So aber hab ich Objekte in versch. Ebenen, die sich gegenseitig überdecken können.

Zitat:
(Edit) Vielleicht fällts Dir leichter, wenn Du Dir die Grafik vorstellst wie übereinandergelegte Overhead-Folien. Für jedes Objekt eine eigene Folie, die Hintergrund-Tiles bilden eine einzige Folie. Je nachdem, wie Du die "Folien" der Objekte verschiebst, sind ein oder mehrere Tiles auf der Hintergrund-"Folie" überdeckt.

Genauso ist meine Grafik aufgebaut. Jedes Objekt hat einen Layer zugeordnet. Objekte innerhalb des selben Layers können sich nicht überdecken.

Zitat:
Die Ermittlung der überdeckten Bereiche ist verhältnismäßig einfach:

+---------------------------- X
| +--+
| | |
| +--+
|
|
|
|
|
Y

Hier bildet jeder "Strich" auf den Achsen die Position eines Hintergrund-Tiles ab.

Das eingezeichnete Objekt ist 4*3 "Tiles" groß. Wenn jedes Tile größer als 1 Pixel ist, kann es zu Überschneidungen zwischen Tile-Array- und Objektkoordinaten kommen (also unvollständige Überdeckung, weil eine Abbildung der Objekt-Koordinaten in Pixeln auf den Tile-Array-Index keine ganzzahlige Angelegenheit mehr ist, sobald ein Tile 2 Pixel pro Richtung groß ist. Eine Objekt-Koordinate in Pixeln kann dann einem "halben" Tile entsprechen).

Man muß also in "ganzen Tiles" den Bereich ermitteln, den das Objekt überdeckt.

Dieser Bereich ermittelt sich wie folgt, wenn die Tiles 8*8 Pixel groß sind:

Startposition des Bereiches in X: (ObjectPosX + 7) &~ 8
Startposition des Bereiches in Y: (ObjectPosY + 7) &~ 8

Anzahl "ganze" Tiles in X, die das Objekt überdeckt: (((ObjectPosX + ObjectSizeX) + 7) &~ 8 ) - Startposition in X

Anzahl "ganze" Tiles in Y, die das Objekt überdeckt: (((ObjectPosY + ObjectSizeY) + 7) &~ 8 ) - Startposition in Y

Die ermittelten Werte sind Indizes innerhalb des Tile-Arrays, also "ganze" Tiles (!). Damit weißt Du, welche Tiles innerhalb des Arrays neu gezeichnet werden müssen. Das funktioniert genauso bei hexagonalen Tiles, vorausgesetzt, Du bekommst die Koordinaten in ein 2D-Array transformiert.


Das ist ungefähr das Gleiche wie ich es machen will mit den 4 Eckpunkten pro Objekt, denke ich. Was ist da schneller? Was macht (ObjektPosX +7) &~ 8 nochmal genau? Wird hier mit Nicht-8 UND-verknüpft (also mit 0111)?

Zitat:
In Deinem Fall ist das Ganze sogar noch ein wenig simpler, fällt mir gerade auf. Bei Deiner Grafik kann ein Objekt maximal 3 Tiles überdecken, da läßt sich das bestimmt noch stark vereinfachen (also nur mit den Objektkoordinaten arbeiten, die Größe des Objekts spielt dann wohl nur eine sehr untergeordnete Rolle).

Das ist richtig. Dazu kommen aber noch Überdeckungen von Objekten untereinander (Cursor über Turm usw.). Dafür hab ich die Layer eingeführt. In meiner ersten Version war auch nicht die Überdeckung das Problem, aber wenn mal mehrere animierte Objekte auf dem Schirm waren, wurde das Ganze sehr langsam. Hab noch nicht rausgefunden wieso, denke aber, dass die ganzen Iterationen, die im Animations- und Überdeckungsalgorithmus stattfinden Schuld waren.

Ciao

[ Dieser Beitrag wurde von Reth am 02.03.2006 um 08:55 Uhr geändert. ]
 
Reth   Nutzer

01.03.2006, 21:04 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

@whose:

Ach ja, wenn ich einen Algorithmus habe, mit dem ich eindeutig zweidimensionale Koordinaten auf einen eindimensionalen Index abbilden kann, kann ich in einer Liste eindeutig auf eine Position zugreifen und weiss damit welche Objekte in allen Layern ich überdecke und ändern muss.

Mit ner HashMap kann ich auch mogeln, indem ich Strings baue mit der x-Koordinate und der y-Koordinate. Diesen String kann ich dann als Schlüssel verwenden.

Aber eigentlich steh ich immer noch ein wenig auf dem Schlauch, wie ich das performant angehen kann, trotz der Artikel von gamedev.net.
Muss den Knoten irgendwie zum Platzen bringen!
 
Reth   Nutzer

01.03.2006, 19:20 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Zitat:
Original von whose:
Zitat:
Original von Reth:
2. Was mache ich mit Objekten, die mehr als ein Tile überdecken? Denke mir dass so, dass deren linke untere Ecke (wenn man immer von oben links nach unten rechts blittet) ausschlaggebend ist. Über welchem Tile diese liegt, in dessen Layerliste wird das Objekt eingetragen.


Prinzipiell eine gute Idee... so kannst Du auch mehrere überlagernde Objekte relativ simpel verwalten, in diesem Fall über die Liste des Tiles. Achte nur drauf, daß Du dadurch nicht zu viele Blits fabrizierst (also nicht platt alles neu zeichnen, auch wenns nicht nötig ist), sonst wirds mächtig langsam bei vielen Überdeckungen.

Grüße


Hi whose,

ja das hab ich auch schon gedacht. In dem 2. Artikel steht auch was dazu.
Allerdings komme ich wohl um den Dominoeffekt nicht herum. Sobald ich ein Objekt aktualisiere muss ich alle anderen (oder benachbarten) überprüfen, ob sie überdeckt sind und ggf. neu zeichnen dann prüfen, ob sie andere überdecken etc.
Da ich Objekte an den Ecken meiner 6-Ecke hab, überdecken diese automatisch die benachbarten 6-Ecke, wenn an deren Ecken auch wieder Objekte sind, geht das Ganze weiter.

Hab noch keine Ahnung, wie ich darum herumkommen soll immer alle anderen Objekte auf Überdeckung zu prüfen?
 
Reth   Nutzer

01.03.2006, 12:56 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

@psd

Gerne!

@whose
Hab mal ein paar Artikel dort gelesen. Z.B. gehen http://www.gamedev.net/reference/articles/article748.asp und http://www.gamedev.net/reference/articles/article727.asp im Prinzip diesen Weg, den ich oben beschrieben habe.

Bleiben mir aber noch 2 Fragen:
1. Kann ich eine Matrix/ein Array vermeiden und meine 2-Dimensionale Landschaft aus Tiles in eine eindimensionales Array abbilden?

2. Was mache ich mit Objekten, die mehr als ein Tile überdecken? Denke mir dass so, dass deren linke untere Ecke (wenn man immer von oben links nach unten rechts blittet) ausschlaggebend ist. Über welchem Tile diese liegt, in dessen Layerliste wird das Objekt eingetragen.

[ Dieser Beitrag wurde von Reth am 01.03.2006 um 15:33 Uhr geändert. ]
 
Reth   Nutzer

28.02.2006, 21:24 Uhr

[ - Direktlink - ]
Thema: Koordinatentransformation, Überdeckung
Brett: Programmierung

Hallo zusammen,

ich überlege gerade an nem Algorithmus, wie ich am geschicktesten mehrere Ebenen von grafischen Objekten verwalte, so dass nur die notwendigsten neu geblittet werden müssen (ohne DoubleBuffering).

Hab mir gedacht, eine Liste von Listen zu machen, die den Koordinaten der Hintergrundkacheln entspricht.
Einen Algorithmus zur Rechtecküberdeckung hab ich schon, den kann ich dann dazu benutzen, die Ebenen über den Hintergrundkacheln einzusortieren. Am Ende steht eine Matrix mit Listen an jedem Knoten, in denen die Objekte der Reihe nach entsprechend ihren Schichten stehen.

Etwas speicheraufwändig, aber sollte tun.
Was meint ihr?

@whose
Wir ham uns ja über solche Sachen schon mal unterhalten, habe leider Deine Beiträge gerade nicht zur Hand!

Ciao
 
Reth   Nutzer

22.02.2006, 13:37 Uhr

[ - Direktlink - ]
Thema: Wie unter AOS4 SDK und GoldED Studio AIX installieren?
Brett: Programmierung

Hallo allerseits,

nachdem ich hier im Forum und auf AmigaWorld schon gesucht, aber nicht ganz das Passende gefunden habe frage ich nochmal explizit:

Wie muss ich vorgehen, um unter AOS4 das AOS4-SDK und von der GoldED CD GoldED Studio AIX so zu installieren, dass ich AOS4-native Programme erzeugen kann?

Wenn ich das AOS4 SDK habe, ist da dann ein GCC mit allen nötigen Sachen dabei, oder wird der von der GoldED-CD installiert?

Danke schon mal
Ciao
 
Reth   Nutzer

30.01.2006, 12:33 Uhr

[ - Direktlink - ]
Thema: Romani ite domus( ?)
Brett: Get a Life

@pixl:

Was willste denn hören?

Ne plutperauchte Schekelfeilscherei?
Oder das man Dich Loretta nennt?
Ein "Bitte tritt mir auch auf den Fuß!"?

Da gäbs schon noch einiges (...und ein Paket Kies...), aber ausm Stehgreif gehn mir die Sachen langsam aus!

Zudem trifft mich gerade wieder die große Verwirrung, so dass die Söhne nicht mehr wissen, wo die Väter diese Dinge am Vorabend...
 
Reth   Nutzer

09.01.2006, 20:53 Uhr

[ - Direktlink - ]
Thema: Gadgets mal wieder
Brett: Programmierung

Hallo zusammen,

wie es scheint, waren GadgetText und SpecialInfo nicht initialisiert, obwohl ich dachte, mein bisheriger Code hat dafür gesorgt.

Nun scheints zu klappen.

Danke vielmals.

Eigentlich ist es schon beabsichtigt GadgetDown- und GadgetUp-Messages zu bekommen, damit beide ausgewertet werden können.
 
Reth   Nutzer

09.01.2006, 16:31 Uhr

[ - Direktlink - ]
Thema: Gadgets mal wieder
Brett: Programmierung

Hallo allerseits!

Also es ist zum Haare raufen (wenn sie nicht schon von selbst ausgehen würden)!

Ich könnt nen Veitstanz hinlegen.
Habe mal wieder Probleme mit Gadgets. Ich erzeuge Gadgetstrukturen und füge sie mit AddGadget einem Fenster hinzu. Dabei wird immer ans letzte Gadget ein neues angehangen, wenn es hinzugefügt wird.
Standardmäßig hat jedes Gadget als NextGadget zunöchst NULL drin stehen.
Die Gadgets sind vom Typ GTYP_BOOLGADGET, bekommen einen GadgetRender-Image-Zeiger und einen SelectRender-Image-Zeiger, dazu die Flags GACT_RELVERIFY | GACT_IMMEDIATE für Activation und GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_LABELIMAGE für die Flags.

Doch immer, wenn ich RefreshGadgets mit dem Zeiger auf das erste Gadget aufrufe friert mir das System ein.
Das Problem hatte ich schon mal, konnte es damals aber lösen, indem ich die Reihenfolge fürs Hinzufügen der Gadgets, dem Aktivieren des Fensters und dem Refresh der Gadgets und des Fensters anpasste.
Diesmal klappt das aber nicht mehr, obwohl die Reihenfolge die gleiche ist.

Am Sa. hab ich das Ganze mal zum Leufen bekommen, da hab ich dem Window noch IDCMPFlags verpasst. Danach hab ich nur noch zusätlichen Code für das Fenster erzeugt (z.B. zum Blitten usw.) doch nun friert mir das System ständig ein, wenn ich RefreshGadgets rufe, egal wann ich das mache!

Bin mir sicher, dass die Verzeigerung der Gadgets stimmt und rufe den Refresh wie folgt:

RefreshGadgets(first, window, NULL);

first ist der Zeiger auf das 1. Gadget, window der auf die Windowstruktur.
Die Reihenfolge ist die:

1. Fenster anlegen und öffnen
2. Gadgets hinzufügen
3. Images ins Fenster zeichnen
4. Fenster aktivieren
5. Gadgets Refresh (hier einfrieren)
6. Fenster Refresh

Mit dieser Reihenfolge hatte ich beim letzten Mal keine Probleme, nun aber schon.
Hab auch schon probiert die Gadgets nach Aktivierung zu setzen und gleich den Refresh darauf zu machen, bringt aber das selbe Ergebnis.

Entweder hab ich irgendwo was übersehen, oder gibts da ein genaues Vorgehen, was ich hier nicht einhalte?

Hat jmd. Rat?

Danke schon mal!

Ciao
 
Reth   Nutzer

29.12.2005, 21:32 Uhr

[ - Direktlink - ]
Thema: Strukturen, was passiert wenn...
Brett: Programmierung

Zitat:
Original von Holger:
Entweder Du verschiebst die Funktionalität des Umwandelns in Standard-Gadgetstrukturen in die Buttons, etc. Oder Du verlagerst diese Funktionalität in eine dritte Klasse. Letzteres ist die sauberste Methode.
Solche Operationen können auch vom Compiler transparent eingefügt werden, d.h. die Benutzung bleibt unkompliziert.

class Fenster
{
...
public:
void add(StandardGadget g);
}

class MyButton
{
//optional: friend MyButton
}

class MyButtonStandardGadgetFactory
{
public:
MyButtonStandardGadgetFactory(MyButton b);
operator StandardGadget();
}

// ...

MyButton example;
Fenster fenster;
fenster.add(example);

So in etwa.

mfg

PS: Hoffe natürlich auch, daß Du (und alle anderen) ein schönes Fest hatten!


Hm, mein erster Ansatz war der, dass die Gadgetklassen ihre Strukturen selbst erzeugen und Window eine Friendklasse ist, damit die Strukturen nur über private Methoden zugreifbar sind.
Nun habe ich es ohne die Strukturen in den Gadgetklassen probiert, bis zu diesem Punkt.

Bei dem Ansatz mit der Factoryklasse braucht diese aber doch auch pro Gadgettyp ne eigene Methode oder ne RuntimeTypeChecking-Variante, oder!?
Geht das nicht irgendwie dynamischer (ohne RTTC) via Templates o.ä.?

Die Sourcen kann ich Dir gern mal zukommen lassen, wird wohl aber erst nächstes Jahr!

Auch PS: Danke schön, das Weihnachtsfest war schön!

Ciao
 
Reth   Nutzer

28.12.2005, 22:09 Uhr

[ - Direktlink - ]
Thema: Strukturen, was passiert wenn...
Brett: Programmierung

@Holger:

Danke nochmals.

Hoffe, Du und alle anderen hatten ein schönes Weihnachtsfest!

Jetzt hab ich nochmal ne Frage:

Nachdem ich nun auf den eher MVC-lastigen Ansatz gewechselt hab, stellt sich mir das Problem, dass ich meinem Fenster ja nun Buttons etc. hinzufügen will (habs jetzt mal ohne Layoutmanager).

Dabei soll diese Methode des Fensters die GadgetStruktur füllen und sich das Gadget einhängen.
Nun verhält sich aber ein TextButton ja anders als ein ImageButton!

Gibts da ne Möglichkeit mit Templates zu arbeiten, oder sollte man für jeden Buttontyp ne Conviniencemethode schreiben, oder RuntimeTypeChecking betreiben (letzteres ist ja der imperformanteste Ansatz)?

Ciao
 
Reth   Nutzer

16.12.2005, 09:01 Uhr

[ - Direktlink - ]
Thema: Strukturen, was passiert wenn...
Brett: Programmierung

@Holger:

Hm, bin mir nicht ganz sicher, ist glaub ein UWORD.

Also ist es so, wie ich für mich schon vermutet hatte, dass beim Aufruf des Pointers in UserData von einer einheitlichen Schnittstelle (zuminest bei Gadgets) ausgegangen wird. Wenn man keine ganz einheitliche Schnittstelle machen will, muss man dann ja ne Unterscheidung zw. z.B. Menüs und Gadgets machen.

Ciao
 
Reth   Nutzer

15.12.2005, 16:26 Uhr

[ - Direktlink - ]
Thema: Strukturen, was passiert wenn...
Brett: Programmierung

Hi Holger,

[quote]
Original von Holger:
Zitat:
Aber was macht man denn typischerweise mit solchen Events? Du versuchst herauszufinden, welcher Button/Menüpunkt betroffen ist, und ordnest ihm die zugehörige Aktion zu. Das kann über IDs und ellenlangen Switch-Statements oder halt über Pointer auf die zugehörige Aktion machen.
Mehrere Beobachter an ein Fenster zu hängen, die dann jeder für sich herausfinden müssen, ob das jeweilige Event für sie relevant ist, sind nicht nur umständlich zu programmieren, sondern auch Resourcenverschwendung. Intuition teilt Dir bereits mit, welches Gadget betroffen ist, das Gadget bietet mit dem UserData-Eintrag bereit eine Möglichkeit der Zuordnung zum zughörigen Anwendungobjekt, warum willst Du diese Möglichkeiten nicht nutzen?
Mehrere Beobachter für ein- und dieselbe Funktion sind eher die Ausnahme.


Aber die Auswertung welches Gadget betroffen ist, musst Du mit Hilfe von Switches oder ähnlichem irgendwo vornehmen, hatte nicht vor die doppelt zu machen (falls Du das dachtest).
Irgendwie musst man ja den Pointer für die Aktion identifizieren, der betroffen ist.
Oder wie willst Du sonst nen Controller für ein Gadget informieren?
Läuft das über die UserData? Wie siehts da mit der Parametrisierung aus (muss mich noch mal in die AmigaLiteratur vergraben)?
 
Reth   Nutzer

15.12.2005, 13:37 Uhr

[ - Direktlink - ]
Thema: Strukturen, was passiert wenn...
Brett: Programmierung

@Holger:

Gutes Beispiel.
In diesem ist der Controller aber mit dem Model verbunden, was ja auch Sinn macht. Leider kann man an die Action keinen ActionListener hängen, dieser wäre dann ein getrennter Kontroller, wodurch man hier ein bisschen zu fest gebunden ist für meinen Geschmack. Aber es gibt da ja noch andere Möglichkeiten (z.B. eigene Actionklasse, die alle eingehangenen ActionListener bedient).

In meinem Fall dachte ich an einen recht einfachen Ansatz, da ich ja wie gesagt kein komplettes Framework für das Amiga-API schreiben will und mich primär die Ereignisse innerhalb eines Fensters interessieren.

Daher die Idee, einem Fenster verschiedene Beobachter anzugeben: Einen für die Mausaktionen, einen für Menüaktionen, einen für Gadgets etc.
Ich weiss, dass das keine MVC-Trennung ist, entspricht aber den häufigsten Aktivitäten, die man in einer Fensteranwendung haben kann.

Ein striktes MVC zu implementieren finde ich nicht ganz so gelungen wie der Ansatz in Java, wo der Controller ans Model gehangen werden kann (Listener).
Dadurch verliert man zwar ein bisschen die Möglichkeit, einen Controller für unterschiedliche Models zu verwenden (nur wenn das Interface nicht stimmt, ansonsten kann ich den Controller überall einhängen), aber dazu fällt mir so schnell auch kein gutes Bsp. ein.


Ciao
 
Reth   Nutzer

14.12.2005, 13:03 Uhr

[ - Direktlink - ]
Thema: Strukturen, was passiert wenn...
Brett: Programmierung

Zitat:
Original von Holger:
Du denkst zu sehr in den alten AmigaOS-Strukturen, mit denen man sich eigentlich lieber nicht beschäftigen sollte. Was zeichnet denn in der Praxis z.B. einen Button aus? Einen Label-String und/oder ein Icon und im Falle des Label-Strings evtl. ein markierter Buchstabe für den Short-Cut. Dimension und Position sind Sache des Layouts, interessiert mich als Anwendungsprogrammierer überhaupt nicht und Flags bei einem Button? Kenne ich keine. Sicher, in den Gadget-Strukturen gibt es allgemeine Flags für Intuition, aber der Wert ist für jeden Button identisch.
Rahmen und Füllfarbe sollten nur im absoluten Ausnahmefall von denen einer normalen Buttons abweichen...
Ähnliches bei einer Checkbox, gleiche Attribute, plus einem boolschen Selected-Attribut.

Versuch Dich an der Praxis desjenigen, der die Komponenten hinterher benutzt zu orientieren. Was braucht er wirklich:
Button erzeugen, Text/Icon setzen
eindeutige ID zuordnen für die auszuführende Aktion, übersetzte String im locale-catalog, Hilfethemen.

Ein Gadget besteht von der Logik her wirklich aus fast nichts. Seiner Identität, Position in der Gadget-Hierarchie, den View-Optionen und dem Datenmodell.
Man beachte, daß mehrere Gagdets sich ein View-Setup und/oder ein Datenmodell teilen können. Im Gadget direkt sind nur die nicht gemeinsam nutzbaren Eigenschaften enthalten.


Hm, jetzt ist bei mir ein erstes Knötchen geplatzt.
Wenn ich Buttons etc. vom Layout entkopple, dann mache ich in diesen Klassen nur noch die eigentliche Funktionalität und beim einhängen der Buttons etc. in die Layoutklasse werden dann die Gadgets, MUI- bzw. ReAction-Komponenten angelegt.

In so nem Fall könnte man auch ne andere Philosophie verfolgen als z.B . in Java wo das Layout einer Komponente gesetzt wird:
Man könnte in so nem Fall nen unabhängigen LayoutManager machen, dem dann das Fenster ebenfalls als Komponenten übergeben wird und im LayoutManager wird dann erst die Amiga-API gerufen und das Fenster erzeugt.
Müsste man aber in jedem Fall ersteinmal komplett durchdenken und die Vor- und Nachteile aufzeichnen.

Für meinen momentanen Bedarf ist das alles erst einmal viel zu viel Aufwand (obwohl man ja nen Simplen FixedLayoutManager schreiben kann, der Elemente an feste Koordinaten setzt und dazu dann Buttons und was man sonst noch so braucht - die Integration von Menüs wäre so auch möglich), werd mal meine Wrapper schreiben und Dir dann schicken.
Wenns mich zu sehr packt, dann probier ich evtl. doch noch den Ansatz mit der Trennung von Buttonfunktionalität und Design mit Hilfe eines solchen simplen LayoutManagers, letzterer wird dann aber in das Fensterobjekt gesetzt bzw. ist dort immer vorhanden, wenn kein anderes Layout gesetzt wird.
Die Ereignisverarbeitung (Messages) dachte ich mir entweder an die Komponenten zu hängen (also wie nen Listener pro Button), oder in die Komponenten zu integrieren (ein Button weiss, wenn er gedrückt wird) oder nach Art getrennt ins Fenster zu hängen (z.B. so ne Art Listener für Mausereignisse, einen für Buttonereignisse etc.).

Ciao
 
 
Erste << 43 44 45 46 47 -48- 49 50 51 52 53 >> Letzte Ergebnisse der Suche: 1858 Treffer (30 pro Seite)

Suchbegriffe
Schlüsselwörter      Benutzername
Suchoptionen
Nur in diesen Foren suchen
   nur ganze Wörter
Nur Titel anzeigen
alle Treffer anzeigen

.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.