Nothing new, but this is how you control and turn the smoke with a given angle.
use left and right keys
Rem ***** Main Source File *****
REM SET MAXIMUM DIMS
GLOBAL DIM Particles(10, 200) As entityProperties
REM TYPES
Type entityProperties
num As Integer `sprite - object - light
posX As Float `sprite - object
posY As Float `sprite - object
vecX As Float `sprite - object - particles
vecY As Float `sprite - object - particles
sizeX As Float `object
sizeY As Float `object
fade As Integer `particles
diffuse As Float `particles
EndType
REM WHITE SMOKE IMAGE
create bitmap 1,50,50
ink rgb(250,200,100),0
for x=1 to 1000
ang=rnd(360)
rad=rnd(20)
dot 25+sin(ang)*rad,25+cos(ang)*rad
next x
blur bitmap 1,4
whiteSmoke = freeImage()
get image whiteSmoke, 0, 0, 50, 50
delete bitmap 1
REM RED SMOKE IMAGE
create bitmap 1,50,50
ink RGB(255,0,0),0
for x=1 to 1000
ang=rnd(360)
rad=rnd(20)
dot 25+sin(ang)*rad,25+cos(ang)*rad
next x
blur bitmap 1,4
redSmoke = freeImage()
get image redSmoke, 0, 0, 50, 50
delete bitmap 1
make memblock 1,12+64*64*4
write memblock dword 1,0,64
write memblock dword 1,4,64
write memblock dword 1,8,32
orangeSmoke = freeImage()
for x=0 to 63
for y=0 to 63
pos=12+(x+y*64)*4
dist#=sqrt( (x-32)^2 + (y-32)^2 )
if dist#>31
alpha=0
else
alpha=(255-dist#*8)/(0+rnd(1))
endif
write memblock byte 1,pos,0
write memblock byte 1,pos+1,128
write memblock byte 1,pos+2,255
write memblock byte 1,pos+3,alpha
next y
next x
make image from memblock orangeSmoke,1
greenSmoke = freeImage()
for x=0 to 63
for y=0 to 63
pos=12+(x+y*64)*4
dist#=sqrt( (x-32)^2 + (y-32)^2 )
if dist#>31
alpha=0
else
alpha=(255-dist#*8)/(1+rnd(0.1))
endif
write memblock byte 1,pos,0
write memblock byte 1,pos+1,255
write memblock byte 1,pos+2,0
write memblock byte 1,pos+3,alpha
next y
next x
make image from memblock greenSmoke,1
REM MAIN LOOP
Sync Rate 60 : Sync On
DO
angle = wrapvalue(angle + rightkey()-leftkey())
aaa = make2dParticles(1, 150, 320, 240, aaa, greenSmoke, angle)
bbb = make2dParticles(2, 150, 420, 440, bbb, whiteSmoke, 45)
ccc = make2dParticles(3, 150, 220, 440, ccc, redSmoke, -45)
ddd = make2dParticles(4, 200, mousex(), mousey(), ddd, orangeSmoke, 180)
REM INFO
set cursor 0, 0
print "FPS: ",screen fps()
print particles(1, 1).fade
print particles(2, 1).diffuse
print "use left and right keys to turn smoke around"
Sync
Loop
Function make2dParticles(num, Amount, x, y, particleCounter, image, angle)
If particles(num, 0).num = 0
spr = freeSprite()
For f = spr To spr + Amount
i = f - spr
particles(num, i).num = f
particles(num, i).posX = x
particles(num, i).posY = y
particles(num, i).sizeX = 1.0
particles(num, i).sizeY = 1.0
particles(num, i).fade = 0
particles(num, i).diffuse = 255
Next f
EndIf
For f = 0 To Amount
particles(num, f).sizeX = particles(num, f).sizeX + 0.5
particles(num, f).sizeY = particles(num, f).sizeY + 0.5
particles(num, f).posX = particles(num, f).posX + particles(num, f).vecX
particles(num, f).posY = particles(num, f).posY + particles(num, f).vecY
particles(num, f).fade = particles(num, f).fade - 0.1
particles(num, f).diffuse = particles(num, f).fade
Sprite particles(num, f).num, particles(num, f).posX, particles(num, f).posY, image
`Offset Sprite particles(num, f).num, Sprite Width(particles(num, f).num)/2.0, Sprite Height(particles(num, f).num)/2.0
Size Sprite particles(num, f).num, particles(num, f).sizeX, particles(num, f).sizeY
Set Sprite Alpha particles(num, f).num, particles(num, f).fade
Set Sprite Diffuse particles(num, f).num, particles(num, f).diffuse, particles(num, f).diffuse, particles(num, f).diffuse
Next f
Inc particleCounter
If particleCounter > amount Then particleCounter = 0
If particles(num, particleCounter).Fade =< 0
`Position
particles(num, particleCounter).posX = x
particles(num, particleCounter).posY = y
`Scale
particles(num, particleCounter).sizeX = 10
particles(num, particleCounter).sizeY = 10
`Velocity (randomize)
particles(num, particleCounter).vecX = Sin(angle+(Rnd(20)-10))* 2
particles(num, particleCounter).vecY = -Cos(angle+(Rnd(20)-10))* 1.5
particles(num, particleCounter).fade = Amount `ttlPrc / 2.0
particles(num, particleCounter).diffuse = 255
EndIf
EndFunction particleCounter
Function freeImage()
Repeat
Inc i
Until Image Exist(i) = 0
EndFunction i
Function freeSprite()
Repeat
Inc i
Until Sprite Exist(i) = 0
EndFunction i