Dieser Code zeichnet ein Oval das eine Lichtquelle darstellen könnte.
NewOval( Xpos, Ypos, RadiusX, RadiusY, Modus, Stärke#, Bufferbreite, Bufferhöhe )
Die Grünen Parameter müssen immer angegeben werden. *pos bezeichnet den Mittelpunkt des Ovals, Radius* sind die Radien die das Oval in die jeweilige Richtung hat.
Die orangen Parameter sind dann anzugeben, wenn man andere RGB Modi haben möchte. Mit Stärke könnt ihr dann die Stärke der RGB-Modi einstellen(nur Modus 1 und 2).
Modus 0: Nicht transparentes Oval, Fadet zu Schwarz
Modus 1: Teiltransparentes Oval, wird nicht addiert
Modus 2: Transparentes Oval, wird addiert, Kanäle mit Overflow werden zu den anderen addiert.
Die Roten Parameter müsst ihr dann angeben, wenn ihr nicht auf den Backbuffer() oder FrontBuffer() zeichnet.
MixRGB( RGBA1, RGBA2, Stärke# )
Hiermit kann man zwei RGBA Werte mixen. Stärke bestimmt wie dominierend RGBA1 über RGBA2 ist.
AddRGB( RGBA1, Stärke#, RGBA2 )
Hiermit kann man zwei RGBA Werte addieren. Stärke bestimmt wie stark RGBA1 zu RGBA2 addiert wird.
Überschuss in einem der RGB Kanäle führt dazu, dass der Überschuss zu den anderen Kanälen addiert wird. Ausgeschlossen vom Überschuss ist der Alpha-Kanal
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1) R = ColorRed():G = ColorGreen():B = ColorBlue() If BW=-1 Then BW=GraphicsWidth() If BH=-1 Then BH=GraphicsHeight() If X-RX > BW Then Return If Y-RY > BH Then Return LockBuffer For NX = -RX To RX PX = NX+X If PX >= 0 And PX < BW For NY = -RY To RY PY = NY+Y If PY >= 0 And PY < BH Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY)) If Dist# >= 0 If Mode = 1 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = MixRGB(RGB,BRGB,Dist#*Strength) ElseIf Mode = 2 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = AddRGB(RGB,Dist#*Strength,BRGB) Else RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist EndIf WritePixelFast PX,PY,RGB EndIf EndIf Next EndIf Next UnlockBuffer End Function
Function Distance2#(x1#,y1#,x2#,y2#) Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) End Function
Function MixRGB(I1,I2,D#) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D)) Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3 End Function
Function AddRGB(I1,D#,I2) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2 Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0) Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255) R4 = Max(R4+T43+T44,255) G4 = Max(G4+T42+T44,255) B4 = Max(B4+T42+T43,255) Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4 End Function
Function Max(Cr#,Mx#) If Cr > Mx Then Return Mx Return Cr End Function Function Min(Cr#,Mn#) If Cr < Mn Then Return Mn Return Cr End Function
So kann es dann aussehen:
Modus 0:
Modus 1:
Modus 2:
Beispielcode:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Graphics 800,600,32,2 SetBuffer BackBuffer() SeedRnd MilliSecs()
Timer = CreateTimer(60) Cls
Local X# = 0, Y# = 0, XVel# = 2, YVel# = 0 Color Rand(0,255),Rand(0,255),Rand(0,255)
While Not KeyHit(1) X = X + XVel# Y = Y - YVel# If Y+50 > GraphicsHeight() YVel# = -YVel*0.99 XVel# = XVel#*1.01 Color Rand(0,255),Rand(0,255),Rand(0,255) Else YVel# = YVel# - 0.25 EndIf If X-50 > GraphicsWidth() X = 0 Y = 0 YVel = 0 XVel# = Rnd(1,5) Mode = Rand(0,2) Color Rand(0,255),Rand(0,255),Rand(0,255) EndIf NewOval(X,Y,50,50,Mode,0.25) NewOval(800-X,Y,50,50,Mode,0.25) NewOval(X,600-Y,50,50,Mode,0.25) NewOval(800-X,600-Y,50,50,Mode,0.25) Flip 0 WaitTimer Timer Wend
Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1) R = ColorRed():G = ColorGreen():B = ColorBlue() If BW=-1 Then BW=GraphicsWidth() If BH=-1 Then BH=GraphicsHeight() If X-RX > BW Then Return If Y-RY > BH Then Return LockBuffer For NX = -RX To RX PX = NX+X If PX >= 0 And PX < BW For NY = -RY To RY PY = NY+Y If PY >= 0 And PY < BH Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY)) If Dist# >= 0 If Mode = 1 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = MixRGB(RGB,BRGB,Dist#*Strength) ElseIf Mode = 2 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = AddRGB(RGB,Dist#*Strength,BRGB) Else RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist EndIf WritePixelFast PX,PY,RGB EndIf EndIf Next EndIf Next UnlockBuffer End Function
Function Distance2#(x1#,y1#,x2#,y2#) Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) End Function
Function MixRGB(I1,I2,D#) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D)) Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3 End Function
Function AddRGB(I1,D#,I2) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2 Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0) Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255) R4 = Max(R4+T43+T44,255) G4 = Max(G4+T42+T44,255) B4 = Max(B4+T42+T43,255) Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4 End Function
Function Max(Cr#,Mx#) If Cr > Mx Then Return Mx Return Cr End Function Function Min(Cr#,Mn#) If Cr < Mn Then Return Mn Return Cr End Function
Noch ein Beispielcode:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Graphics 800,600,32,2 SetBuffer BackBuffer() SeedRnd MilliSecs()
Timer = CreateTimer(60) Cls
While Not KeyHit(1) A# = (A# + 5) Color 0,0,255:NewOval(A Mod 800,300+Cos(a)*200,100,100,2,0.1) Color 255,0,0:NewOval((A-50) Mod 800,300+Cos(a)*200,100,100,2,0.1) Color 0,255,0:NewOval((A-100) Mod 800,300+Cos(a)*200,100,100,2,0.1) Flip 0 WaitTimer Timer Wend
Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1) R = ColorRed():G = ColorGreen():B = ColorBlue() If BW=-1 Then BW=GraphicsWidth() If BH=-1 Then BH=GraphicsHeight() If X-RX > BW Then Return If Y-RY > BH Then Return LockBuffer For NX = -RX To RX PX = NX+X If PX >= 0 And PX < BW For NY = -RY To RY PY = NY+Y If PY >= 0 And PY < BH Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY)) If Dist# >= 0 If Mode = 1 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = MixRGB(RGB,BRGB,Dist#*Strength) ElseIf Mode = 2 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = AddRGB(RGB,Dist#*Strength,BRGB) Else RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist EndIf WritePixelFast PX,PY,RGB EndIf EndIf Next EndIf Next UnlockBuffer End Function
Function Distance2#(x1#,y1#,x2#,y2#) Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) End Function
Function MixRGB(I1,I2,D#) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D)) Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3 End Function
Function AddRGB(I1,D#,I2) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2 Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0) Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255) R4 = Max(R4+T43+T44,255) G4 = Max(G4+T42+T44,255) B4 = Max(B4+T42+T43,255) Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4 End Function
Function Max(Cr#,Mx#) If Cr > Mx Then Return Mx Return Cr End Function Function Min(Cr#,Mn#) If Cr < Mn Then Return Mn Return Cr End Function
Dritter Beispielcode, wie sowas im fullscreen aussehen könnte(Mit Mesh/Surface/Vertex modification seid ihr da besser dran):
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Graphics3D 1024,768,32,2 Graphics3D 200,150,32,3 SetBuffer BackBuffer() SeedRnd MilliSecs()
cam = CreateCamera():light = CreateLight(1,cam)
ter = CreateTerrain(64):PositionEntity ter,-128,0,-128 For Z = 0 To 16 For X = 0 To 63 For Y = 0 To 63 ModifyTerrain ter,X,Y,TerrainHeight(ter,X,Y)+Rand(-51,51) Next Next Next
For Z = 0 To 3 For X = 0 To 63 For Y = 0 To 63 ModifyTerrain ter,X,Y,(TerrainHeight(ter,X-1,Y)+TerrainHeight(ter,X,Y-1)+TerrainHeight(ter,X+1,Y)+TerrainHeight(ter,X,Y+1)+TerrainHeight(ter,X,Y))/5.0 Next Next Next
TerrainDetail ter,24000,1 TerrainShading ter,True ScaleEntity ter,4,64,4
Tex = CreateTexture(128,128,8) SetBuffer TextureBuffer(tex) LockBuffer For X = 0 To 127 For Y = 0 To 127 WritePixelFast X,Y,Rand(0,127) Shl 16 + Rand(127,255) Shl 8 + Rand(0,127) Next Next UnlockBuffer SetBuffer BackBuffer()
EntityTexture ter,tex ScaleTexture tex,2,2 cube = CreateSphere(32):PositionEntity cube,0,TerrainY(ter,0,0,0),0 ScaleEntity cube,2,1,2 t = CreateCube(cube):ScaleEntity t,0.5,1,0.5 CameraClsColor cam,255,127,0
t = CreateSphere(16,cube):MoveEntity t,5,5,0:HideEntity t
t2 = CreateCube() Timer = CreateTimer(60)
Dither 1 AntiAlias 1
While Not KeyHit(1) Cls TurnEntity cube,.1,1,.5 PositionEntity t2,EntityX(t,1),TerrainY(ter,EntityX(t,1),EntityY(t,1),EntityZ(t,1)),EntityZ(t,1) RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 If KeyDown(17) Then MoveEntity cam,0,0,1 If KeyDown(31) Then MoveEntity cam,0,0,-1 PositionEntity cam,EntityX(cam),TerrainY(ter,EntityX(cam),0,EntityZ(cam))+6,EntityZ(cam) If MouseHit(1) Then bloom=1-bloom WireFrame MouseDown(2) RenderWorld If bloom = 1 Then BloomBuffer() Flip 0 WaitTimer Timer Wend
Function BloomBuffer(BW=-1,BH=-1) If BW=-1 Then BW=GraphicsWidth() If BH=-1 Then BH=GraphicsHeight() LockBuffer For X = 0 To BW+8 Step 8 For Y = 0 To BH+6 Step 6 RGB = ReadPixelFast(X,Y) R = RGB Shl 8 Shr 24:G = RGB Shl 16 Shr 24:B = RGB Shl 24 Shr 24 If R > 153 Or G > 153 Or B > 153 RBloom = Min(R-153,0):GBloom = Min(G-153,0):BBloom = Min(B-153,0) Color RBloom,GBloom,BBloom NewOval(X,Y,8,6,2,0.25,BW,BH) EndIf Next Next UnlockBuffer End Function
Function NewOval(X,Y,RX,RY,Mode=0,Strength#=1,BW=-1,BH=-1) R = ColorRed():G = ColorGreen():B = ColorBlue() If BW=-1 Then BW=GraphicsWidth() If BH=-1 Then BH=GraphicsHeight() If X-RX > BW Then Return If Y-RY > BH Then Return For NX = -RX To RX PX = NX+X If PX >= 0 And PX < BW For NY = -RY To RY PY = NY+Y If PY >= 0 And PY < BH Dist# = 1-Distance2(0,0,NX/Float(RX),NY/Float(RY)) If Dist# >= 0 If Mode = 1 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = MixRGB(RGB,BRGB,Dist#*Strength) ElseIf Mode = 2 RGB = R Shl 16 + G Shl 8 + B:BRGB = ReadPixelFast(PX,PY) RGB = AddRGB(RGB,Dist#*Strength,BRGB) Else RGB = R*Dist Shl 16 + G*Dist Shl 8 + B*Dist EndIf WritePixelFast PX,PY,RGB EndIf EndIf Next EndIf Next End Function
Function Distance2#(x1#,y1#,x2#,y2#) Return Sqr((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) End Function
Function MixRGB(I1,I2,D#) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 A3 = (A1*D+A2*(1-D)):R3 = (R1*D+R2*(1-D)):G3 = (G1*D+G2*(1-D)):B3 = (B1*D+B2*(1-D)) Return A3 Shl 24 + R3 Shl 16 + G3 Shl 8 + B3 End Function
Function AddRGB(I1,D#,I2) Local A1 = I1 Shr 24, R1 = I1 Shl 8 Shr 24, G1 = I1 Shl 16 Shr 24, B1 = I1 Shl 24 Shr 24 Local A2 = I2 Shr 24, R2 = I2 Shl 8 Shr 24, G2 = I2 Shl 16 Shr 24, B2 = I2 Shl 24 Shr 24 If D < 0 Then D = 0 If D > 1 Then D = 1 Local A3 = A1*D+A2 ,R3 = R1*D+R2 ,G3 = G1*D+G2 ,B3 = B1*D+B2 Local T41 = Abs(A3-255) ,T42 = Min(R3-255,0) ,T43 = Min(G3-255,0) ,T44 = Min(B3-255,0) Local A4 = Max(A3,255) ,R4 = Max(R3,255) ,G4 = Max(G3,255) ,B4 = Max(B3,255) R4 = Max(R4+T43+T44,255) G4 = Max(G4+T42+T44,255) B4 = Max(B4+T42+T43,255) Return A4 Shl 24 + R4 Shl 16 + G4 Shl 8 + B4 End Function
Function Max(Cr#,Mx#) If Cr > Mx Then Return Mx Return Cr End Function Function Min(Cr#,Mn#) If Cr < Mn Then Return Mn Return Cr End Function
|