Ich programmiere seit ca. 1 Jahr an einem Spiel... aber jetzt brauche ich doch mal etwas Hilfe dabei.
Folgendes:
In dem Spiel gibt es eine Tag/Nacht-Simulation - soweit kein Problem!
Allerdings kann Nachts eine bestimmte Farbe auftauchen, welche nicht durch den "Dunkel-Filter" verdunkelt werden soll - Problem!
Ich könnte das Problem lösen, indem ich einen "Dunkel-Filter" via 'CustomFilterCallback()' auf die Szene anwende; und dabei diese bestimmte Farbe exkludiere.
ABER: Da das Ganze über die Drawing-Befehle läuft, wäre das für ein Spiel einfach zu langsam - da ja auch noch einiges an Berechnungen(v.a. Pathfinding) im Hintergrund läuft.
Daher die Frage, ob das auch mit den Sprite-Befehlen möglich wäre?
Ich dachte da an 'SpriteBlendingMode()' - habe aber keine Erfahrung damit und auch keinen Schimmer wie ich das anwenden soll.
Vielleicht gibt es ja auch noch andere Möglichkeiten, welche ich noch nicht entdeckt habe.
Wäre schön, wenn da jemand von Euch vielleicht einen Tipp oder Lösungsvorschlag hätte.
Danke, schon mal im Voraus
Burstnibbler(den Namen sollte ich wirklich mal langsam ändern)!
Der folgende Code hat mit dem Spiel nicht viel gemein, soll aber auch nur grob aufzeigen worum es geht.
Code: Alles auswählen
EnableExplicit
;
#WIN = 0
#WIN_W = 640
#WIN_H = 480
#WIN_T = "Filter"
#WIN_F = #PB_Window_ScreenCentered|#PB_Window_MinimizeGadget
;
#COL_TRANS = $FF00FF
#COL_EXCLD = $0000FF; Diese Farbe soll nicht gefiltert werden
#COL_BLACK = 0
;
#BAL_SIZE = 100
#BAL_HALF = 50
#BAL_IN = -#BAL_SIZE
#BAL_OUT = #WIN_W + #BAL_SIZE
#BAL_Y = (#WIN_H / 2) - #BAL_SIZE
;
#OBJ_W = 40
#OBJ_H = #WIN_H - 100
;
Enumeration
#SPR_BACK
#SPR_BALL
#SPR_FLTR
#SPR_OBJS
EndEnumeration
;
Define.i xOff = #BAL_IN
;
InitSprite()
OpenWindow(#WIN, 0, 0, #WIN_W, #WIN_H, #WIN_T, #WIN_F)
OpenWindowedScreen(WindowID(#WIN), 0, 0, #WIN_W, #WIN_H, #True, 0, 0)
;
CreateSprite(#SPR_BACK, #WIN_W, #WIN_H)
CreateSprite(#SPR_BALL, #BAL_SIZE, #BAL_SIZE)
CreateSprite(#SPR_FLTR, #WIN_W, #WIN_H, #PB_Sprite_AlphaBlending)
CreateSprite(#SPR_OBJS, #WIN_W, #WIN_H)
;
TransparentSpriteColor(#SPR_BALL, #COL_TRANS)
TransparentSpriteColor(#SPR_OBJS, #COL_TRANS)
;
StartDrawing(SpriteOutput(#SPR_BACK))
Box(0, 0, #WIN_W, #WIN_H, RGB($66, $99, 0))
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(RGB(0, $66, $FF))
FrontColor(RGB($66, $CC, $FF))
LinearGradient(#WIN_W / 2, 0, #WIN_W / 2, #WIN_H / 2)
Box(0, 0, #WIN_W, #WIN_H / 2)
StopDrawing()
;
StartDrawing(SpriteOutput(#SPR_BALL))
Box(0, 0, #BAL_SIZE, #BAL_SIZE, #COL_TRANS)
Circle(#BAL_HALF, #BAL_HALF, #BAL_HALF, RGB($99, $33, $33))
Circle(#BAL_HALF, #BAL_HALF, #BAL_HALF / 2, #COL_EXCLD); Innerer Kreis des Balls, hat die auszuschließende Farbe.
StopDrawing()
;
StartDrawing(SpriteOutput(#SPR_FLTR))
Box(0, 0, #WIN_W, #WIN_H, RGB($32, $32, $32))
StopDrawing()
;
StartDrawing(SpriteOutput(#SPR_OBJS))
Box(0, 0, #WIN_W, #WIN_H, #COL_TRANS)
Box(#OBJ_W, 0, #OBJ_W, #OBJ_H, RGB($66, $33, 0))
Box(#WIN_W / 2, -#OBJ_W, #OBJ_W, #OBJ_H, RGB($66, $33, 0))
Box(#WIN_W - (#OBJ_W * 2), 0, #OBJ_W, #OBJ_H, RGB($66, $33, 0))
StopDrawing()
;
;
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow : End
Case #Null : Break
EndSelect
ForEver
ClearScreen(#COL_BLACK)
DisplaySprite(#SPR_BACK, 0, 0)
DisplayTransparentSprite(#SPR_BALL, xOff, #BAL_Y)
DisplayTransparentSprite(#SPR_OBJS, 0, 0)
;SpriteBlendingMode();???
DisplayTransparentSprite(#SPR_FLTR, 0, 0, 160); "Dunkel-Filter" (welcher aber die Farbe '#COL_EXCLD' excludieren soll)
;SpriteBlendingMode();???
FlipBuffers()
xOff + 1
If (xOff > #BAL_OUT) : xOff = #BAL_IN : EndIf
Delay(16)
ForEver
;