JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=c9f30749e0e53c9b3b1fd66eccaab589Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Aktionen für best. Zeit lang ausführen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 27.05.2004, 19:00    Titel: Aktionen für best. Zeit lang ausführen Antworten mit Zitat

Hallo ihr Lieben,

bin grad dabei, einen Gewittereffekt zu progg0rn.
Mein Prob ist, dass diese Sequenz ja nur für so ca. 2 sekunden zu sehn sein soll.
Bisherige Experimente mit einem Timer sind bei mir fehlgeschlagen, es sei dahingestellt, ob es sich um falsche Handhabung oder Logikfehler handelte =(


Ich verwende diese Art des Framehandlings:
Code:

      
QueryPerformanceCounter((LARGE_INTEGER*)&CurCount);
           
           
if(CurCount > NextFrame)
{
         
RManager.Update();
   
if(CurCount - LastCount > Frequency)
{

LastCount = CurCount;
Framerate = Frames;
Frames = 0;

if(0 == Framerate)
{
Framerate = 1;
}

}
   
else
{
Frames++;
}

// ...


btw:
wie würdet ihr das realisieren? würdet ihr eine liste durchgehen, in der die einzelnen animationsschritte gespeichert sind oder würdet ihr das auch lediglich so machen, dass eine über den bildschirm gelegte bitmap nur in ihrem alphawert geändert wird und so einen blitzeffekt erzeugt?
letzteres hab ich in groben zügen scho probiert, bloss sind meine bitmaps, die ich mit photoshop komplett weiss gemacht habe, im game schwarz o_O
soll heissen wenn ich deren alphawert verändere, so verdunkelt sich der bildschirm als ob man an der helligkeit schrauben würde...

MFG
#C
_________________
Schau mir in die Augen, Kleines.
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: 27.05.2004, 19:10    Titel: Antworten mit Zitat

Ich würd ein Objekt machen, mit einem Counter und das dann anzeigen. Denn Counter entsprechend der Framerate verändern:
fCounter-=1/Framerate
und wenn er 0 erreicht hat nicht mehr anzeigen.
Zusätzlich könnte man natürlich noch die Transparenz abhängig vom Counterwert machen.
Wenn die Bilder im Spiel schwarz sind, liegt das wahrschienlich am ColorKey. Natürlich muss man darauf achten, dass man nicht den Alphakanal des kompletten Bildes ändert, weil man dann ja die Umrisse und nicht nur den Blitz hätte. Du könntest den Colorkey in ner Schleife und nur von bestimmten Pixeln ändern, also einen manuellen Colorkey in Echtzeit. Dürfte allerdings rechenintensiv sein.
Ansonsten kannst du den Blitz ja auch einfach direkt zeichenn, ohne Bild. Mit irgendeinem netten Algortihmus Wink . Dann hättest du auch ein bischen mehr abwechslung. Ist natürlich schwerer.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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: 27.05.2004, 19:13    Titel: Antworten mit Zitat

So ganz verset ich deine Frage nicht. Aber ich versuchs trotzdem mal.

Ich würde mir die Zeit in Millisekunden speichern wie lange der Effekt bestehen soll. und bei jedem Frame ziehe ich von diesem Wert die deltaZeit zwischen den Frames ab. Sollte der Zeitwert unter/gleich 0 fallen wird der Effekt gelöscht oder unsichtbar geschaltet.
_________________
"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
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 28.05.2004, 20:19    Titel: Antworten mit Zitat

Jo, ich danke euch (:

mein blitzeffekt beschränkt sich übrigens erst mal nur auf ein schnelles Hellwerden des Bildschirmes, also einer weissen Bitmap die mittels alphablending sehr schnell ein- und dann wieder ausgeblendet wird.

hab das jetz erst mal so gemacht:
Code:

if(CurCount - LastCount > Frequency)
            {
                   // Wenn ja, enthält Frames die
               // aktuelle Framerate
               LastCount = CurCount;
               Framerate = Frames;
               Frames = 0;
               
                  

               if(0 == Framerate)
               {
                       Framerate = 1;
               }
            }
            // ansonsten Frames erhöhen
            else
            {
                   if(CurCount - LastCount > Frequency/10)
                  if(time > 0)
                  {
                     time -= 20;
                     white.SetAlpha(time);
                  }


               Frames++;
            }


ich hab den else zweig insoweit geändert dass ich jede zehntelsekunde den alphawert der bitmap ändere. time -= 20 muss insofern sein, weil sonst die zehntelsekunde doppel solange ablaufen, wie es sein sollte. warum des so ist, weiss ich net...
jetz muss ich nur noch herausfinden wie man dieses kleine event am besten "verpackt" ^^
_________________
Schau mir in die Augen, Kleines.
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: 28.05.2004, 21:33    Titel: Antworten mit Zitat

Ich würd das ganze ja in ne Klasse mit den folgenden Funktionen packen:
Start();
Render();
Move(int Framerate);

Render rufts du immer wärend der ganz normalen Render Funktion des Spiels auf. Move in der Move funktion des Spiels, (oder eben sonst wo in der Gameloop, aber man sollte Move() immer von Render() trennen).
Die move Funtkktion zählt das opbjektelement Counter runter (anhand der Framerate) und setzt den Alphawert des Bildes auf den Counter (muss dann natürlich entsprechen multipliziert werden).
Die Start-Methode setzt den Countetr auf 20. Hat der Counter durch die Move Funktion 0 erreicht, zeigt die Render funktion auch nichts mehr an. (entweder wegen den zu hoen Alphawert, oder noch bessser, weils durch ne Abfrage übersprungen wird, ist noch schneller)

Ich hoffe du kannst das da oben jetz verstehen, sonst muss ichs nochmal neu schreiben.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 28.05.2004, 23:25    Titel: Antworten mit Zitat

Move und Render hab ich bei mir sowieso getrennt Wink

Ich hab ja mein Problem, was ich hier geschildert habe, ja bereits gelöst bekommen (:
thx an alle dafür.

MFG
#C
_________________
Schau mir in die Augen, Kleines.
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: 29.05.2004, 08:12    Titel: Antworten mit Zitat

Zyrian hat Folgendes geschrieben:
jetz muss ich nur noch herausfinden wie man dieses kleine event am besten "verpackt" ^^

Darum dacht ich halt, nochmal etwas posten zu müssen
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 29.05.2004, 16:01    Titel: Antworten mit Zitat

hab ja auch nix böses gemeint mit meiner antwort (:
_________________
Schau mir in die Augen, Kleines.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JoeyRamone
Mini JLI'ler



Anmeldedatum: 24.05.2004
Beiträge: 15
Wohnort: Schmallenberg
Medaillen: Keine

BeitragVerfasst am: 29.05.2004, 22:48    Titel: Antworten mit Zitat

Statt den Alphawert einer weißen Bitmap zu ändern solltest du lieber die Farben der einzelnen Pixel im Backbuffer ändern, sobald alles reingezeichnet ist. Du sperrst den dann eifach über Lock(), liest die Farbe jedes einzelnen Pixels aus und mischt die dann mit der Farbe des Blitzes (z.B. weiss oder blau), wobei du vorher festlegen musst, was welchen Anteil hat, da drüber steuerst du die Intensität. Sähe als Code ca. so aus:

Code:

DDSURFACEDESC2 ddsd;
DWORD dwColor,dwNewColor;
...
lpDDSBackBuffer->Lock(NULL,ddsd,usw.);

// Die einzelnen Farben auslesen, ich geh mal von 16Bit aus
for(int i = 0;i < SCREEN_WIDTH * SCREEN_HEIGHT;i++)
{
memcpy(&dwColor,&ddsd.lpBuffer[i * 2],2); // Heißt nicht lpBuffer, muss //du mal nachsehn
dwNewColor = (dwColor * (1 / AnteilBuffer)) + (dwFlashColor * (1 / AnteilBlitz));
// Das musst du natürlich für die einzelnen Farben machen!

memcpy(&ddsd.lpBuffer[i * 2],&dwNewColor,2);
// das ganze noch zurückkopieren
}

lpDDSBackBuffer->Unlock();


Sieht recht kompliziert aus, ist aber im Prinzip ganz einfach.
Du musst nur den Farbanteil der Blitzfarbe ändern und die Funktion nach dem rendern jedes Frames einmal aufrufen.
Der Anteil könnte z.B. prozentual sein, und der Anteil der Bufferfarbe wäre dann immer sie Differenz zwischen 100 und dem Blitzanteil.
Man könnte das ganze noch ein bisschen optimieren, indem man es mit Assembler schreibt, aber da müsst ich jetz erst mal kurz drüber nachdenken...
Ich hoffe nur, dass ich jetzt keinen Fehler eingebaut hab! Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 30.05.2004, 09:48    Titel: Antworten mit Zitat

hm, schlägt diese vorgehensweise nicht ein wenig mehr auf die performance als nur mit einer bitmap zu arbeiten?

die intensität des blitzes (wenn ich richtig verstanden hab, was du unter intensität verstehst) lässt sich bei mir über den Colorkey regeln, den ich modifiziere und somit eine verstärkung bzw. verdunkelung der gesamten blitzintensität regeln kann (:
_________________
Schau mir in die Augen, Kleines.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JoeyRamone
Mini JLI'ler



Anmeldedatum: 24.05.2004
Beiträge: 15
Wohnort: Schmallenberg
Medaillen: Keine

BeitragVerfasst am: 30.05.2004, 14:47    Titel: Antworten mit Zitat

Naja, ich weiss nicht genau, wie schnell das mit Colorkey läuft, aber ich könnte mir vorstellen, dass da das eigentliche Bild nicht ganz richtig wiedergegeben wird. Wenn du den Alphawert der Bitmap ändern würdest, wäre das das gleiche, nur brauchst du mit meinem Code weder eine Bitmap zu speichern noch die zu blitten. Da meins allerdings über Software läuft, könnte es tatsächlich langsamer sein, da du nicht die schnellere Grafikhardware ausnutzt. Confused Aber ich schätze, wenn die Auflösung nicht zu hoch ist, läufts immer noch recht flott, und die Farben im Buffer werden korrekt verändert, so dass du die Landschaft oder so noch durch die Blitzfarbe sehen kannst. Idea Denn über dne Colorkey regelst du nicht die Intensität, sondern legst nur fest, welche Farben beim Blitten rausgenommen werden sollen, was meiner Meinung nach dazu führt, dass du an einigen Stellen helle Pixel hast, während andere noch dunkel sind.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 30.05.2004, 16:02    Titel: Antworten mit Zitat

der colorkey bestimmt in meinem beispiel, wie "weiß" der blitz ist.
die weisse bitmap ist ja gar net zu sehn, halt nur wenn der alphawert geändert wird.
das eigentliche bild wird immer korrekt dargestellt (es ist ja sowieso ein wenig sandig weil der regeneffekt ja noch drüberläuft Wink).
_________________
Schau mir in die Augen, Kleines.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
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