Particle Engine v1.1

By SumWon on Jan 19, 2009

Updates
Added a close button in the top right corner.
Silenced a timer.
Removed mouse position text from top right corner.

This is a particle example made in mIRC. Feel free to use the particles in your own picwin project.

Image

Instructions:

To start the engine, right click in a mIRC window and go to SumWon's Creations>Particle Engine, or type /pe.startup.

After it starts up, you can make particle explosions by clicking in the top part of the window.

You can edit many properties of the particles. These properties are:

Colour.
Minimum speed (speed1.)
Maximum speed (speed2.)
Amount of particles emitted at one time.
Size of particles.
Gravity of particles.
Nozzle size (When using stream)
Angle (When using stream)

There is also another particle emitter type, known as "Stream." To turn it on, click the stream radio button and particles will "stream" out from the mouse. You can change the angle of the stream as well as the nozzle size of stream.

NOTES:
Only 100 particles can exist at one time, this is to keep the frame rate up.
Don't expect to get a great frame rate.

;###################################################
;#####           Particles by SumWon           #####
;#### Thanks for trying out my particle engine! ####
;###      To open it, right click and goto       ###
;####     SumWon's stuff>Particle Engine or     ####
;#####            type /pe.startup             #####
;###################################################

on *:LOAD:timer 1 1 $input(Thanks for installing my particle engine! To open it $+ $chr(44) right click and goto SumWon's Creations>Particle Engine or type /pe.startup,o,Welcome,)

menu status,channel {
  SumWon's Creations
  .Paricle Engine:{
    pe.startup
  }
}
menu @pe {
  sclick:{
    if ($inrect($mouse.x,$mouse.y,305,0,15,15)) {
    .timerpe off
      close -@ @pe
    }

    ;# Syntax for createParticle command: createparticle color size x y angle speed life gravity [picture]
    if ($mouse.y < 200) {
      if (%pe.intro) unset %pe.intro
      var %i = %pe.amount
      if (%pe.parttype == 1) {
        while (%i) { 
          if (%pe.break) {
            unset %pe.break
            echo breaking
            break
          }
          createparticle $rgb(%pe.red,%pe.green,%pe.blue) %pe.size $calc($mouse.x - %pe.size / 2) $calc($mouse.y - %pe.size / 2) $r(0,360) $r(%pe.mxspeed,%pe.mnspeed) %pe.life %pe.gravity
          dec %i
        }
      }
    }
    else {
      if ($mouse.y > 212 && $mouse.y < 223 && $mouse.x > $calc(60 + ( %pe.red / 2.55) - 2) && $mouse.x < $calc(60 + ( %pe.red / 2.55) + 6)) {
        %pe.redsel = 1
      }
      else if ($mouse.y > 227 && $mouse.y < 238 && $mouse.x > $calc(60 + ( %pe.green / 2.55) - 2) && $mouse.x < $calc(60 + ( %pe.green / 2.55) + 6)) {
        %pe.greensel = 1
      }
      else if ($mouse.y > 242 && $mouse.y < 253 && $mouse.x > $calc(60 + ( %pe.blue / 2.55) - 2) && $mouse.x < $calc(60 + ( %pe.blue / 2.55) + 6)) {
        %pe.bluesel = 1
      }
      else if ($mouse.y > 257 && $mouse.y < 268 && $mouse.x > $calc(60 + %pe.mnspeed - 2) && $mouse.x < $calc(60 + %pe.mnspeed + 6)) {
        %pe.mnspeedsel = 1
      }
      else if ($mouse.y > 272 && $mouse.y < 283 && $mouse.x > $calc(60 + %pe.mxspeed - 2) && $mouse.x < $calc(60 + %pe.mxspeed + 6)) {
        %pe.mxspeedsel = 1
      }
      else if (%pe.parttype == 1 && $mouse.y > 287 && $mouse.y < 298 && $mouse.x > $calc(60 + %pe.amount - 2) && $mouse.x < $calc(60 + %pe.amount + 6)) {
        %pe.amountsel = 1
      }
      else if (%pe.parttype == 2 && $mouse.y > 287 && $mouse.y < 298 && $mouse.x > $calc(60 + %pe.amount * 10  - 2) && $mouse.x < $calc(60 + %pe.amount * 10 + 6)) {
        %pe.amountsel = 1
      }
      else if ($mouse.y > 302 && $mouse.y < 313 && $mouse.x > $calc(60 + %pe.size - 2) && $mouse.x < $calc(60 + %pe.size + 6)) {
        %pe.sizesel = 1
      }
      else if ($mouse.y > 302 && $mouse.y < 313 && $mouse.x > $calc(238 + %pe.nozzle - 2) && $mouse.x < $calc(238 + %pe.nozzle + 6)) {
        %pe.nozzlesel = 1
      }
      else if ($mouse.y > 214 && $mouse.y < 224 && $mouse.x > 225 && $mouse.x < 234) {
        %pe.parttype = 1
        %pe.amount = $round($calc(%pe.amount * 10),0)
      }
      else if ($mouse.y > 229 && $mouse.y < 238 && $mouse.x > 225 && $mouse.x < 234) {
        %pe.parttype = 2
        %pe.amount = $round($calc(%pe.amount / 10),0)
      }
      else if ($mouse.y > $calc(254 + %pe.gravity * 25 - 2) && $mouse.y < $calc(254 + %pe.gravity * 25 + 6) && $mouse.x > 185 && $mouse.x < 197) {
        %pe.gravitysel = 1
      }
      else if ($mouse.y > 240 && $mouse.y < 300 && $mouse.x > 235 && $mouse.x < 295) {
        %pe.anglesel = 1
      }
    }
  }
  mouse:{
    if (%pe.redsel) {
      %pe.red = $calc(($mouse.x - 60)*2.55)
      if (%pe.red < 0) %pe.red = 0
      if (%pe.red > 254) %pe.red = 254
    }
    else if (%pe.greensel) {
      %pe.green = $calc(($mouse.x - 60)*2.55)
      if (%pe.green < 0) %pe.green = 0
      if (%pe.green > 254) %pe.green = 254
    }
    else if (%pe.bluesel) {
      %pe.blue = $calc(($mouse.x - 60)*2.55)
      if (%pe.blue < 0) %pe.blue = 0
      if (%pe.blue > 254) %pe.blue = 254
    }
    else if (%pe.mnspeedsel) {
      %pe.mnspeed = $calc(($mouse.x - 60))
      if (%pe.mnspeed < 0) %pe.mnspeed = 0
      if (%pe.mnspeed > 100) %pe.mnspeed = 100
      if (%pe.mxspeed < %pe.mnspeed) %pe.mxspeed = %pe.mnspeed
    }
    else if (%pe.mxspeedsel) {
      %pe.mxspeed = $calc(($mouse.x - 60))
      if (%pe.mxspeed < 0) %pe.mxspeed = 0
      if (%pe.mxspeed > 100) %pe.mxspeed = 100
      if (%pe.mnspeed > %pe.mxspeed) %pe.mnspeed = %pe.mxspeed
    }
    else if (%pe.amountsel) {
      if (%pe.parttype == 1) {
        %pe.amount = $calc(($mouse.x - 60))
        if (%pe.amount < 1) %pe.amount = 1
        if (%pe.amount > 100) %pe.amount = 100
      }
      if (%pe.parttype == 2) {
        %pe.amount = $calc(($mouse.x - 60) / 10)
        if (%pe.amount < 1) %pe.amount = 1
        if (%pe.amount > 10) %pe.amount = 10
      }
      %pe.amount = $round(%pe.amount,0)
    }
    else if (%pe.sizesel) {
      %pe.size = $calc(($mouse.x - 60))
      if (%pe.size < 2) %pe.size = 2
      if (%pe.size > 100) %pe.size = 100
    }
    else if (%pe.nozzlesel) {
      %pe.nozzle = $calc(($mouse.x - 238))
      if (%pe.nozzle < 0) %pe.nozzle = 0
      if (%pe.nozzle > 50) %pe.nozzle = 50
    }
    else if (%pe.gravitysel) {
      %pe.gravity = $calc(($mouse.y - 254) / 25)
      if (%pe.gravity < -1) %pe.gravity = -1
      if (%pe.gravity > 1) %pe.gravity = 1
    }
    else if (%pe.anglesel) {
      %pe.angle = $calc($pe.getangle(265,270,$mouse.x,$mouse.y) * -1)
    }
  }
  leave:{
    $pe.unsetmenubtns
  }
  uclick:{
    $pe.unsetmenubtns
  }
}
alias pe.unsetmenubtns {
  unset %pe.redsel
  unset %pe.greensel
  unset %pe.bluesel
  unset %pe.mxspeedsel
  unset %pe.mnspeedsel
  unset %pe.amountsel
  unset %pe.sizesel
  unset %pe.gravitysel
  unset %pe.anglesel
  unset %pe.nozzlesel
}
alias createparticle {
  if (!$hget(particles)) hmake particles 100
  var %x = 1
  while ($hget(particles,$+(color.,%x))) {
    ;echo . $hget(particles,$+(color.,%x)) %x
    inc %x
  }
  if (%x < 100) {
    hadd particles $+(color.,%x) $1
    hadd particles $+(size.,%x) $2
    hadd particles $+(x.,%x) $3
    hadd particles $+(y.,%x) $4
    hadd particles $+(xs.,%x) $calc(0 + ($6 * $cos($5).deg))
    hadd particles $+(ys.,%x) $calc(0 + ($6 * $sin($5).deg))
    hadd particles $+(life.,%x) $7
    hadd particles $+(grav.,%x) $8
    hadd particles $+(pic.,%x) $9
  }
  ;else %pe.break = 1
}

alias pe.startup {
  if ($hget(particles)) hfree particles
  if ($window(@pe)) close -@ @pe
  %pe.red = 254
  %pe.blue = 254
  %pe.green = 254
  %pe.mnspeed = 2
  %pe.mxspeed = 7
  %pe.life = 50
  %pe.size = 3
  %pe.gravity = 0.25
  %pe.amount = 20
  %pe.parttype = 1
  %pe.angle = 90
  %pe.nozzle = 0
  %pe.intro = 1

  window -paoCzdk0 +tndL @pe -1 -1 320 320
  pe.loop
}

alias pe.loop {
  clear -n @pe
  drawtext -n @pe 0 10 10 Particles: $calc($hget(particles,0).item / 9)
  if (%pe.intro) drawtext -n @pe 0 45 100 Click here to make particles
  ;if ($mouse.x != $null && $mouse.y != $null) drawtext -n @pe 0 250 10 $mouse.x $mouse.y
  ;###Draw Paricles###
  var %x = 1
  while (%x < 100) {
    if ($hget(particles,$+(color.,%x))) {
      hinc particles $+(ys.,%x)) $hget(particles,$+(grav.,%x))
      hinc particles $+(x.,%x) $hget(particles,$+(xs.,%x))
      hinc particles $+(y.,%x) $hget(particles,$+(ys.,%x))
      hdec particles $+(life.,%x)) 1
      if ($hget(particles,$+(life.,%x)) <= 0) {
        hdel -w particles $+(*,.,%x)
      }
      else drawrect -nrf @pe $hget(particles,$+(color.,%x)) 1 $hget(particles,$+(x.,%x)) $hget(particles,$+(y.,%x)) $hget(particles,$+(size.,%x)) $hget(particles,$+(size.,%x))
    }
    inc %x
  }
  ;###End Draw Paricles###
  ;###Draw Menu###
  drawline -n @pe 0 3 0 200 320 200
  drawfill -n @pe 1 0 1 210
  drawtext -n @pe 4 10 210 Red
  drawtext -n @pe 9 10 225 Green
  drawtext -n @pe 12 10 240 Blue
  drawtext -n @pe 0 10 255 Speed1
  drawtext -n @pe 0 10 270 Speed2
  drawtext -n @pe 0 10 285 Amount
  drawtext -n @pe 0 10 300 Size

  drawline -nr @pe $rgb(%pe.red,%pe.green,%pe.blue) 3 60 217 160 217
  drawline -nr @pe $rgb(%pe.red,%pe.green,%pe.blue) 3 60 232 160 232
  drawline -nr @pe $rgb(%pe.red,%pe.green,%pe.blue) 3 60 247 160 247
  drawline -n @pe 0 3 60 262 160 262
  drawline -n @pe 0 3 60 277 160 277
  drawline -n @pe 0 3 60 292 160 292
  drawline -n @pe 0 3 60 307 160 307

  drawline -n @pe 1 1 60 217 160 217
  drawline -n @pe 1 1 60 232 160 232
  drawline -n @pe 1 1 60 247 160 247
  drawline -n @pe 1 1 60 262 160 262
  drawline -n @pe 1 1 60 277 160 277
  drawline -n @pe 1 1 60 292 160 292
  drawline -n @pe 1 1 60 307 160 307

  drawrect -n @pe 0 1 $calc(60 + (%pe.red / 2.55)) 212 3 11
  drawrect -n @pe 0 1 $calc(60 + (%pe.green / 2.55)) 227 3 11
  drawrect -n @pe 0 1 $calc(60 + (%pe.blue / 2.55)) 242 3 11
  drawrect -n @pe 0 1 $calc(60 + %pe.mnspeed) 257 3 11
  drawrect -n @pe 0 1 $calc(60 + %pe.mxspeed) 272 3 11
  if (%pe.parttype == 1) drawrect -n @pe 0 1 $calc(60 + %pe.amount) 287 3 11
  else drawrect -n @pe 0 1 $calc(60 + %pe.amount * 10) 287 3 11
  drawrect -n @pe 0 1 $calc(60 + %pe.size) 302 3 11

  drawtext -n @pe 0 175 210 Grav
  drawline -n @pe 0 3 190 230 190 280
  drawline -n @pe 1 1 190 230 190 280
  drawrect -n @pe 0 1 185 $calc(254 + %pe.gravity * 25) 11 3

  drawdot -n @pe 0 5 230 220
  drawdot -n @pe 0 5 230 235
  drawtext -n @pe 0 240 210 Explosion
  drawtext -n @pe 0 240 225 Stream
  if (%pe.parttype == 1) drawdot -n @pe 1 3 230 220
  if (%pe.parttype == 2) {
    drawdot -n @pe 1 3 230 235
    drawdot -n @pe 0 30 265 270
    drawdot -n @pe 1 28 265 270
    ;var %ang = $calc($pe.getangle(265,280,$mouse.x,$mouse.y) * -1)
    ;%pe.angle = %ang
    drawline -n @pe 0 2 265 270 $calc(264 + (-28 * $cos(%pe.angle).deg)) $calc(269 + (-28 * $sin(%pe.angle).deg))

    drawtext -n @pe 0 185 300 nozzle
    drawline -n @pe 0 3 238 307 288 307
    drawline -n @pe 1 1 238 307 288 307
    drawrect -n @pe 0 1 $calc(238 + %pe.nozzle) 302 3 11

    if ($mouse.x && $mouse.y && $mouse.y < 200) {
      var %i = %pe.amount
      while (%i) { 
        if ($r(0,1)) {
          var %noz = $r(0,%pe.nozzle)
        }
        else var %noz = $calc($r(0,%pe.nozzle) * -1)
        if ($r(0,5) == 5) createparticle $rgb(%pe.red,%pe.green,%pe.blue) %pe.size $calc($mouse.x - %pe.size / 2) $calc($mouse.y - %pe.size / 2) $calc(%pe.angle + 180 + %noz) $r(%pe.mxspeed,%pe.mnspeed) %pe.life %pe.gravity
        dec %i
      }
    }
  }
  drawrect -n @pe 0 1 304 0 15 15
  drawline -n @pe 0 1 305 0 319 14
  drawline -n @pe 0 1 304 14 318 0
  ;###End Draw Menu###
  drawdot @pe
  .timerpe -o 1 0 pe.loop
}

;GetAngle by BlueThen
alias -l pe.getangle {
  %p1.x = $1 | %p1.y = $2 | %p2.x = $3 | %p2.y = $4 | %p3.x = %p2.x | %p3.y = %p1.y | %opposite = $sqrt($calc((%p2.x - %p3.x)^2 + (%p2.y - %p3.y)^2))
  %hypotenuse = $sqrt($calc((%p2.x - %p1.x)^2 + (%p2.y - %p1.y)^2)) | %angle = $asin($calc( %opposite / %hypotenuse )).deg
  if (%p1.y < %p2.y) %angle = $calc(360 - %angle) | if ((%p1.x > %p2.x) && (%p1.y > %p2.y)) %angle = $calc(180 - %angle)
  elseif ((%p1.x > %p2.x) && (%p1.y < %p2.y)) %angle = $calc(180 +(360 - %angle)) | return $calc(%angle - 180)
}

Comments

Sign in to comment.
Priest   -  Mar 17, 2009

It lagged for me but thats cause my comps crap... Was interesting, reminded me of the old star-travveling screensaver for windows.

 Respond  
SumWon   -  Jan 20, 2009

Thanks for the comments guys! Sorry about not making a close function for the window. I added a 'x' in the corner to close the window. Enjoy =D.

 Respond  
^Neptune   -  Jan 20, 2009

When we all thought BT was conquering picwins, this guy comes along. D:

 Respond  
^Neptune   -  Jan 20, 2009

I get this when I manually close it:

* /drawline: invalid window (line 220, script2)
 Respond  
Soulkeeper   -  Jan 19, 2009

Would be awesome if you had

/pe.close window -c @pe

Other than that, it's okay.

Would've rated higher than 6, but I wasn't too fond of having to dig through the help file to remember how to close a @window. >:|

Plus, it's just neat. Not really useful or anything for me.

 Respond  
BabyJesus   -  Jan 19, 2009

Fail whale you're still alive? how ya?

 Respond  
^Neptune   -  Jan 19, 2009

This is brilliant! I really need to get to grips with picwins sometime, the stuff you can make is awesome :[

 Respond  
Jonesy44   -  Jan 19, 2009

Really awesome!! nice one :D Few suggestions for you though.

1: Close button?

2: Silence a timer (line 11)

 Respond  
BlueThen   -  Jan 19, 2009

I love it!

 Respond  
BabyJesus   -  Jan 19, 2009

Ahh ok pretty cool, your amount slider tends to disappear though. Great work.

 Respond  
SumWon   -  Jan 19, 2009

Sorry about that BabyJesus. It didn't work for you because I made it with a black background in mIRC, and your background is white. I have changed it and it should work fine for you now =D.

 Respond  
BabyJesus   -  Jan 19, 2009

This would be cool if i could get it to work, all im gettin is the dialog and some text but nothing else no sliders or anything.

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.