|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 19.07.2005, 20:25 Titel: Sprite flüssig aus dem Bildschirm verschwinden lassen |
|
|
Hi,
ich lasse eine Schildkröte von unten nach oben laufen. Wenn sie allerdings oben angekommen ist, verschwindet sie auf einmal. Ok, weil sie nicht außerhalb des Bildschirms gezeichnet werden kann.
Also hier erstmal die Draw-Funktion meiner Sprite-Klasse:
CPP: | void Sprite::Draw(LPDIRECTDRAWSURFACE7 lpDDSurface)
{
RECT SpriteRect;
// dieses Rechteck speichert die Position des Frames in der Oberfläche
SpriteRect.left = CurrentFrameX * FrameWidth;
SpriteRect.right = SpriteRect.left + FrameWidth;
SpriteRect.top = CurrentFrameY * FrameHeight;
SpriteRect.bottom = SpriteRect.top + FrameHeight;
lpDDSurface = DDrawObjekt.GetBuffer();
lpDDSurface->BltFast(x,y,lpDDSpriteSurface,&SpriteRect,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
// Delay erhöhen und testen, ob nächster Animationsschritt dargestellt werden soll
delay++;
if(delay >= FrameDelay)
{
// nächste Frame
CurrentFrameX++;
// Haben wir die Spaltenbegrenzung erreicht?
if(CurrentFrameX == FramesX)
{
// zur nächsten Zeile, in 1. Spalte springen
CurrentFrameX = 0;
CurrentFrameY++;
// Ist die Zeilenbegrenzung erreicht?
if(CurrentFrameY == FramesY)
{
// dann wieder beim ersten Frame anfangen
CurrentFrameY = 0;
}
}
// Verzögerung auf 0 setzen
delay = 0;
}
} |
Und hier meine Render-Funktion:
CPP: | // Hintergrund löschen
DDrawObjekt.Clear(RGB(255,255,255));
Kroete.Move(0,-2);
Kroete.Draw(lpDDSurfaceKroete);
// primäre Oberfläche anzeigen
DDrawObjekt.Flip(); |
Ich hab auch schon probiert, das so zumachen, dass er immer ein Stückchen weiter unten anfängt, das Sprite zu kopieren. Aber irgendwie kommt es mir dann so vor, dass die Schildkröte schneller läuft und außerdem bekomm ich das dann nicht synchroniesiert mit der Geschwindigkeit und so.
Die Schildkröte bewegt sich schneller, als ich abbaue. Doch wenn ich den Abbau beschleunige, dann bewegt sich die Schildkröte noch schneller.
Vlt. habt ihr eine andere Idee, wie man das lösen könnte.
Danke schonmal
Otti _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 19.07.2005, 20:34 Titel: |
|
|
probiere mal folgende Funktion aus:
(alternativ nen clipper basteln)
CPP: | bool Clippen(RECT &rc, int &x, int &y, int scrW, int scrH) {
bool value=true;
int bx=rc.right-rc.left;
int by=rc.bottom-rc.top;
if ((x+bx>0) && (y+by>0) && (x<scrW) && (y<scrH)) {
if(x<0) {
rc.left+=abs(x);
x=0;
}
if(y<0) {
rc.top+=abs(y);
y=0;
}
if(x+bx>=scrW)
rc.right-=bx+(x-scrW);
if(y+by>=scrH)
rc.bottom-=by+(y-scrH);
} else value=false;
return value;
} |
CPP: | ...
int xx=x;
int yy=y;
if(Clippen(SpriteRect,xx,yy,SCR_WIDTH,SCR_HEIGHT))
lpDDSurface->BltFast(xx,yy,lpDDSpriteSurface,&SpriteRect,DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
... |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 19.07.2005, 20:34 Titel: |
|
|
Hi,
die Lösung nennt sich Timing Klingt komisch, ist aber so
Das was Du benötigst ist nichts anderes als ein Timer der die Zeit vom Letzten Frame bis zum jetzigen Frame abfragt und du aus dieser Differenz eine Multiplikation mit einem Geschwindigkeitsfaktor (z.B. die der Schildkröte) durchführst und das Ergebnis einfach auf die momentante Position draufaddierst
Ist recht easy So wie Du es jetzt hast, könnte sich die Schildkröte auf meinem Arbeitsrechner innerhalb von 20 millisekunden verschwunden sein und auf einem alten 486dx2 erst in 2 Minuten Du musst das Zeitbasiert machen und nicht Framebasiert _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.07.2005, 20:34 Titel: |
|
|
naja, du must halt das Rechteck am Bildschirm klippen. So wie du es in deiner Drawmethode machst, ist das ja im Prinzip immer gleich groß. Du must also, z.b. beim oberen rand testen ob der kleiner als 0 ist, wenn ja auf 0 setzen. Das bei allen 4 Seiten dann müsste das stimmen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 19.07.2005, 20:45 Titel: |
|
|
3 Antworten, 3 Lösungen
@Fallen:
Bei deinem Code blick ich leider gar net durch, sry...
@Patrick:
Das mit der Zeit hab ich ja im Prinzip in der Variablen delay drinne, oder? Er prüft ja immer, ob er das nächste Frame anzeigen darf.
@Jonathan:
Deine Methode gefällt mir am besten, allerdings muss ich sagen, dass ich dich nicht ganz verstehe. Ich hab jetzt mal die Renderfunktion so geändert: (Hab jetzt anstatt dem oberen Rand einfach mal als y-Wert 300 genommen, um es besser testen zu können.
CPP: | void Render(void)
{
// Hintergrund löschen
DDrawObjekt.Clear(RGB(255,255,255));
Kroete.Move(0,-2);
if (Kroete.GetY() <= 300)
{
iKroeteHeight -= 2;
Kroete.SetXY(Kroete.GetX(),Kroete.GetY()+2);
Kroete.SetFrmHeight(iKroeteHeight);
}
Kroete.Draw(lpDDSurfaceKroete);
// primäre Oberfläche anzeigen
DDrawObjekt.Flip();
} |
Bei der Draw-Funktion hab ich folgendes geändert:
CPP: | // dieses Rechteck speichert die Position des Frames in der Oberfläche
SpriteRect.left = CurrentFrameX * FrameWidth;
SpriteRect.right = SpriteRect.left + FrameWidth;
SpriteRect.top = CurrentFrameY * FrameHeight;
if (Kroete.GetY() <= 300)
{
SpriteRect.top = CurrentFrameY * FrameHeight + (100 - FrameHeight);
}
SpriteRect.bottom = SpriteRect.top + FrameHeight; |
Meintest du das vlt. so? Denn nun bleibt zwar die Schildkröte aufn Punkt stehen (was sie ja hinterher nimmer soll, aber erstmal egal..), aber sie wird nicht von oben nach unten abgebaut, sonder von unten nach oben _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 19.07.2005, 20:52 Titel: |
|
|
t10ottoo hat Folgendes geschrieben: | 3 Antworten, 3 Lösungen
@Jonathan:
Deine Methode gefällt mir am besten, allerdings muss ich sagen, dass ich dich nicht ganz verstehe. Ich hab jetzt mal die Renderfunktion so geändert: (Hab jetzt anstatt dem oberen Rand einfach mal als y-Wert 300 genommen, um es besser testen zu können.
|
Schau dir mal meinen post an, das is das was er vorschlägt.
Patricks Vorschlag kannst du auch berücksichtigen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 19.07.2005, 21:04 Titel: |
|
|
@Fallen: ahjo, hab das mal ausprobiert, und dann kommt folgende Fehlermeldung:
Code: | Nicht aufgelöstes externes Symbol '"public: bool __thiscall Sprite::Clippen(struct tagRECT &,int &,int &,int,int)" (?Clippen@Sprite@@QAE_NAAUtagRECT@@AAH1HH@Z)', verwiesen in Funktion '"public: void __thiscall Sprite::Draw(struct IDirectDrawSurface7 *)" (?Draw@Sprite@@QAEXPAUIDirectDrawSurface7@@@Z)' |
Sei mir nicht böse, aber dann gefällt mir Patricks Methode doch besser
Hab nun erstmal die Differenz zwischen zwei Frames abgefragt, stimmt doch so, oder? Hier meine Spielschleife:
CPP: | while (true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
aktuelleZeit = timeGetTime();
letzteZeit = aktuelleZeit;
differenz = aktuelleZeit - letzteZeit;
Render();
} |
Den Rest deines Post hab ich nicht so richtig verstanden, also vom Inhalt schon, aber wie ich das umsetzen soll, versteh ich net. Welchen Geschwindigkeitsfaktor meinst du denn genau? Die Geschwindigkeit ist ja genaugenommen -2y. Aber was ich damit nu anfangen soll, weiß ich leider nicht
Ich kann doch nicht einfach die Zeitdifferenz nun mit -2 multiplizieren und dann auf y addieren, das bringt doch nichts _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 19.07.2005, 21:07 Titel: |
|
|
wenn du deltaTime nutzen willst dann stell deine sprite Klasse auf float um.
meine Funktion /Clippen) sollte vor dem anwenden übrigens definiert werden und vor allem an der richtigen stelle (vor der definition deiner sprite klasse) _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
t10ottoo Senior JLI'ler
Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 19.07.2005, 21:57 Titel: |
|
|
Soooo, nach einem knapp einstündigen Gespräch mit DirectXer hab ichs nu hinbekommen und verstehe auch die Funktion von Fallen Ein großes Dankeschön an euch beiden
Danke auch an Patrick und Jonathan. Wobei Jonathans Idee ja nun auch benutzt wird
Also bis denne *Schildkröte zuschau, wie sie ausm Bildschirm schleicht*
Otti _________________ Meine kleine Projekte-Seite |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.07.2005, 22:38 Titel: |
|
|
schön, hat ja nun doch noch geklappt. Viel spaß noch damit
Gruß DirectXer , ein ungewollter als Lehrer bezeichneter |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 20.07.2005, 10:08 Titel: |
|
|
du solltest auch in der Spieleschleife leiber schreibe
CPP: | while(msg.message!=WM_QUIT |
das ist irgendwie schöner wie noch so ne if-abfrage, weil übersichtlicher, kürzer und weniger fehleranfällig. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 20.07.2005, 10:31 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | du solltest auch in der Spieleschleife leiber schreibe
CPP: | while(msg.message!=WM_QUIT |
das ist irgendwie schöner wie noch so ne if-abfrage, weil übersichtlicher, kürzer und weniger fehleranfällig. |
ach lassn doch. Ich find die schleife schön naja, kannst die auch ändern, aber so ists doch ma was ganz anderes - nicht immer diese 0815-schleifen... |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|