Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 29.12.2002, 13:14 Titel: Motion mit Rect |
|
|
Hi,
ich verwende die Spriteklasse und die Directdrawklasse aus dem Buch.
Ich hab da jetzt ein Bild mit mehreren Animationen,will aber nur eine haben. Ich wollte jetzt der Sprite::Draw Funktion hinzufügen das man noch ein Rechteck angeben muss, also:
Code: | void Sprite::Draw(LPDIRECTDRAWSURFACE7 lpDDSurface, RECT Motion)
|
Ich weiß jetzt aber nicht wie ich das Rechteck aus der Oberfläche der Create Funktion "herausschneiden" kann. |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 31.12.2002, 13:13 Titel: |
|
|
Wie meinst du das? Das man nur das Rechteck sieht?
Dann gibt man beim Blitten halt nur das Rechteck an!
(Hab die Frage jetzt erst gesehen, sry) |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 03.01.2003, 12:42 Titel: |
|
|
Ne, ich hab da ein Bild mit mehreren Animationen, ich will da aber nur eine haben, weiß nur nicht wie das gehn soll |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 03.01.2003, 12:52 Titel: |
|
|
einfach bei BLT Fast das rechteck angeben, das geblittet werden soll |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 03.01.2003, 12:53 Titel: |
|
|
Wäre es vielleicht möglich das Bild in lauter kleine Quadrate aufzuteilen und dann zum Beispiel nur die Quadrate 1-4 wiederholen zu lassen?
Doch wenn das funktionieren würde, wie code ich das? |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 03.01.2003, 13:01 Titel: |
|
|
Also, ich glaube das ist alles im Kapitel "Sprites Animieren" oder so im Buch ausführlich erklärt! |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 03.01.2003, 13:55 Titel: |
|
|
Ja, es steht schon drin wie man das Bild in Quadrate teilt, und dann "abspielt", aber es wird nicht erklärt wie man z. B. nur 1 - 7 von 20 abspielen lassen kann. |
|
Nach oben |
|
|
VerruecktesHuhn Super JLI'ler
Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 03.01.2003, 16:26 Titel: |
|
|
Also, kuck dir mal die Methode Draw aus dem Beispiel "Sprite Anim" an, da steht unter anderem folgendes drin:
Code: |
if(delay >= FrameDelay)
{
// nächstes Frame
CurrentFrameX++;
// Wenn wir über die Spaltenbegrenzung überschritten haben
if(CurrentFrameX == FramesX)
{
// müssen wir in die nächste Zeile in die 1. Spalte springen
CurrentFrameX = 0;
CurrentFrameY++;
// Wenn wir auch die Zeilenbegrenzung überschitten haben
if(CurrentFrameY == FramesY)
{
// müssen wir wieder beim ersten Frame anfangen
CurrentFrameY = 0;
}
}
// delay auf 0 setzen, damit wieder verzögert werden kann
delay = 0;
}
|
"if(CurrentFrameX == FramesX)" Da kann man dann FramesX als die Anzahl der Animationsschritte pro Zeile nehmen.
" if(CurrentFrameY == FramesY)" Da kann man FramesY als die Anzahl der Zeilen nehmen.
Wenn du halt 4 Animationsschritte pro Zeile und 5 Zeilen haben willst, dann ist:
FramesX = 4;
FramesY = 5; |
|
Nach oben |
|
|
DaN00b JLI'ler
Anmeldedatum: 10.08.2002 Beiträge: 159
Medaillen: Keine
|
Verfasst am: 04.01.2003, 00:02 Titel: |
|
|
Monkey das ganze ist doch net schwer man muss sich nur selber was überlegen...
z.b. kannst du ganz einfach noch die Create-Funktion der Spriteklasse um zwei parameter erweitern und zwar einen der den anfang der animationsreihe angibt und einer der das ende angibt
danach brauchste in der Draw-Funktion von der Spriteklasse nur noch ein paar if-abfragen mehr und schon hat sich die sache wie das ganze genau geht kannste dir ja selber überlegen ist ja net schwer _________________ Carpe Diem - Seize the day - Nütze den Tag! |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 04.01.2003, 12:05 Titel: |
|
|
Ich hab mir da jetzt ne Funktion geschrieben:
Code: | void Sprite::SetMotion(int AnfangX, int AnfangY)
{
FramesX = AnfangX;
FramesY = AnfangY;
} |
An sich funktioniert das auch so wie ich es will, doch wenn ich es in meinem Hauptprogramm aufrufe, wird sie immer nur beim ersten Aufruf "verwendet", ansonsten wird sie scheinbar ignoriert. |
|
Nach oben |
|
|
DaN00b JLI'ler
Anmeldedatum: 10.08.2002 Beiträge: 159
Medaillen: Keine
|
Verfasst am: 04.01.2003, 12:30 Titel: |
|
|
ehm FramesX und FramesY sind wenn du mich fragst doch die anzahl der frames überhaupt und somit eigentlich die absoluten endpunkte der animationsreihe.
was du brauchst sind zwei weitere int in der klasse sprite die sich die start und endpunkt merken
aber du darfst net vergessen das die eigentlichen frames die angezeigt werden durch CurrentFrame festgelegt sind welche ja normalerweiße in der Draw-Funktion inkrementiert werden und so läuft ja die animation ab
die start und endpunkte setzt du in deiner funktion SetMotion der du dann die zwei parameter gibst und CurrentFrame setzt du auf den Startwert den du dir aber zugleich in einem anderen int der klasse auch speicherst
also brauchst du nur noch die draw bearbeiten:
so ist es in der ursrpünglichen
Code: |
if(delay++ == 10)
{
CurrentFrame++;
delay = 0;
}
if(CurrentFrame == FramesX*FramesY)
{
CurrentFrame = 0;
}
} |
Pseudo:
Code: |
if(delay++ == 10 && CurrentFrame <= EndPunkt)
{
CurrentFrame++;
delay = 0;
}
else
{
CurrentFrame = StartPunkt;
}
|
Anmerkung: während ich diesen post geschrieben hab empfieng ich gerade das grauen..... Wehrpflichtigenerfassung NEEEEEEEEEEEEEEEIN _________________ Carpe Diem - Seize the day - Nütze den Tag! |
|
Nach oben |
|
|
|