Author Topic: Double Twisters  (Read 3548 times)

0 Members and 1 Guest are viewing this topic.

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17414
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Double Twisters
« 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.

Code: [Select]
'

' 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.
« Last Edit: September 07, 2009 by Shockwave »
Shockwave ^ Codigos
Challenge Trophies Won:

Offline Dr.Death

  • Senior Member
  • Amiga 1200
  • ********
  • Posts: 445
  • Karma: 9
    • View Profile
Re: Double Twisters
« Reply #1 on: August 15, 2009 »
Nice work shocky you never stop helping people out with your little code tricks.
Freebasic just keeps on amazing me too  :goodpost:
Proud member of DAWN

Offline TinDragon

  • Pentium
  • *****
  • Posts: 644
  • Karma: 24
    • View Profile
    • J2K's blog
Re: Double Twisters
« Reply #2 on: August 15, 2009 »
Looks nice tho not sure about the cream color  :D

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17414
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Re: Double Twisters
« Reply #3 on: August 15, 2009 »
Yep, the colours suck.
Shockwave ^ Codigos
Challenge Trophies Won:

Offline va!n

  • Pentium
  • *****
  • Posts: 1435
  • Karma: 109
    • View Profile
    • http://www.secretly.de
Re: Double Twisters
« Reply #4 on: August 15, 2009 »
Shockwave i love you :P your sources are really great! K++
- hp EliteBook 8540p, 4 GB RAM, Windows 8.1 x64
- Asus P5Q, Intel Q8200, 6 GB DDR2, Radeon 4870, Windows 8.1 x64
http://www.secretly.de
Challenge Trophies Won: