Delay when fireing
Blitz3D Forums/Blitz3D Beginners Area/Delay when fireing
| ||
Hi all, For my new space game it is necessary to be able to use Keydown() when fireing whitout creating a new shot every frame... In general it's easy to realize this by a code like this: firedelay# = firedelay# - time_var# (frame indepandet variable) if keydown(57) and firedelay# <= 0 "fire" firedelay# = 1 endif But because I use functions this wont work because "firedelay#" is not saved until the next frame. So I thought I could use an extra Type;field like shot\firedelay# instead of simply firedelay# But now Blitz wants me to set For shot.shot = each shot and the function "fire" wont work any more. Function feuer_frei() For s.schuss = Each schuss If KeyDown(57) And s\fire_delay# <= 0 s\fire_delay# = 1 fire_shot() PlaySound(feuer) EndIf move_shot() Next End Function I hope you got what I mean and please excuse the awful german-english mixed code :-) |
| ||
Here's the function i have writed times ago for a simple game...it fire a bullet at a certain time-rate...Function create_missile() a.missile=New missile a\image=missile a\posx=MouseX() ;the x position of missile creation is the mouse coords(the same coords of my jet of course) a\posy=a\posy+MouseY()-30 ;the missile creation start a bit up to the jet(for simulating the launch-bay hehe) a\avanzamento=4 ;the speed of the missile a\contatore=0 ;the starting value of the animation End Function Function play_missile() For a.missile=Each missile DrawImage a\image,a\posx,a\posy a\posy=a\posy-a\avanzamento ;this move the missile up a\contatore=a\contatore+a\avanzamento ;this start the counter of the missile course For b.alieno=Each alieno If ImagesCollide(a\image,a\posx,a\posy,0,b\image,b\movx,b\movy,0) ;if the alien collide with the missile the energy go down of one unit b\energia=b\energia-1 If b\energia=<0 Then ;Delete b crea_esplosione() Delete b EndIf Delete a ;if the missile collide with the alien the missile stop it's existance :P Exit ;exit loop if missile is dead. will cause error as they's no missile to check against the aliens EndIf Next Next End Function And here's some snippet of the main code to shoot at intervals while holding the mouse button! DrawImage aereo,MouseX(),MouseY() If MouseDown(1)=1 ;if i hit the mouse button i create a missile If MilliSecs() > timer_proiettili1 + 150 ;i use a "slowdown"of 100 millisecs to each fired bullet timer_proiettili1=MilliSecs() create_missile() EndIf EndIf play_missile() ;this start the missil anim I hope it's clear.... |
| ||
Thanks, but your code only works if it's not in a function. Unfortunately I must use a function to keep the code "readeable" (so that the main loop consists of as less lines/words as possible). |
| ||
Nebula, why don't you just make firedelay global? It will retain it's value between function calls, then. ;) |
| ||
You're my hero big10p! I tried it some time before with global but, made a mistake as I now kwon. |
| ||
Yes make firedelay global or add a type field in this manner "alien\delay_type=millisecs()". Make a type variable that contain the millisecs variable. |
| ||
Like this:Function esplosione() For c.esplosione = Each esplosione Select c\grandezza Case 1 ;small If MilliSecs() > c\timer + 50 ;i use a slowdown of 50 millisecs c\timer = MilliSecs() c\frame = (c\frame+1) Mod 15 ;i loop trough the 7 frames of animation:this is a smaller explosion EndIf If c\frame => 14 Delete c Else DrawImage explosion1,c\posizX,c\posizY,c\frame EndIf End Select Next End Function As you see it's a function. |
| ||
I the tutorials section there is a topic called CHECK FOR COLLISION USING TYPES here: http://www.blitzbasic.co.nz/Community/posts.php?topic=35127 This has a multiple bullet gun with adjustable speed and a way to check for collision with the missle and do something if the missle hits something. The bullet code is from Ross and Ross C. Rest is me (what I didn't learn from B3D. Use... Enjoy... -ROOK PS I am most of a Newbie as well : ) |
| ||
Now I have another problem. How is it possible to get the world-relatve coordinates of a vertex. The spaceship in my game has 2 guns, one on each wing, but I'm unable to let it shoot out of these especially when the ship is rolled. My first attemp was to do it using Entityx() + x but that does only work when the ship is not turned or rolled. My next attemp used entityroll() and Tan to get the position, but that worked just in some cases/angles. Finaly I tried it using Getsurface() and Entityx() + Vertexx() but that didn't work either. |
| ||
Your best bet is to attach a couple of children to the right bits. 2 ways of doing this. 1. Stick a bone where the gun port is, name it something like gun and then in your code do: gunport = findchild(ship,"gun") Then you can entityx(gunport,true) to find the xcoord etc. 2. Create a sphere (later turn it into a pivot) just after loading your ship mesh. Parent it to this ship (entiyparent gunport,ship) and move it around until it's in the right place. Once it's in the right place instead of using a sphere use a pivot. And again, entityx(gunport,true) will find it's position. You can use entitypitch, yaw and roll too, just make sure you used the ,true flag when finding these to have them translated into real world positions. I would strongly recomend using the bone method as then nothing in your game is hard coded (apart from the bone names) so you can update your ship etc without having to arse around with co-ords of children. |
| ||
By sticking a bone to the object you mean a bone that is normaly used for animating? I added the bone (3dsmax) named it "leftgun" and searched it with Findchild but the programm crashes when it has to position the shot, sending "Entity does not exsist". |
| ||
No idea about 3dsmax as I don't have $2000 knocking around in my back pocket. Bones are case sensitive though and I believe some exporters add spaces or truncate the names. You'll have to experiment. Milkshape works fine. [edit] You'll have to load your mesh with loadanimmesh instead of loadmesh otherwise you won't get any bones loaded. This bit of code will at least display any bones that are in your mesh. Graphics3D 640,480,32,2 mesh = LoadAnimMesh("ship.b3d") c = CountChildren(mesh) For n=0 To c Print GetChild (mesh,n) Next WaitKey |
| ||
Thanks, now it works! Now I just must make the model having its texture again. By the way its $4000, but there LEGAL ways to get it much cheaper. |
| ||
Either way, at that price I'd rather buy a new car. |
| ||
I got a serious problem with the texture now, it won't show it. If load the mesh with loadmesh, the bones are shown, the ship has its texture, but as you said Blitz doesn't recognize the bones. If I load it with Loadanimmesh, it has its bones and recognizes them, but the texture is not shown. The code is this (how do I make this nice black-green code window?): ship\entity = LoadAnimMesh("models/ships/shipB.3ds") PositionEntity ship\entity,0,-6,0 ScaleEntity ship\entity,0.1,0.1,0.1 EntityShininess ship\entity, 0.5 EntityType ship\entity, 1 EntityRadius ship\entity, 8 colortex = LoadTexture("models/ships/ship_texture.png") TextureBlend colortex, 1 EntityTexture ship\entity, colortex,0,0 |