Sharp thruster trails
BlitzMax Forums/BlitzMax Programming/Sharp thruster trails
| ||
| Hey, I'm trying to figure out how trails like these are done: http://blitzbasic.com/logs/userlog.php?user=8862&log=1442 I have three problems: - My current method doesn't end pointy like that (which is the effect i'm after) - My current method doesn't have the nice color transition from white to the burn color, also an effect i'm after. - My trails don't "Bend" as you fly around Right now I stick a particle emitter emitting little fire sprites to the tail of my little ship and turn it on/off when thrusting. It looks decent, but not the sharp pointy gradual look I'm going for. any ideas? here's a image of my current method for a thruster trail: |
| ||
| Simple scale the particle sprites to get smaller in real time, that's how you will get that pointy look. ;) |
| ||
| ok, did so, now its more pointy, but another problem I have is a design for this game i'm working on, the player is stationary in the middle of the screen, so instead, the map scrolls, and the amount the map scrolls is added to the objects around the players(giving the illusion that the map is stationary, not the player), including the trail (so theres not a dot of particles not moving on the ships tail), because of this, the trail looks dotted when the player goes fast, I want it solid, is there any easy way to achieve this? screen shot of player going maximum speed with scale as suggested: |
| ||
| In the screenshot you linked the scaling is the other way round, ie smaller particles nearer the ship. To avoid dotting, you could place more dots as the ship goes faster. Something like this, if the ship is moving from (ox#,oy#) to (newx#,newy#) dx#=newx-ox dy#=newy-oy d#=sqr(dx*dx+dy*dy) 'this is how far the ship moved this frame) dx:/d 'make (dx,dy) a unit vector in the direction of the ship's movement dy:/d t#=leftover while t<d x#=ox+t*dx y#=oy+t*dy makedot(x,y) t:+dotspacing wend leftover#=t-d This will place dots evenly, every 'dotspacing' units. The 'leftover' variable is so the evenness carries over from frame to frame. Obviously, you'll need to initialise it to zero. |
| ||
| hey, thanks for the help warpy, but i'm not quite sure how to implement your method. Here's my player update code: the old method is the method I came to this thread with, the new method is me trying to implement yours. thanks for all the help! |
| ||
Almost there. You just need to remember to initialise t, and make dotspacing and leftover globals.
Global leftover:Float=0
Const dotspacing:Float=10
Function UpdatePlayer()
Local RadPx:Float
Local RadPy:Float
If KeyDown(KEY_SPACE)
If burning = False burning = True
pdx:+AngleToDX(protation)*ACCELERATION
pdy:+AngleToDY(protation)*ACCELERATION
Else
If burning = True burning = False
End If
protation = PointsToAngle(512,384,MouseX(),MouseY())+90
If MouseHit(1) And Not dead
PlaySound shoot_sound
Local bul:TBullet = New TBullet.Create(512,384,protation)
End If
If MouseHit(2) And Not dead And BOMBS
'PlaySound shoot_sound
Local bom:TBomb = New TBomb.Create(512,384)
BOMBS:-1
End If
'old method for thruster trail
'If burning And Not dead
' EmitParticle(Cos(protation-90) * -9 + 512, Sin(protation-90) * -9 + 384, firepart2, 10, True, 180, 3, ,True)
'End If
If pdx > TOPSPEED pdx = TOPSPEED
If pdx < -TOPSPEED pdx = -TOPSPEED
If pdy > TOPSPEED pdy = TOPSPEED
If pdy < -TOPSPEED pdy = -TOPSPEED
If protation > 360 protation = protation - 360
If protation < 0 protation = protation + 360
'new method for thruster trail
Local distance:Float=Sqr(pdx*pdx+pdy*pdy) 'this is how far the ship moved this frame)
Local dx:Int = pdx:/d 'make (dx,dy) a unit vector in the direction of the ship's movement
Local dy:Int = pdy:/d
If burning And Not dead
Local t:Float = 0
While t<distance
_x#=px+t*dx
_y#=py+t*dy
EmitParticle(_x, _y, firepart2, 10, True, 180, 3, ,True)
t:+dotspacing
Wend
End If
px :+ pdx
py :+ pdy
If HEALTH < 1 PlayerDie()
If deadtimer > 115
ParticleExplosion(512,384,starpart,70,15,Rnd(2.11,3.99))
dead = False
deadtimer = 0
End If
If player_st = 20
player_st = 1
player_shield = False
End If
DrawImage landingpad,-px+1024,-py+768
If Not dead
SetRotation protation
DrawImage player_img,512,384
SetRotation 0
If player_shield
DrawImage shield_img,512,384
player_st:+1
End If
Else
SetAlpha .2
SetRotation protation
DrawImage player_img,512,384
SetRotation 0
SetAlpha 1
deadtimer:+1
End If
targetrot:+5
If targetrot > 360 targetrot = 0
If targetrot < 0 targetrot = 360
SetRotation targetrot
DrawImage target_img,MouseX(),MouseY()
SetRotation 0
End Function
|
| ||
| thanks for all the help warpy, the effect appears to be working, but the fire trail blazes off into the distance instead of staying on the ship. any ideas? |
| ||
| No idea. What do you mean it blazes off into the distance? Actually, you need to change the lines Local _x#=px+t*dx Local _y#=py+t*dy to Local _x#=px - t*dx Local _y#=py - t*dy so the fire appears *behind* the ship, but I don't think that's the problem you were describing, is it? |
| ||
Fire seperates from the ship and goes further and further as relative to the player's "position". ![]() This is because the players ship is (as far as pixels go) always draw in the middle of the screen, its the background/objects that move. Your code helps, before the flame was going the oposite direction of the player, now it speeds past the player :) any ideas? Thanks for all the help warpy |
| ||
| If you're main sprite is always in the center, then your main ship's particles should as well. You may not want any world movement affecting your ship particles. Give that a shot, might be what you're looking for. In my particle system, emitters can "rail" off a sprite meaning they are not affected by anything else so it's a constant motion originating from the sprite's position. Perfect for flames, etc. |
| ||
| MGE, that seemed to solve the problem, but now apon closer look, it seems this method didn't change the dotting of the particles, it simply made more particles, thus the dots are brighter as the particles are on light blend: image at full speed(trail looks great at slow speeds): ![]() current code: |
| ||
| I counted about 8 sprites in your trail, you may want to double that. Plus you may want to move them slower so they don't spread out so far. Also since you're using LIGHTBLEND, make the particle colors darker. Also create your flame particle image with dark reds and dark yellows in it. When they blend together they should make a better looking flame. ;) |
| ||
| they're bright because theres more than 8 sprites stacked ontop of eachother. - there's 45 but there in 8 concentrated groups thats the problem |

