having trouble with changing weaps (code)

Blitz3D Forums/Blitz3D Programming/having trouble with changing weaps (code)

danio(Posted 2016) [#1]
Hello
As the topic is self explanitory, how can I make the cycling of weapons properly? Im expirimenting with some commands but it doesn't work at all :( Here is my piece of code if anyone wants to even read it xd:
;keys for weap slots
weap_0=KeyDown(2)
weap_1=KeyDown(3)
weap_2=KeyDown(4)
weap_3=KeyDown(5)
weap_4=KeyDown(6)
weap_5=KeyDown(7)
weap_6=KeyDown(8)
weap_7=KeyDown(9)
weap_8=KeyDown(10)

;weap slots
;shotgun
If weap_0 Then ShowEntity weap_shotgun
If weap_0 Then HideEntity weap_sshotgun
If weap_0 Then HideEntity weap_smg
If weap_0 Then HideEntity weap_ssmg
If weap_0 Then HideEntity weap_rl
If weap_0 Then HideEntity weap_gl
If weap_0 Then HideEntity weap_light
If weap_0 Then HideEntity weap_bfg

And the same sequence is repeated to the other weapons, and when I launch a test build, and then I press one of the assigned keys, the models dont dissapear as they should and the model that I want DOES show up, but its in the mess of polygons xd and Id like to know if my mouse script is good enough,because I saw demos better than mines and I was thinking "With these low poly models, and it gets me 20-15 fps???? Thats not possible..." Here it starts:
;mouse look
mxs# = mxs# + MouseXSpeed()
mys# = mys# + MouseYSpeed()

If mys# > 80 Then mys# = 80
If mys# < -80 Then mys# = -80

RotateEntity fps_cam,mys#,-mxs,0
MoveMouse 320,240

If anyone would kindly help me, I will thank you very very much :)


RemiD(Posted 2016) [#2]
About the selection of the weapon you could use a variable to store the model name (a string or a constant) and one variable to store the weapon reference/mesh :

global HandJoint = findchild(CharacterMesh,"Hand")

global WeaponMesh = createmesh()

global WeaponModel%
const CGun% = 1
const CRifle% = 2
const CShotgun% = 3
const CGrenade% = 4
WeaponModel = CGun
ChangeWeapon()

If( keyhit(20)=1 )
 WeaponModel = WeaponModel - 1
 If( WeaponModel < 1 )
  WeaponModel = 1
 endif
 ChangeWeapon()
else if( keyhit(21)=1 )
 WeaponModel = WeaponModel + 1
 If( WeaponModel > 4 )
  WeaponModel = 4
 endif
 ChangeWeapon()
endif

function ChangeWeapon()
 freeentity(WeaponMesh)
 If( WeaponModel = CGun )
  WeaponMesh = copyentity(GunMesh)
 else if( WeaponModel = CRifle )
 WeaponMesh = copyentity(RifleMesh)
 else if( WeaponModel = CShotgun )
 WeaponMesh = copyentity(ShotgunMesh)
 else if( WeaponModel = CGrenade )
  WeaponMesh = copyentity(GrenadeMesh)
 endif
 PositionRotateEntityLikeOtherEntity(WeaponMesh,HandJoint)
 SetEntityAsChildOfOtherEntity(WeaponMesh,HandJoint)
end function



About the first person view and controls and turns moves, see : http://www.blitzbasic.com/codearcs/codearcs.php?code=2933


KronosUK(Posted 2016) [#3]
double post..


KronosUK(Posted 2016) [#4]
My Blitz3d syntax is a bit rusty but in pseudo code you could perhaps do something like this. Have another variable for weapon and use keyhit instead of keydown.

in every game loop


weaponchange =0

If KeyHit(1) Then weaponchange = 1
If KeyHit(2) Then weaponchange = 2
If KeyHit(3) Then weaponchange = 3
If KeyHit(4) Then weaponchange = 4
If KeyHit(5) Then weaponchange = 5
If KeyHit(6) Then weaponchange = 6


If weaponchange> 0 Then 

	HideEntity(weapon)

          Select weaponchange

            	Case 1
              		weapon = weap_shotgun
            	Case 2
             		weapon = weap_smg
            	Case 3
            		weapon = weap_ssmg

       	End Select

	ShowEntity(weapon)

EndIf




danio(Posted 2016) [#5]
Ok thanks for the suggestions :) Ill try it out now


Rick Nasher(Posted 2016) [#6]
There's not enough of your code here to pull any conclusions, but perhaps for the weapons selection you need to use FlushKeys? And are perhaps use KeyHit instead of KeyDown?


Guy Fawkes(Posted 2016) [#7]
KeyDown + 2-second check using millisecs + holding down the same key = <3 (Your answer )


danio(Posted 2016) [#8]
Ok the code in one of the suggestions work, but there's another problem :/ When I understood the code 'n stuff, I've noticed that in the weap change code, it hides one entity, and I've got 8 seperate entities for each weapon, and I was trying to somehow group them into one big entity with calls such as for eg. 0 would be the shotgun, 1 would be the double barrel shotgun and so on and so on, and so I've read the Command Reference and there's no function of that sorts :/ Well maybe there is but I just don't see it? So is there a way I can make the weaps into one group with each seperate call ?


danio(Posted 2016) [#9]
Oh, and I went for KronosUK's code, because to me it's much simpler, and I want the code of the engine to be short and easy understandable at once


Flanker(Posted 2016) [#10]
Maybe you can make something like this :


; load weapons
Dim weapon(10)

weapon(1) = LoadMesh("handgun.b3d")
weapon(2) = LoadMesh("shotgun.b3d")
weapon(3) = LoadMesh("smg.b3d")
etc...

For i = 1 to 10
	HideEntity(weapon(i)) ; hide all weapons
Next
currentweapon = 1 ; handgun for a start


; in your loop
weaponchange = currentweapon

If KeyHit(1) Then weaponchange = 1
If KeyHit(2) Then weaponchange = 2
If KeyHit(3) Then weaponchange = 3
If KeyHit(4) Then weaponchange = 4
If KeyHit(5) Then weaponchange = 5
If KeyHit(6) Then weaponchange = 6

if weaponchange <> currentweapon

	currentweapon = weaponchange

	For i = 1 to 10
		HideEntity(weapon(i)) ; hide all weapons
	Next

	ShowEntity(weapon(currentweapon)) ; show current weapon
endif

that's the idea, you will have to tweak for your needs.


Matty(Posted 2016) [#11]
In Kronos UK code it hides the currently showing entity and then changes the reference that variable points to and shows it. (Just as an explanation).

I think you could benefit from some simple programming exercises if you wanted to get better at understanding how it all works.


danio(Posted 2016) [#12]
Well some lessons for me would be usefull, but I don't have that much time to take lessons about BB3D, because I got alot of work with high school goin on T,T but Flankers code seems to work out, I tweaked in my prefrences, but the compiler gives me an error at HideEntity(weap(i)), hence before that line there's For i = 1 to 8 , and I've got 8 entities, and as I understand, i represents each and every weap entity, instead of 'i' .... Something's not right :/


danio(Posted 2016) [#13]
Aww great ... now the compiler gives me an error about the weapons itself, omg I'm not getting this xd ok here's my code:
Dim weap(8)

weap(1)=LoadMesh("v_shotgun.3ds"):ScaleEntity weap(1),0.1,0.1,0.1:RotateEntity weap(1),-90,0,0
and the LoadMesh sequence repeats for the following 8 entities and it gives me an error with the db-shotgun ....


danio(Posted 2016) [#14]
I mean the first one loads fine but there's a conflict with the second entity :/


danio(Posted 2016) [#15]
Okay let me think another way out for a while .. maybe I might come up with some kind of solution , but I doubt it :/


Matty(Posted 2016) [#16]
If you are in high school (as a student not a teacher) then you are at an age in life where you have the most time you will ever have to learn new skills.....