Help for create bullet of tank

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
lucstanislash
Prole
Posts: 3
Joined: Mon Jan 21, 2019 7:15 pm

Help for create bullet of tank

Post by lucstanislash »

Hello,
I begin in the programmation and in my code, I can't get my bullet of the end of the cannon and not deflect it when I turn the tank. Do you have a code solution with a explication.

This is the code of my game :
Mon jeu de tank.zip
(81.15 KiB) Downloaded 221 times
Thanks for your help


PS: sorry for my bad english (I'm french)
User avatar
NotARaptor
Citizen
Posts: 59
Joined: Thu Feb 22, 2018 3:15 pm

Re: Help for create bullet of tank

Post by NotARaptor »

Salut, bienvenu aux forurms.

Le problème ici est que l'obus ne garde pas en mémoire sa direction/vélocité, il le recalcule à chaque `update`, donc il suit la tourelle.

La solution c'est d'ajouter les membes `dx` et `dy` à l'objet obus, et de les garder au moment du tir.

De plus, il me semble que l'angle `tourelle.angle` est en degrés alors que les fonctions cos et sin attendent un angle en radians.

Je crois que le fonctionnement principal du tir et de l'obus est à refaire, mais déjà de garder la vélocité initiale au lieu de la recalculer à chaque fois sera un bon début!

-----

Hi and welcome to the forums

The problem here is that the shell is not saving its direction/velocity; it's recalculating it every update, so it follows the turret.

The solution is to add two members "dx" and "dy" to the shell object, and set them at the moment you fire.

Another point is that the angle `tourelle.angle` seems to be in degrees whereas the sin and cos functions expect an argument in radians.

I do think the main shell firing system needs to be reworked, but just keeping the initial velocity instead of recalculating it will be a great first step.
lucstanislash
Prole
Posts: 3
Joined: Mon Jan 21, 2019 7:15 pm

Re: Help for create bullet of tank

Post by lucstanislash »

Thank you for your help
I have make what do you propose but the bullet don't appear in the love window when I presse on the x keyboard !
What is the problem ?
tanki battle.zip
(25.39 KiB) Downloaded 283 times
User avatar
NotARaptor
Citizen
Posts: 59
Joined: Thu Feb 22, 2018 3:15 pm

Re: Help for create bullet of tank

Post by NotARaptor »

You need to work out your logic better; it's a bit confusing.

The lifecycle of the projectile (obus) should be:

- Does not exist / is inactive - obus.lance is false - do nothing
- Is being fired right now : set x and y coordinates, set dx and dy, set obus.lance to true
- Is being fired : obus.lance is true - updated and move the projectile, detect collisions, set obus.lance to false if it collides or goes offscreen

For the "is being fired right now", you should either do this in love.keypressed. In love.update, checking love.keyboard.isDown("x") checks if the key is down right now - not if it's just been pressed this frame.

Remember that once the projectile is fired, its angle and velocity WILL NOT CHANGE - unless you want something like a heat-seeking missile.

Something valuely like this (not tested, just writing it here)

Code: Select all

function love.update(dt)
  -- All the other stuff here
  if obus.lance then
    obus.x = obus.x + obus.dx * dt
    obus.y = obus.y + obus.dy * dt
    if obus.x < 0 or obus.x > love.graphics.getWidth() or obus.y < 0 or obus.y > love.graphics.getHeight() then
      obus.lance = false
    end
  end
end

function love.keypressed(key)
  if key == "x" then
    obus.x = tank.x
    obus.y = tank.y
    obus.angle = tank.angle + tourelle.angle
    obus.dx = math.cos(math.rad(obus.angle)) * obus.vitesse
    obus.dy = math.sin(math.rad(obus.angle)) * obus.vitesse
    obus.lance = true
  end
end

function love.draw()
  -- Other stuff here...
  if obus.lance then
    love.graphics.draw(obus.imgObus, obus.x, obus.y, math.rad(obus.angle + 90), 1, 1, 155 , 155)
  end
end
Hope this helps

[S'il y a des mots ou des phrases que tu ne comprends pas, dis-le moi, je peux l'écrire en français aussi]
lucstanislash
Prole
Posts: 3
Joined: Mon Jan 21, 2019 7:15 pm

Re: Help for create bullet of tank

Post by lucstanislash »

It works !! Thank you so much !! :awesome: :awesome:
It's really cool and actually it's just that I do not have to set up when obus.lance = true or false.
But I would like to know when he was better use love.keypressed or love.keyboard.isDown ?

I now have another problem is that I tried to make sure that we can see several bullet in the window, clearly left the bullet launched will destroy and in the meantime launched another bullet.

I followed the explication of this topic : viewtopic.php?t=82527
but it does not work! What's the problem ? In fact, I do not really understand how it works ?
Can you help me ?

this is my work with my try :
tanki battle.zip
(31.26 KiB) Downloaded 198 times
User avatar
NotARaptor
Citizen
Posts: 59
Joined: Thu Feb 22, 2018 3:15 pm

Re: Help for create bullet of tank

Post by NotARaptor »

I figured this would be your next question!

Your issue is that you're trying to treat the variable "obus" both as an array of objects, and as a single object at the same time - which obviously doesn't work.

Of course, the noun "obus" in French is both singular and plural, so that doesn't really help clarify the situation!

You need to separate out when you're dealing with the collection, and when you're dealing with an individual projectile, and use different variable names.

When you want to CREATE a new projectile (firing), create a new object instance and add it to the global array - probably with table.insert()

When you want to DESTROY a projectile (it goes out of range, or hits something), you need to remove it from the global array - with table.remove()

If you're iterating the array with the intention of removing one or more items, make sure you iterate in reverse.
Post Reply

Who is online

Users browsing this forum: Bing [Bot] and 4 guests