JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Sprite flüssig aus dem Bildschirm verschwinden lassen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 19.07.2005, 20:25    Titel: Sprite flüssig aus dem Bildschirm verschwinden lassen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 19.07.2005, 20:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 20:34    Titel: Antworten mit Zitat

Hi,

die Lösung nennt sich Timing Wink Klingt komisch, ist aber so Very Happy

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 Smile

Ist recht easy Smile 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 Smile Du musst das Zeitbasiert machen und nicht Framebasiert Smile
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 20:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 20:45    Titel: Antworten mit Zitat

3 Antworten, 3 Lösungen Wink

@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 Surprised
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 20:48    Titel: Antworten mit Zitat

Es geht um Zeit Wink Nicht um Framezählerrei Wink
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 19.07.2005, 20:52    Titel: Antworten mit Zitat

t10ottoo hat Folgendes geschrieben:
3 Antworten, 3 Lösungen Wink
@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 21:04    Titel: Antworten mit Zitat

@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 Wink
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 Sad
Ich kann doch nicht einfach die Zeitdifferenz nun mit -2 multiplizieren und dann auf y addieren, das bringt doch nichts Surprised
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 19.07.2005, 21:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 21:08    Titel: Antworten mit Zitat

http://www.jliforum.de/board/viewtopic.php?t=3633&highlight=tutorials

In den Tutorialcodes steht im GameStateManager der Code für die Zeitabfrage um die Deltatime zu bekommen, diese wird an die GameStates weitergegeben wo sie verarbetietet werden. Smile Blick lohnt sich Wink
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 21:57    Titel: Antworten mit Zitat

Soooo, nach einem knapp einstündigen Gespräch mit DirectXer hab ichs nu hinbekommen und verstehe auch die Funktion von Fallen Smile Ein großes Dankeschön an euch beiden Very Happy
Danke auch an Patrick und Jonathan. Wobei Jonathans Idee ja nun auch benutzt wird Wink

Also bis denne *Schildkröte zuschau, wie sie ausm Bildschirm schleicht* Wink
Otti
_________________
Meine kleine Projekte-Seite
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.07.2005, 22:38    Titel: Antworten mit Zitat

schön, hat ja nun doch noch geklappt. Viel spaß noch damit

Gruß DirectXer , ein ungewollter als Lehrer bezeichneter Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 20.07.2005, 10:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 20.07.2005, 10:31    Titel: Antworten mit Zitat

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 Wink naja, kannst die auch ändern, aber so ists doch ma was ganz anderes - nicht immer diese 0815-schleifen... Cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 20.07.2005, 11:26    Titel: Antworten mit Zitat

Jonathan_Klein
Na na na, sowas tut man aber nicht Wink Nur weil man sich so 1-2 Zeilen ersparen kann.
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum