Dark Bit Factory & Gravity
PROGRAMMING => Freebasic => Topic started by: Shockwave on August 15, 2009
-
I put this together because I wanted to show people how to make this very simple but great looking effect.
Exe attached.
'
' EXAMPLE USING TWO FAKE LIGHT SOURCED TWISTERS
' SHOWING HOW TO CODE THIS VERY SIMPLE BUT NICE EFFECT.
' BY SHOCKWAVE, WWW.DBFINTERACTIVE.COM
'===============================================================================
#INCLUDE "TINYPTC_EXT.BI"
#INCLUDE "WINDOWS.BI"
'===============================================================================
' THE PICTURE;
'===============================================================================
' FIXED SIZE ARRAYS DECLARE ALL VARIABLES;
OPTION STATIC
OPTION EXPLICIT
'===============================================================================
' LETS SET UP TINYPTC.
'===============================================================================
CONST XRES = 800:' WIDTH OF YOUR SCREEN
CONST YRES = 600:' HEIGHT OF YOUR SCREEN
'===============================================================================
' SCREEN BUFFER;
'===============================================================================
DIM SHARED AS UINTEGER BUFFER ( XRES * YRES )
DECLARE SUB DRAW_SLICE(BYVAL XP AS INTEGER ,BYVAL YP AS INTEGER, BYVAL SLICE AS INTEGER, BYVAL TC AS UINTEGER)
DECLARE SUB DRAWSECTION(BYVAL PASS AS DOUBLE, BYVAL XPASS AS INTEGER ,BYVAL YPASS AS INTEGER,BYVAL PLUS AS DOUBLE)
DECLARE SUB TWISTERS()
DIM SHARED AS DOUBLE OPX1(YRES)
DIM SHARED AS DOUBLE R2D
R2D=3.13/720
DIM SHARED AS DOUBLE RADDEG
RADDEG=3.14/360
'===============================================================================
' ACTUALLY OPEN THE SCREEN;
'===============================================================================
PTC_ALLOWCLOSE(0)
PTC_SETDIALOG(1,"DOUBLE TWISTERS"+CHR$(13)+"",0,1)
IF (PTC_OPEN("BY SHOCKWAVE/CODIGOS",XRES,YRES)=0) THEN
END-1
END IF
SLEEP 5
DIM SHARED AS DOUBLE T1,T2,DV,DOLD
'===============================================================================
' MAIN LOOP (UNTIL ESC OR LEFT MOUSE)
'===============================================================================
WHILE(GETASYNCKEYSTATE(VK_ESCAPE)<> -32767 and PTC_GETLEFTBUTTON=FALSE)
DOLD=TIMER
TWISTERS()
PTC_UPDATE@BUFFER(0)
'CLEAR THE SCREEN
SLEEP 1
ERASE BUFFER
DV=(((TIMER-DOLD)*10)+1)
T1=T1+DV
T2=T2+DV*3
WEND
EXITPROCESS(0)
END
SUB TWISTERS()
DIM Y AS INTEGER
DIM AS DOUBLE PX1,PX2,Q
FOR Y=0 TO YRES-1
Q=150*SIN((Y+T1)*.01)
PX1=200+129*SIN((Y+T1)*R2D)
PX2=200+ 30*COS((Y+T1+720)*R2D)
IF PX1>OPX1(Y) THEN
DRAWSECTION(Y-T2-Q,PX1,Y,1)
DRAWSECTION(Y+T2+Q,PX2,Y,.6)
ELSE
DRAWSECTION(Y+T2+Q,PX2,Y,.6)
DRAWSECTION(Y-T2-Q,PX1,Y,1)
END IF
OPX1(Y)=PX1
NEXT
END SUB
SUB DRAWSECTION(BYVAL PASS AS DOUBLE, BYVAL XPASS AS INTEGER ,BYVAL YPASS AS INTEGER,BYVAL PLUS AS DOUBLE)
DIM AS INTEGER X1,X2,X3,X4,TC,CL
X1=(120*SIN( PASS *RADDEG))+XPASS
X2=(120*SIN((PASS+180) *RADDEG))+XPASS
X3=(120*SIN((PASS+360)*RADDEG))+XPASS
X4=(120*SIN((PASS+540)*RADDEG))+XPASS
IF X2>X1 THEN
CL=X2-X1
DRAW_SLICE(X1+XPASS,YPASS,X2-X1,RGB(CL*.9,CL*.8,CL*PLUS))
END IF
IF X3>X2 THEN
CL=X3-X2
DRAW_SLICE(X2+XPASS,YPASS,X3-X2,RGB(CL*PLUS,CL*.9,CL*.8))
END IF
IF X4>X3 THEN
CL=X4-X3
DRAW_SLICE(X3+XPASS,YPASS,X4-X3,RGB(CL*.9,CL*.8,CL*PLUS))
END IF
IF X1>X4 THEN
CL=X1-X4
DRAW_SLICE(X4+XPASS,YPASS,X1-X4,RGB(CL*PLUS,CL*.9,CL*.8))
END IF
END SUB
SUB DRAW_SLICE(BYVAL XP AS INTEGER , BYVAL YP AS INTEGER, BYVAL SLICE AS INTEGER, BYVAL TC AS UINTEGER)
DIM PP AS UINTEGER PTR
PP=@BUFFER(XP+(YP*XRES))
'-----------------------------------------------------------------------
ASM
MOV EAX,dword ptr[TC]
MOV ECX, [SLICE]
MOV EDI, [PP]
REP STOSD
END ASM
'-----------------------------------------------------------------------
END SUB
Adding a texture to this is elementary, if there is call for it I'll add one.
-
Nice work shocky you never stop helping people out with your little code tricks.
Freebasic just keeps on amazing me too :goodpost:
-
Looks nice tho not sure about the cream color :D
-
Yep, the colours suck.
-
Shockwave i love you :P your sources are really great! K++