|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 27.05.2004, 19:00 Titel: Aktionen für best. Zeit lang ausführen |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.05.2004, 19:10 Titel: |
|
|
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 . Dann hättest du auch ein bischen mehr abwechslung. Ist natürlich schwerer. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.05.2004, 19:13 Titel: |
|
|
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 |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 28.05.2004, 20:19 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 28.05.2004, 21:33 Titel: |
|
|
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 |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 28.05.2004, 23:25 Titel: |
|
|
Move und Render hab ich bei mir sowieso getrennt
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 29.05.2004, 08:12 Titel: |
|
|
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 |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
|
Nach oben |
|
|
JoeyRamone Mini JLI'ler
Anmeldedatum: 24.05.2004 Beiträge: 15 Wohnort: Schmallenberg Medaillen: Keine
|
Verfasst am: 29.05.2004, 22:48 Titel: |
|
|
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! |
|
Nach oben |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 30.05.2004, 09:48 Titel: |
|
|
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 |
|
|
JoeyRamone Mini JLI'ler
Anmeldedatum: 24.05.2004 Beiträge: 15 Wohnort: Schmallenberg Medaillen: Keine
|
Verfasst am: 30.05.2004, 14:47 Titel: |
|
|
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. 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. 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 |
|
|
Zyrian Super JLI'ler
Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 30.05.2004, 16:02 Titel: |
|
|
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 ). _________________ Schau mir in die Augen, Kleines. |
|
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
|