here is a 3D fireworks program I made. copy it and then hit F5 (you know). hold space-bar to rotate the image. tell me how you like it... oh, and I used my own 3D formula, and so the 3D is a little off.
Code:
DIM bx3(20, 150)
DIM bz3(20, 150)
DIM c!(360), s!(360)
DIM bx(20, 150)
DIM by(20, 150)
DIM bz(20, 150)
DIM bxs(20, 150)
DIM bys(20, 150)
DIM bzs(20, 150)
DIM colr(20, 150)
DIM bx1(20, 150)
DIM by1(20, 150)
DIM boom$(20)
DIM bom(20)
DIM x(20)
DIM y(20)
DIM z(20)
DIM colm(20)
SCREEN 12
RANDOMIZE TIMER
bnom = 150 '********************* number of explosion particals... lower it for speed
nom = 4 '*********************** number of fireworks
coln = 7
FOR num = 1 TO nom
boom$(num) = "S"
NEXT num
FOR der = 1 TO coln
READ Rer(der)
READ Ger(der)
READ Ber(der)
NEXT der
DATA 1,33,33
DATA 33,1,33
DATA 33,33,1
DATA 1,1,33
DATA 33,1,1
DATA 1,33,1
DATA 1,1,1
BEEP
FOR i = 1 TO 360
c!(i) = COS(i * 3.14 / 180)
s!(i) = SIN(i * 3.14 / 180)
NEXT
cx = 320
cy = 240
cz = 350
angle = 90
time = TIMER
FOR ferx = 1 TO 660
FOR fery = 1 TO 480
PSET (1, 1), back
NEXT fery
NEXT ferx
etime = TIMER
back = 0
bol = 0
gol = 0
rol = 0
DO
Key$ = INKEY$
bol = bol + .03
OUT &H3C8, 0
OUT &H3C9, rol
OUT &H3C9, gol
OUT &H3C9, bol
tim = TIMER
IF (angle >= 359) THEN
angle = 1
END IF
IF (Key$ = " ") THEN
angle = angle + 2
END IF
FOR num = 1 TO nom
IF (boom$(num) = "S") THEN
FOR bnum = 1 TO bnom
bom(num) = 63
bx(num, bnum) = x(num)
by(num, bnum) = y(num)
bz(num, bnum) = z(num)
bxs(num, bnum) = (RND * 3) - 1.5
bys(num, bnum) = (RND * 3) - 1.5
bzs(num, bnum) = (RND * 3) - 1.5
colr(num, bnum) = num
NEXT bnum
colm(num) = (INT(RND * (coln))) + 1
x(num) = (INT(RND * 620)) + 20
y(num) = 470
z(num) = (INT(RND * 700))
boom$(num) = "Y"
END IF
IF (boom$(num) = "Y") THEN
FOR bnum = 1 TO bnom
bx3(num, bnum) = (bx(num, bnum) - cx) * c!(angle) + (bz(num, bnum) - cz) * s!(angle)
bz3(num, bnum) = (bz(num, bnum) - cz) * c!(angle) - (bx(num, bnum) - cx) * s!(angle)
bz3(num, bnum) = bz3(num, bnum) + cz
bx3(num, bnum) = bx3(num, bnum) + cx
bom(num) = bom(num) - .003
OUT &H3C8, num
OUT &H3C9, ((bom(num) / Rer(colm(num))) - 62)
OUT &H3C9, ((bom(num) / Ger(colm(num))) - 62)
OUT &H3C9, ((bom(num) / Ber(colm(num))) - 62)
PSET (bx1(num, bnum), by1(num, bnum)), back
IF (bz3(num, bnum) > 1000) THEN
bz3(num, bnum) = 1
ELSEIF (bz3(num, bnum) < 1) THEN
bz3(num, bnum) = 0
END IF
bx1(num, bnum) = bx3(num, bnum) + ((320 - bx3(num, bnum)) / 1000) * bz3(num, bnum)
by1(num, bnum) = by(num, bnum) + ((240 - by(num, bnum)) / 1000) * bz3(num, bnum)
bys(num, bnum) = bys(num, bnum) + .03
bx(num, bnum) = bx(num, bnum) + bxs(num, bnum)
by(num, bnum) = by(num, bnum) + bys(num, bnum)
bz(num, bnum) = bz(num, bnum) + bzs(num, bnum)
PSET (bx1(num, bnum), by1(num, bnum)), colr(num, bnum)
IF (bom(num) <= 4) THEN
PSET (bx1(num, bnum), by1(num, bnum)), back
boom$(num) = "E"
fuel(num) = (INT(RND * 400)) + 100
END IF
NEXT bnum
END IF
IF (boom$(num) = "E") THEN
olx3(num) = x1(num)
oly3(num) = y1(num)
x3(num) = (x(num) - cx) * c!(angle) + (z(num) - cz) * s!(angle)
z3(num) = (z(num) - cz) * c!(angle) - (x(num) - cx) * s!(angle)
z3(num) = z3(num) + cz
x3(num) = x3(num) + cx
x1(num) = x3(num) + ((320 - x3(num)) / 1000) * z3(num)
y1(num) = y(num) + ((240 - y(num)) / 1000) * z3(num)
LINE (olx3(num), oly3(num))-(olx3(num), (oly3(num) + (fuel(num) / 20))), back
fuel(num) = fuel(num) - .65
y(num) = y(num) - (fuel(num) / 300)
LINE (x1(num), y1(num))-(x1(num), (y1(num) + (fuel(num) / 20))), 14
IF (fuel(num) < -6) THEN
boom$(num) = "S"
PSET (x(num), (y(num) + (fuel(num) / 20))), 0
END IF
END IF
IF (boom$(num) <> "Y") THEN
FOR ford = 1 TO (bnom * 2)
PSET (1, 1), 1
NEXT ford
END IF
NEXT num
etim = TIMER
LOOP UNTIL Key$ = "q"
PRINT "start:"; etime; "end:"; time; "fps:"; etime - time; "It takes "; (INT(etime - time) / (100 * 100)); " to set a pixel."
hope you enjoy it... oh, and the farther away the thing gets, the worst the 3D works....
......... and I was rushing, so the explosion is shaped somewhat like a cube!