Regen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Regen

Beitrag von Dare Devil »

Welche Moeglichkeiten gibt es, Regen moeglichst realistisch (durchsichtig) in einem 2D-JumpnRun darzustellen?
Hat jemand Tipps?
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

n_n"

also, meistens ist der regen bei 2D games nicht wirklich durchsichtig,
sondern ein sprite bei dem nur die umrisse gezeichnet werden,
eben in weiß oder grau oder so.
meistens nur kleine striche, die quer über den screen bewegt werden.

du könntest zwar runde bzw. tropfenförmige tropfen als Sprite3D erstellen,
und die mit dem entsprechenden BlendingMode drüberzeichnen,
dass sie halb durchsichtig erscheinen,
aber ob das dann besser aussieht wage ich zu bezweifeln.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ich glaube unter Donkey Kong Country gab's im zweiten Level Regen, das könntest Du Dir mal als Inspiration anschauen.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

hier mal n Beispielcode von mir...

da fällt regen und "spritzt" auf dem Boden auch ^^

das kann man natürlich noch verbessern :roll:

Code: Alles auswählen

InitSprite()

xP = 800
yP = 600
xP2 = xP/2
yP2 = yP/2

OpenWindow(0, 0, 0, xP, yP, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, xP, yP, 0, 0, 0)
 
 CreateSprite(1, 20, 20)
 StartDrawing(SpriteOutput(1))
  Line(0,0,2,6,$504040)
  Line(2,6,2,6,$807070)
  Line(4,12,2,6,$B0A0A0)
  Line(3,12,2,6,$807070)
 StopDrawing()
 CreateSprite(2, 20, 20)
 StartDrawing(SpriteOutput(2))
  Line(6,18,-5,-8,$A08080)
  Line(6,18,-2,-10,$A08080)
  Line(6,18,1,-12,$A08080)
  Line(6,18,3,-7,$A08080)
 StopDrawing()
  
Structure Tropfen
 x.f
 y.f
 v.f
EndStructure

NewList Tropfen.Tropfen()

 
Repeat

 Event = WindowEvent()

 ClearScreen(0)

   For n = 1 To 3
   AddElement(Tropfen())
   Tropfen()\x = Random(xP2*3)-xP2
   Tropfen()\y = -32 
   Tropfen()\v = Random(5)/10+2
  Next
 
  ForEach Tropfen() : With Tropfen()
   \x + 1*\v
   \y + 3*\v
   If \y > 582 :
    DisplayTransparentSprite(2, \x, 582)
    \x - 1*\v
   EndIf
   DisplayTransparentSprite(1, \x, \y)
   If \y > 600 : DeleteElement(Tropfen()) : EndIf
  EndWith : Next
 
 FlipBuffers()

Until Event = #PB_Event_CloseWindow
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

sehr nett, gefällt mir gut
Rings hat geschrieben:ziert sich nich beim zitieren
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Perfekt!
Wenn du nichts dagegen hast uebernehme ich diesen Regen fuer mein Spiel.

edit:

Hab den Code nun zo verbessert, dass jede Aufloesung verwendbar ist, sie muss nur oben bei xP und yP veraendert werden:

Code: Alles auswählen

InitSprite()
InitSprite3D()

xP = 800 
yP = 500 
xP2 = xP/2 
yP2 = yP/2 

OpenWindow(0, 0, 0, xP, yP, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(0), 0, 0, xP, yP, 0, 0, 0) 
  
 CreateSprite(1, 20, 20) 
 StartDrawing(SpriteOutput(1)) 
  Line(0,0,2,6,$504040) 
  Line(2,6,2,6,$807070) 
  Line(4,12,2,6,$B0A0A0) 
  Line(3,12,2,6,$807070) 
 StopDrawing() 
 CreateSprite(2, 20, 20) 
 StartDrawing(SpriteOutput(2)) 
  Line(6,18,-5,-8,$A08080) 
  Line(6,18,-2,-10,$A08080) 
  Line(6,18,1,-12,$A08080) 
  Line(6,18,3,-7,$A08080) 
 StopDrawing() 
  
Structure Tropfen 
 x.f 
 y.f 
 v.f 
EndStructure 

NewList Tropfen.Tropfen() 

  
Repeat 

 Event = WindowEvent() 

 ClearScreen(0) 

   For n = 1 To 3 
   AddElement(Tropfen()) 
   Tropfen()\x = Random(xP2*3)-xP2 
   Tropfen()\y = -32 
   Tropfen()\v = Random(5)/10+2 
  Next 
  
  ForEach Tropfen() : With Tropfen() 
   \x + 1*\v 
   \y + 3*\v 
   If \y > yP - 18 : 
    DisplayTransparentSprite(2, \x, yP-18) 
    \x - 1*\v 
   EndIf 
   DisplayTransparentSprite(1, \x, \y) 
   If \y > yP : DeleteElement(Tropfen()) : EndIf 
  EndWith : Next 
  
 FlipBuffers()

Until Event = #PB_Event_CloseWindow 
Bild + Bild

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo nimm ruhig, dafür habe ich ihn ja gecodet

Achso:

Ich habe ihn natürlich nicht in "aktion" geschreiben, soll heißen, da es sehr viele Sprites sind die da Displayt werden, könnte es irgendwann laggen ...

Lösungen wäre :
Alle in Sprite3D zu machen, und dann in Start3D() einzubinden, das wäre vllt schneller.
Sprite3D solltest du ja dann eh verwenden wenn du den Regen noch halbtransparent haben willst ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag von Dare Devil »

Heisst das, wenn ich andere 2D-Sprites in meinem Spiel benutzt diese laggen? :o
Sollte man generell nur 3D-Sprites fuer Spiele benutzen?

Benutze eigtl.ur 2D-Sprites und wollte dies eigtl. durch SpecialFX() und DisplayTranslucentSprite() machen - aber ne Konvertierung durch 3D-Sprites wuerde auch gehn. Fragt sich nur wie ich das alles miteinander verbinde...
Bild + Bild

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

SpecialFX( ist unglaublich langsam (im gegensatz zu Start3D)

Und da DisplaySprite3D eh einen transparentswert hat, wäre das auf jedenfall sinnvoller.

Sprite3D heißt ja nicht unbedingt das du 3D hast, es ist nur schneller weil es DX7 verwendet.

Mein Rat: Mache alle Sprite2D zu Sprite3D (und halt die Start3D() sache mit einbauen)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

... wobei ein Haufen 2D sprites immer noch schneller ist als wenn man Draw benutzt ...
Zuletzt geändert von Kaeru Gaman am 12.12.2008 16:12, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten