Beams
Blitz3D Forums/Blitz3D Beginners Area/Beams
| ||
| Hi, I am trying to create a beam based on a cylinder object. I want to be able to create a cylinder object to be created from the camera out to another cube. Basically I want to use this to create a laser/phaser beam. I can then start playing around effects on this object. So when I press a mouse button (left), a cylinder is created between camera and a cube that is moving in a circle around the Z axis.. I cannot figure it out and some examples I found looked a little complicate ( simple that I am! ) Cheers Mango |
| ||
I would try to cyl=createcylinder() fitmesh cyl,-1,0,-1,2,2,2 hideentity cyl ... while (endofgame=0) and keydown(1)=0 if mousehit(1) showentity cyl pointentity cyl,targetmesh scaleentity cyl,1,entitydistance(camera,targetmesh),1 endif ... wend But there's a problem when there is no target mesh. So you first should do a camerapick. (Entitypickmode for all meshes must be set correctly). If there is a mesh behind the crosshair or so, you can use it as targetmesh. If there is nothing, you may position a dummy pivot at that location and use it as targetmesh. Please note when you texturemap the cylinder, you may alter the ScaleTexture dynamicly to make it fit the beam lenght. EDIT: To limit the max beam range yoiu may use an invisible sphere that will give you the position for a dummy pivot if you didn't hit anything: helperpivot=createpivot() s=createsphere() scaleentity s,100,100,100 flipmesh s entitypickmode s,2 entityalpha s,0 entityparent s,camera ... ; then somewhere inside the mainloop, right before you point the beam to the target: pick=camerapick(camera,graphicwidth()/2,graphicsheight()/2) if pick=s ; didn't hit a real mesh positionentity helperpivot,pickedx(),pickedy(),pickedz(),1 targetmesh = helperpivot endif |
| ||
| Excellent... you could modify this to cast a point onto a target like a lasersight I think... Let me play with it RZ |
| ||
| Ahh fantastic.. will have a play with this. Many thanks. Luckily there has to be a target in my game, you must lock on first before firing. Although eventually I want the player to be able to fire manually if their targeting systems are damaged, but that is for the future :-) Mango |
| ||
| the laser code in the archives does something similar by stretching a primitive cube between two entities. http://www.blitzbasic.com/codearcs/codearcs.php?code=429 |
| ||
| Erk.. not sure about this. Tried the first example and get the below screenshot... Any ideas where I went wrong? Whilst I am here, how do you post code. So if need be it will be easier to understand? ![]() It seems the beam is pointing along the wrong axis? It does turn toward the cube (borg cube), but not on the right axis. Cheers Mango |
| ||
| Did you try rotating the original cylinder? And the code for posting is {code}your code here...{/code}only with [ instead of }. |
| ||
| Hmm maybe you need a RotateMesh command in there when the 'beam' is created... |
| ||
| Yup, you need the cylinder mesh to be pointing along the z axis initially before you point it as pointentity aligns on the z axis. Set up the beam entity like this ... Beam = createcylinder() Rotatemesh Mesh , 90, 0, 0 Positionmesh Beam,0,0,1 Scalemesh Beam,1,1,.5 Then ... Pointenity Beam , Target Scaleentity beam , 1 , 1, entitydistance( Beam , Target ) Note that Scaling on the Y axis is wrong ... should be the z axis. Stevie |
| ||
| uh, sorry thought the "point-to-axis" of y cylinder is it's y-axis. yes, simply use Rotatemesh cyl,90,0,0 once after creation, then use the scaling with the z-axis, this should work. This happens when you pseudo-code all the time :) . |
| ||
| Ok, Seems to work better now. But my beam seems to hit beyond the cube. Not sure what I have done here. Is there something I have done wrong? Sorry about the lack of comments! Mango
;==================================================================
Global graphic_x$=1600
Global graphic_y$=900
Global graphic_depth$=32
Global graphic_window$=1
Global started$
Global fntarial$=LoadFont("Arial",8,False,False,False)
Global temp$
Global screendebug = 1
Global movement = 0
Global Collision$
Global torplive#
Global wp_id$
Global appname$="Face Off"
Global enemy1col=1
Global torpcol=1
Global title$ = appname+" - Build "+versionlong+" - Version "+versionshort
Global specs$ = "Available Memory: "+AvailPhysicalRAM()+" Total Ram Used: "+TotalPhysicalRAM()+" CPU Speed: "+CPUSpeed()
AppTitle (title)
; create screen
SetBuffer BackBuffer()
graphic_window=screendebug
Graphics3D graphic_x, graphic_y, graphic_depth, graphic_window
; Creation of standard game variables
Global ship_power# = 5000
Global shield# = 100
Global torp_capacity# = 100
Global torp_max# = 100
Global torp_recharge# = 0.25
Global torp_yield# = 20
Global phaser_capacity# = 100
Global phaser_max# = 100
Global phaser_yield#= 5
Global phaser_recharge# = 1.25
Global enemy1_shippower#
Global enemy1_shield# = 1000
Global enemy1_torp_recharge#
Global enemy1_phaser_recharge#
; setup 3d components
Global tex2 = LoadTexture("beam.bmp",3)
Global enemy1=CreateCube()
Global tex=LoadTexture( "borg.jpg",1 )
EntityTexture enemy1,tex
EntityFX enemy1,2
PositionEntity enemy1,+4,+1,+4
EntityRadius enemy1,1.5
EntityPickMode enemy1,2 ; check if pick mode is quicker on rectangle
EntityRadius (enemy1,1)
EntityType (enemy1, 2)
Global shieldsph=CreateSphere()
ScaleEntity shieldsph,0.01,0.01,0.01
EntityFX shieldsph,1
EntityTexture shieldsph, tex2
Global torp=CreateSphere(8)
EntityRadius (torp,1)
EntityType (torp,1)
ScaleEntity torp,0.25,0.25,0.25
HideEntity torp
Global beam=CreateCylinder(8)
;FitMesh beam,-1,0,-1,2,2,2
RotateMesh (beam,90,0,0)
PositionMesh beam,0,0,1
ScaleEntity beam,0.5,0.5,1
HideEntity beam
EntityFX beam,1
EntityTexture beam, tex2
Global camera=CreateCamera()
PositionEntity camera,0,0,-4
Global light=CreateLight(1)
PositionEntity light,0,-4,0
Global crosshair=LoadImage ("crosshair.bmp")
Global conftorp=LoadSound("torp-fired.wav")
Global torpsnd=LoadSound("torp.wav")
Global locked=LoadSound("locked.wav")
Global explosion=LoadSound("explosion.wav")
Global phasersnd=LoadSound("phaser.wav")
Collisions 1,2,2,1
; Main Loop
While Not KeyHit(1)
Locate 0,850:Print"System Information: "+specs
Locate 10,700:Print "Ship Power: "+ship_power
Locate 10,710:Print "Torp Capacity: "+torp_capacity
Locate 10,720:Print "Phaser Capacity: "+phaser_capacity
Locate 10,730:Print "Enemy Shield: "+enemy1_shield
Locate 10,750:Print "Enemy Distance: "+EntityDistance(camera,shieldsph)
DebugLog("Main loop")
enemymove()
PositionEntity (shieldsph,EntityX (enemy1),EntityY (enemy1), EntityZ (enemy1))
locktarget()
If wp_id = enemy1 And MouseHit(1) Then
fire_torp()
EndIf
If torplive = 1 Then
torp()
EndIf
If MouseDown(2) And phaser_capacity => 0
PointEntity beam,enemy1
ScaleEntity beam,0.10,0.10,EntityDistance(camera,shieldsph)
ShowEntity beam
phaser_capacity = phaser_capacity - 2
PlaySound phasersnd
EndIf
If phaser_capacity =< 0 Then HideEntity beam
If MouseDown(2) = False Then HideEntity beam
If torplive = 1 Then MoveEntity torp, 0, 0, 2
collide()
energy()
UpdateWorld
RenderWorld
DrawImage crosshair,MouseX(),MouseY() ; Draw the image!
Flip
Wend
; FUNCTIONS
Function torp()
If EntityX(torp) > 300 Then HideEntity torp:torplive=0
If EntityY(torp) > 300 Then HideEntity torp:torplive=0
If EntityZ(torp) > 300 Then HideEntity torp:torplive=0
;If torplive = 1 Then MoveEntity torp, 0, 0, 2
End Function
Function fire_torp()
If torp_capacity => torp_max
Locate 10,30:Print"Target Locked"
ShowEntity torp
PositionEntity torp,0,0,0
PointEntity torp, enemy1
PlaySound(conftorp)
PlaySound(torpsnd)
torplive=1
torp_capacity = torp_capacity - 100
EndIf
End Function
Function enemymove()
TurnEntity enemy1,.0,-0.1,.0
MoveEntity enemy1,-0.05,0,0
End Function
Function locktarget()
wp_id=CameraPick ( camera,MouseX(),MouseY())
Locate 10,10:Print wp_id
If wp_id = enemy1 Locate 10,30:Print"Target Locked"
End Function
Function collide()
If EntityCollided(enemy1,torpcol)
Text 30,40,"Hit2"
HideEntity torp
torplive=0
PlaySound(explosion)
enemy1_shield=enemy1_shield - torp_yield
EndIf
End Function
Function energy()
If enemy1_shield < 0 Then enemy1_shield = 0
If torp_capacity < 0 Then torp_capacity = 0
If torp_capacity => torp_max Then torp_capacity = torp_max
;If phaser_capacity <= Then phaser_capacity = 0
If phaser_capacity => phaser_max Then phaser_capacity = phaser_max
torp_capacity = torp_capacity + torp_recharge
phaser_capacity = phaser_capacity + phaser_recharge
If torp_capacity =< 100
ship_power=ship_power - torp_recharge
EndIf
End Function
|
| ||
| Change this line ScaleEntity beam,0.5,0.5,1 to ScaleEntity beam,0.5,0.5,.5 Remember the distance it's scaled will be doubled as it's already of length 2 units. I did mention this in my previous post. Stevie |
| ||
| tried that, that's what I thought the problem was, but the beam still appears through the cube. Mango |
| ||
| Could it be that your collision check is failing, and the beam is hiding when it's at > 300? |
| ||
| No the torp should be hiding at > 300. No collision has been created yet. I have scaled the cube to a larger size, which covers the beam sticking out the other end, I do think Stevie is right by scaling, just not sure whether that is the solution to scale every enemy I would be firing at. Mango |
| ||
| Your camera is at Z-4 and the beam is at Z=0 |
