Passing alot of variables to a function...
BlitzMax Forums/BlitzMax Beginners Area/Passing alot of variables to a function...| 
 | ||
| One of my functions is getting out of control. In my program, I have a fancy particle system with behaviours and many attributes and I will only be expanding these behaviours as I go on. Problem is, I'm getting lost in the long list of variables I'm passing into the function that initializes these particles: 'array, x,y,x1,y1,randomness, scale, kind, many, alpha Function createParticle(p:particle[], x,y,x1,y1,r:Float, scale:Float, kind, many, alpha:Float) All of these variables are needed. And unlike some other IDEs, In Blitz, I can't separate the variables by putting them each on their own line like so: createParticle( p, s[a].x, s[a].y, -s[a].x1*b, -s[a].y1*b, .05, .05, 1, 2, .4 ) Being able to do it like the above example would be GREAT. Anyone have any work-arounds though? By the way, the particle engine is used for explosion debris, bubbles under water, smoke, fire, etc. | 
| 
 | ||
| why not pass in a config type instead of each individual parameter. Type ParticleConfig field x,y,z ... end type | 
| 
 | ||
| Can you have seperate functions where CreateParticle creates a basic template with default values and then adjust it with calls to another function? e.g. my_particle=CreateParticle() SetParticleSpeed(my_particle,0.75) SetParticleLife(my_particle,1000) etc. | 
| 
 | ||
| createParticle(.. p,.. s[a].x,.. s[a].y,.. -s[a].x1*b,.. -s[a].y1*b,.. .05,.. .05,.. 1,.. 2,.. .4.. ) | 
| 
 | ||
| Scott, I'm not sure what you're saying, but I'd like to hear you explain it some more. And tonyg, I considered that, but I decided I wanted to avoid doing that. And TwoEyedPete, you're brilliant! Thank you! Works great. | 
| 
 | ||
| I think what Scott's suggesting is the creation of a new Type, that would have all of the data necessary to create a new particle.  You could make sure it had 'reasonable' defaults, set the things you want to override, and then pass the one object to your function. This might even be faster if you're making a bunch of particles, as you could then tweak the object slightly and pass the same object to the createParticle() function multiple times. | 
| 
 | ||
| exactly | 
| 
 | ||
| This definitely looks like a job for a Type. | 
| 
 | ||
| Can someone enter that line continuation thing (..) into the wiki? I couldn't find it in there. | 
| 
 | ||
| Ah, I see what Scott was saying now, thanks, kyoryu. And Wendel, I am using types, what made you think I wasn't? If you'd like to know, I'm using an array instead of a list to handle my particles for now. I see no obvious speed or convenience benefits to using a list (yet), but I'm also a newbie. | 
| 
 | ||
| Two advantages: 1) If you're passing in multiple types of parameters (strings, floats, etc.), a Type can be made typesafe. 2) By using a type, you can use named parameters, which will make it more clear what is going on. Consider (and sorry if my syntax is slightly screwed up) Type ParticleParams Field xLoc:Int Field yLoc:Int Field Speed:Float Field RGB:Long End Type ... Local params:ParticleParams = new ParticleParams params.xLoc = 100 params.yLoc = 200 params.Speed = 2.0 params.RGB = 48723 ' okay, this could be cleaner. CreateParticle params In this case, without even looking at the definition of CreateParticle, you know exactly what the code is doing. In comparison: Local params[ 4 ] params[ 0 ] = 100 params[ 1 ] = 200 params[ 2 ] = 2.5 params[ 3 ] = 34212 CreateParticle params Less clear, and far more likely for you to misorder something (which simply can't happen with a Typed parameter) | 
| 
 | ||
| I recently made "Create" Function for many of my types but I find them quite ugly to use. Kyoryu, Can you explain why you would use a params type rather that just set the properties on the newly instantiated object? p:tParticle = New tParticle p.Pos.x = 100 p.Pos.Y = 100 p.Speed = 50 p.Color.Set (255,255,255,1) | 
| 
 | ||
| My particle system does it slightly differently and i think it's the most efficient way to do it, when a particle is created it inherits it's properties from it's parent emmitter. example: 
Type Emitter
  Field x:float, y:float, z:float
  Field ParticleMass:Int, ParticleMassVariation:Byte
  Field ParticleAngle:Float, ParticleAngleVariation:Byte
  Method IssueProperties( Target:Particle )
    Target.Mass = ParticleMass + ParticleMassVariation
    Target.Angle = ParticleAngle + ParticleAngleVariation
    'etc etc
  End Method
End Type
Type Particle
  Field Parent:Emmitter
  Field Mass:Int
  Field Angle:Float
  Function Create:Particle( NewParent:Emmitter )
    Local NewP:Particle = new Particle
    NewP.Parent = NewParent
    NewP.Parent.IssueProperties( NewP )
  End Function
End Type
 | 
| 
 | ||
| Jay, In that case, I'm not sure it really makes sense. The only reason I can think of doing it is if you had to create a lot of similar particles/objects. In which case, slightly modifying a parameter object and passing it to the create function may be slightly easier/more efficient. |