Seite 1 von 3

Regen

Verfasst: 11.12.2008 09:08
von Dare Devil
Welche Moeglichkeiten gibt es, Regen moeglichst realistisch (durchsichtig) in einem 2D-JumpnRun darzustellen?
Hat jemand Tipps?

Verfasst: 11.12.2008 11:14
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.

Verfasst: 11.12.2008 11:38
von ZeHa
Ich glaube unter Donkey Kong Country gab's im zweiten Level Regen, das könntest Du Dir mal als Inspiration anschauen.

Verfasst: 12.12.2008 01:20
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

Verfasst: 12.12.2008 10:09
von Rings
sehr nett, gefällt mir gut

Verfasst: 12.12.2008 10:43
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 

Verfasst: 12.12.2008 13:15
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 ...

Verfasst: 12.12.2008 15:07
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...

Verfasst: 12.12.2008 15:26
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)

Verfasst: 12.12.2008 15:27
von Kaeru Gaman
... wobei ein Haufen 2D sprites immer noch schneller ist als wenn man Draw benutzt ...