Autor Beitrag
umpani
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: So 01.06.03 21:06 
Hallo,

ich habe folgendes Problem.

Ich habe eine Animation als TDXImageList. Damit komme ich auch wunderbar klar.

Diese Animation möchte ich nun jedoch mehrmals gleichzeitig darstellen. Soweit auch kein Problem.
Nun soll bei diesem Darstellen aber zum Teil nur die erste, bzw. Hälfte der Animation gezeigt werden (räumlich gesehen, nicht zeitlich).

Wenn die zweite Hälfte wegfallen soll, kann man das sehr gut mit "Patternwidth" und "Skipwidth" regeln.

Aber wie schaut es aus, wenn die erste Hälfte wegfallen soll?

Ich möchte es unbedingt vermeiden, die Animation doppelt speichern zu müssen, nämlich mit den jeweiligen Begrenzungen.


Danke im Voraus.
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Mo 02.06.03 09:55 
Hi umpani

ich bin mir nicht ganz sicher was du genau machen willst. Deshalb erst mal ein paar Fragen. Hast du die einzelnen Frames der Animation in verschiedenen Bildern der ImageList oder in einem Bild? Richtig wäre in einem Bild. Dann kannst du die Frame durch PatternWidth trennen und über PatternIndex auf einzelne Frames zugreifen.
Was meinst du mit Teilen der Animation? Nur bestimmte Frames der Animation oder Teile der einzelnen Frames? Wenn du nur bestimmte Frames willst kannst du das über den PatternIndex bestimmen welcher Frame gezeichnet werden soll. Wenn du nur einen Teil der Animationsframes zeichnen willst würde ich mir für jede Instanz ein Rechteck erzeugen und mittels
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
DXDraw.Surface.Draw (
    XPos, YPos, 
    SorceRect, 
    DXImageList.Items [AniNum].PatternSurface [FrameNum],
    DXImageList.Items[AniNum].Transparent
  )

den entsprechenden Ausschnitt zeichnen.
umpani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Mo 02.06.03 10:15 
Hallo, danke für die schnelle Antwort.

Zu deiner ersten Frage:

Die einzelnen Bilder der Animation sind in einem Bild. Diese kann ich dann durch die Pattern eigenschaften trennen.


Zu deiner Zweiten Frage:

Sich habe mir das So vorgestellet:

Aus der Animation:
1.
user defined image

soll diese:
2.
user defined image

oder diese:
3.
user defined image

in Laufzeit werden, ohne das das Bild der Quellanimation geändert wird und ohne das ich für jede "abgeschnittene" Animation eine neue Grafik in ein Imagelist laden muss. Das wird auf die Dauer höchst speicheraufwendig.


Animation Nr. 2 kann man mit Veränderungen an "Patternwidth" und "Skipwidth" hinbekommen. Bei der dritten geht dies nicht so leicht.


Danke für Deine Überlegungen.[/img]
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Mo 02.06.03 10:36 
Du scheinst die Animation genau in der Mitte getrennt zu haben. Zeichne so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
DrawRect := DXImageList.Items [AniNum].PatternRect [FrameNum];
DrawRect.Left := DrawRect.Right div 2;
DXDraw.Surface.Draw (
    XPos, 
    YPos, 
    DrawRect, 
    DXImageList.Items [AniNum].PatternSurface [FrameNum], 
    DXImageList.Items [AniNum].Transparent
  );


So sollte es tun.

PS: Die Eigenschaft SkipWidth wird doch nur übernommen, wenn du Restore aufrufts, oder? Darauf solltest du verzichten, denn das dauert doch eine Weile.
umpani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Mo 02.06.03 16:18 
Danke erstmal.

Hat soweit funktioniert, nur hat sich jetzt folgendes seltsames Phänomen ergeben.

Der von dir angegebene Quelltext gibt nur das erste und die letzte Bild der Animation wieder:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
blatt.Surface.Draw (
    x+1, y+20
    scrRect, 
    objects.Items[0].PatternSurfaces[testa], 
    objects.Items[0].Transparent);

Mein vorheriger, gibt die Gesamte Animation wieder:
ausblenden Delphi-Quelltext
1:
objects.Items[0].Draw(blatt.surface, x+150, y+20, testa);					

{blatt ist die DX-Draw Oberfläche, testa ist der Counter - immer von 0 bis 2}

Habe ich ein Fehler gemacht, oder gibt es ein Fehler in PatternSurfaces?
Wie kann ich das ganze lösen? *Schluchz*

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
Tweafis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 647

WinXP + fbsd
Delphi 5 Prof
BeitragVerfasst: Mo 02.06.03 16:40 
Ich hab zwar keine ahnung von DX aber warum nimmst du einmal

blatt.Surface.Draw

und beim anderen

objects.Items[0].Draw

_________________
.: Es wird der Tag kommen, an dem wir es nicht mehr ändern können :.
umpani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Mo 02.06.03 16:56 
Beim der einen Variante ist die Draw-Methode von der ImageList (da kan man das Bild jedoch nicht abschneiden) und bei der anderen Variante ist die Draw Methode von der DX-Draw Oberfläche.

Daran liegt es jedoch nicht, ich habe es auch mit BitBlt getestet. Das selbe Problem (auch hier wird patternsurface verwendet).
umpani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Mo 02.06.03 18:26 
Danke für Eure Hilfe,

Ich habe das Problem Gelöst.

Ich habe jetzt eimen wunderbar sprudelnden Brunnen am Linken Rand des Spiel-Bildschirmes:

user defined image

THX :D
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Di 03.06.03 11:04 
Hi umpani

was hat eigentlich nicht funktionierund wie hast du es gelöst? Kann auf die schnelle keinen Fehler entdecken.
umpani Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 389



BeitragVerfasst: Di 03.06.03 13:26 
Mein Fehler war, dass ich mich mit TRect vertan habe.
Ich habe übersehen, dass TRect bei den einzelnen Patterns den Bereich im Gesamtbild angibt.

Also z.B. bei einem Bild mit 3 Animationsstufen wobei jede 200*200 Pix groß ist.
TRect hat für das zweite Bild die Werte: Left = 200, right = 400.

Ich habe angenommen, dass TRect nur das Quadrat abhängig vom Pattern wiedergibt, also left = 0, right = 200.

Diese Annahme war jedoch falsch.

Daher kam der seltsame Fehler.