July 13, 2024, 07:05:18 PM

## News:

IWBasic runs in Windows 11!

## Fireworks

Started by Steven Picard, November 26, 2006, 05:16:58 PM

0 Members and 1 Guest are viewing this topic.

#### Steven Picard

##### November 26, 2006, 05:16:58 PM
This was originally written by Fletchie and modified by Boris (where are you?)  I got this from the off-line forum (any chance of making it available again since that info is now useful?) The code worked like a charm right away:
`autodefine "off" def fps,ext:int def t,n,nn:int type pixel    def x:float    def y:float    def c:int endtype const total=10000def test[total]:pixel def vx[total]:float def vy[total]:float def an,x,y:floatcreatescreen 640,480,32 for t=1 to 200   /* A bit of a delay for screen warm-up */    fillscreen 0    flip next t nn=1001do   fillscreen 0   if nn>20      nn=0      gosub set_pixels   endif   nn=nn+1    WritePixelGroupFast(test,total,backbuffer)    for t=0 to total-1   /* Add the x,y velocities... */    vx[t]=vx[t]*.995   vy[t]=vy[t]+.05      test[t].x=test[t].x+vx[t]       test[t].y=test[t].y+vy[t]    next t    writetext 0,0,str\$(fps)    fps = flipuntil keydown(1)endsub set_pixelsdef start:intdef force:floatext=rand(10,400)select 1   case ext<100:fillscreen 0x111111   case ext<300:fillscreen 0x222222   case ext<370:fillscreen 0x333333   default:fillscreen 0x999999endselectstart=rand(0,total-ext)x=rand(0,640)y=rand(0,480)force=rand(1,4)*1000for n=start to start+ext   test[n].x=x    test[n].y=y    test[n].c=rgb(rand(0,255),rand(0,255),rand(0,255))    an=rand(0,35999)/100f    vx[n]=fsind(an)*rand(50,5000)/force    vy[n]=fcosd(an)*rand(50,5000)/forcenext nreturnendsubdef bpointer,bpitch:int def pp:pointer def pcount:int sub WritePixelGroupFast(p:pointer,qty:int,w:window)    lockbuffer w    bpointer=getbufferpointer()    bpitch=getbufferpitch()    pp=p    pcount=qty_asm    push ebp    push ebp    mov ebp,[\$pp]    mov ecx,[\$pcount]    mov esi,[\$bpitch]    mov edi,[\$bpointer] another: ;   mov ebx,[ebp+72] ; Enabling this increases fps slightly (kinda pre-caching),  needs a bit of extra space at the end of an array    fld dword [ebp]    fistp dword [esp]    mov ebx,[esp]    cmp ebx,639 ; one less than screen width    jg nextone    test ebx,0x8000000    jnz nextone    fld dword [ebp+4]    shl bx,2    mov eax,esi    fistp dword [esp]    cmp dword [esp],479 ; one less than screen height    jg nextone    test dword [esp],0x80000000    jnz nextone    mul dword [esp]    add eax,ebx    add eax,edi    mov ebx,[ebp+8]    mov dword [eax],ebx nextone:    add ebp,12    loop another    pop ebp    pop ebp _endasm    unlockbuffer w   return endsub`