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: 1860 Treffer (30 pro Seite)
Reth   Nutzer

14.03.2006, 15:41 Uhr

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

Zitat:
Original von bubblebobble:
Ja, davon gibts noch mehr, aber nichts released und noch nichts programmiert. Nur Studien bis jetzt.


Schade! Wollte mal den Unterschied zwischen gepixelt und gezeichnet begutachten.

Zitat:
Ja, Objekte die sich bewegen muss man "umhängen" im Array, aber egal ob das direkt auf dem Tile array ist oder dem "imaginären", rechteckigen Array. Allerdings kann dann ein Objekt auch in mehreren Arrays sein. Aber ich denke der Overhead lohnt sich. Wieviele sich bewegende Objekte planst du denn? Ich meine nicht feststehende Anims, wie z.B. eine wehende Fahne, weil da kann man einfach die Maximum Größe aller AnimFrames angeben und fix lassen.

Dann muss man aber die Objektarten unterscheiden statisch vs beweglich, damit man bei den statischen Objekten immer den größten Frame als Umriß hernehmen kann (sowas hatte ich in meiner 1. Version schon zum Hintergrund retten).
Wenn man unterscheidet in statische vs. bewegliche Objekte, dann werdens bei mir wohl in einer ersten Version ca. 10 bewegliche Objekte. Wenn man nur in statische vs. veränderliche Objekte unterscheidet, kann sich das Ganze dann auf ca. 30-50 aufschaukeln.

Zitat:
Speichern würde ich das ganze in einem dynamischen, eindimensionalen Array pro Rechteck Feld. Das ist also ein Array, was dynamisch erweitert wird, falls es zu klein ist.

Das ist der Vorteil der STL Container, die sind schon dynamish. Die Vectors und Maps, von denen ich sprach passen sich in der Größe an.

Zitat:
Es wird also nicht zwischen Boden-Tile, stehenden Objekten und beweglichen Objekten unterschieden. Alle sind in der gleichen Struktue gespeichert. Wenn sich ein Objekt bewegt, wird diese eben manipuliert.

Ist das eine Frage, oder machst Du das so bei Dir?

Zitat:
Die Überdeckung ist eigentlich ganze einfach.Grob wird nach ISO Tiles sortiert, also Objekte auf einem ISO Tile weiter vorne sind auch immer im Bild weiter vorne. Objekten innerhalb eines Tiles gehen dann nach Hotspot. Dadruch kann man z'.B. immer och Zäune entlange der Tilegrenzen machen, wo man einmal davor und einmal dahinter stehen kann. Nur mit Hotspot geht das nicht, das funktioniert nur bei punktuellen Objekten wie Bäumen, Figuren etc.

Für Dein "sind weiter vorn" ohne HotSpot brauchst Du doch aber ne z-Information, oder nicht?

Zitat:
Bei meiner Methode gibt es aber noch den vorteil, das Tiles höher sein können als andere, ohne mehraufwand. Dadruch lassen sich z.B. sehr hohe Berge machen, sodass die Boden Tiles eigentlich mehrere Tile Ebenen höher liegen (optisch). Gespeichert sind sie aber schon brav auf ihrem Platz im Tile Netz.

Wie unterscheidet sich das dann im Handling der Tiles, wenn diese unterschiedliche Höhen haben (in der Optik isses ja klar)?

Danke nochmals!

Ciao
 
Reth   Nutzer

14.03.2006, 10:23 Uhr

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

Zitat:
Original von bubblebobble:
@Reth
Ja, der Screenshot ist von meinem Spiel. Die Figur ist allerdings aus einer (sehr viel) älteren Version, als die Landschaft noch gepixelt war. Jetzt ist sie richtig gezeichnet, was mir besser gefällt, obwohl gepixelt auch seinen Charme hat, aber eben old-school aussieht.


Lecker, gibts noch mehr davon zu sehen oder testen? Ist das schon "released" oder noch in Entwicklung?

Zitat:
Kurz gesagt: Man baut die Landschaft in Tiles auf, so wie gehabt. Allerdings nimmt man nicht das Tile Array, um herauszufinden welches Object neu gezeichnet werden muss, sondern ein nochmals imaginär darüberliegendes Array, was dann auch Rechteckig sein kann. Das Array enthält dann für alle Raster-Rechtecke die Information, welches Objekt darinliegt. Das kann man in aller Ruhe berechnen, bevor das Spiel los geht. Objekte die sich bewegen müssen natürlich geupdated werden, aber das kostet kaum Zeit, das sind ein paar Bytes verschieden.
Muss ich einen Bereich neu zeichnen (es wird grundsätzlich immer alles neu gezeichnet), lege ich ein ClipRect um diesen Bereich, schaue in welche Rechtecke des Raster-Arrays die Refresh-Region hineinragen, und erhalte sofort alle Objekte, die ich dann stumpfsinnig blitte. Das ist alles.

Vorteil: Schnelles auffinden aller Bilder, die neu geblittet werden müssen, und Objekte können beliebig gross/hoch sein. Auch kann man Hügel machen, sodass Tiles "angehoben" werden. Der Refresh engine ist das völlig egal woher die Bildchen kommen, weil sie nur in das Raster-Array schaut.


Danke für Deine Beschreibung. Gute Idee mit dem imaginären Raster!
So ähnlich hab ich mir das für mich auch überlegt. Aber Du musst immer pro Durchgang alle Objekte prüfen und in Deinem drüberliegenden Array ggf. umhängen (denke mal, es ist ein Array von Zeigern und an jeder x,y-Position liegt ne aufsteigend sortierte Liste mit Zeigern auf die zu blittenden Objekte, oder?). Bin mal gespannt, wie schnell das bei mir wird.

Ich mach folgendes: Dank C++ und der STL nehme ich einen Vector, in dem liegen alle grafischen Objekte (Zeiger). Dazu nehme ich noch 2 3-dimensionale Maps, die 1. (x,y,z) bildet alle sichtbaren grafischen Objekte auf die Postionen der Hintergrundtiles (x,y) ab. An diesen Postionen liegt dann ne Map von Zeigern, der grafischen Objekte, die über dem Tile liegen (ein Objekt kann ja über mehreren Tiles liegen). Da Maps sortiert sind, werden die Zeiger mit ihrer Tiefeninformation als Schlüssel abgelegt, damit hab ich automatisch alle Objekte in der richtigen aufsteigenden Blitreihenfolge.

Die 2. Map (z,x,y) enthält dann alle neu zu zeichnenden Objekte pro Durchgang, diesmal kommt an erster Stelle die Tiefeninfo und dann die genaue x,y-Position der zu blittenden Objekte. Dadurch wird dann Schicht für Schicht übereinander geblittet.

Aufwändig wird wohl die Bestimmung, welche Tiles von einem Objekt überdeckt werden (dazu muss ich x,y-Position und Höhe, Breite des Objektes berücksichtigen, innerhalb dieser Bereiche [x, x+Breite] [y, y+Höhre] wird dann geschaut, über welchen Tiles das Objekt liegt und der Zeiger eingetragen dazu muss dann immer noch das max. ClipRect berechnet werden).

Das müsste eigentlich klappen, hoffe ich!

Ciao
René
 
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)?
 
 
Erste << 43 44 45 46 47 -48- 49 50 51 52 53 >> Letzte Ergebnisse der Suche: 1860 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-2025 by amiga-news.de - alle Rechte vorbehalten.
.