I made realtime shadows for 2D games today:

Here is the code:
Code: Select all
ScreenRes 800,600,32
Dim As Integer mx,my
Const Rad2Deg=45.0/Atn(1)
CONST PI AS DOUBLE = ACOS(0)*2
Randomize
Dim As Integer cubex(4),cubey(4),cubexscale(4),cubeyscale(4),cubecolor(4,3),switch
Dim As Double cubeangle1(4),cubeangle2(4),cubeangle3(4),cubeangle4(4)
For i As Integer=1 To 4
cubex(i)=Rnd()*700+50
cubey(i)=Rnd()*500+50
cubexscale(i)=Rnd()*50+50
cubeyscale(i)=Rnd()*50+50
For i2 As Integer=1 To 3
cubecolor(i,i2)=128
Next
Next
Dim As Any Ptr floor=ImageCreate(800,600)
Line floor,(0,0)-(800,600),RGB(8,0,7),BF
For x As Integer=0 To 80
For y As Integer=0 To 60
If (x \ 4 + y \ 4) Mod 2 > 0 Then
switch=1
Else
switch=0
End If
If switch=1 Then Line floor,(x*10,y*10)-(x*10+10,y*10+10),RGB(255,255,255),BF
If switch=0 Then Line floor,(x*10,y*10)-(x*10+10,y*10+10),RGB(8,0,7),BF
Next
Next
Do
Getmouse mx,my
Sleep 1,1
ScreenLock
Cls
For i As Integer=1 To 4
cubeangle1(i)=ATan2(mx-cubex(i),my-cubey(i))*Rad2Deg
cubeangle2(i)=ATan2(mx-cubex(i)-cubexscale(i),my-cubey(i))*Rad2Deg
cubeangle3(i)=ATan2(mx-cubex(i)-cubexscale(i),my-cubey(i)-50)*Rad2Deg
cubeangle4(i)=ATan2(mx-cubex(i),my-cubey(i)-50)*Rad2Deg
Line (cubex(i),cubey(i))-(mx-Sin(cubeangle1(i)* PI / 180)*1000,my-Cos(cubeangle1(i)* PI / 180)*1000),RGB(0,0,255)
Line (cubex(i)+cubexscale(i),cubey(i))-(mx-Sin(cubeangle2(i)* PI / 180)*1000,my-Cos(cubeangle2(i)* PI / 180)*1000),RGB(0,0,255)
Line (cubex(i)+cubexscale(i),cubey(i)+cubeyscale(i))-(mx-Sin(cubeangle3(i)* PI / 180)*1000,my-Cos(cubeangle3(i)* PI / 180)*1000),RGB(0,0,255)
Line (cubex(i),cubey(i)+cubeyscale(i))-(mx-Sin(cubeangle4(i)* PI / 180)*1000,my-Cos(cubeangle4(i)* PI / 180)*1000),RGB(0,0,255)
Next
For i As Integer=1 To 4
Line (cubex(i),cubey(i))-(cubex(i)+cubexscale(i),cubey(i)+cubeyscale(i)),RGB(0,0,255),B
Next
Paint (mx,my),RGB(255,240,203),RGBA(0,0,255,255)
For i As Integer=1 To 4
Line (cubex(i),cubey(i))-(mx-Sin(cubeangle1(i)* PI / 180)*1000,my-Cos(cubeangle1(i)* PI / 180)*1000),RGB(8,0,7)
Line (cubex(i)+cubexscale(i),cubey(i))-(mx-Sin(cubeangle2(i)* PI / 180)*1000,my-Cos(cubeangle2(i)* PI / 180)*1000),RGB(8,0,7)
Line (cubex(i)+cubexscale(i),cubey(i)+cubeyscale(i))-(mx-Sin(cubeangle3(i)* PI / 180)*1000,my-Cos(cubeangle3(i)* PI / 180)*1000),RGB(8,0,7)
Line (cubex(i),cubey(i)+cubeyscale(i))-(mx-Sin(cubeangle4(i)* PI / 180)*1000,my-Cos(cubeangle4(i)* PI / 180)*1000),RGB(8,0,7)
Next
Put (0,0),floor,Alpha,20
For i As Integer=1 To 4
Line (cubex(i)+1,cubey(i)+1)-(cubex(i)+cubexscale(i)-1,cubey(i)+cubeyscale(i)-1),RGB(cubecolor(i,1),cubecolor(i,2),cubecolor(i,3)),BF
Next
ScreenUnlock
Loop Until Inkey=Chr(27)
End
You can move the light with the mouse. Have fun :)