Vous lisez 6 fils de discussion
  • Auteur
    Messages
    • #69543
      z0tman
      Participant

      J’ai toutes les valeurs correctes en débogage, mais la vitesse ne s’applique pas au vaisseau.

      je n’arrive pas à voir ce qui manque, sauf quand j’implémente directement ship.vx et ship.vy, mais il se décale vers la diagonale, et non dans le sens d’orientation du vaisseau…

      voici mon code, est-ce que quelqu’un peut m’expliquer comment contrôler la vitesse dans le update à partir d’une fonction boost ?

      io.stdout:setvbuf(‘no’)
      ship={}
      ship.x = 0
      ship.y = 0
      ship.vx = 0
      ship.vy = 0
      ship.angle = -90
      ship.acceleration = 2
      ship.max_speed = 36
      ship.m = 2000
      ship.isMoving = false
      ship.img = love.graphics.newImage(« image/ship.png »)
      ship.engine_img = love.graphics.newImage(« image/engine.png »)

      –variables temporelles pour boost
      boost_duration = 0.3
      lasttime_trigger = 0
      timer = 0

      gravity = 10

      function love.load()
      largeur = love.graphics.getWidth()
      hauteur = love.graphics.getHeight()

      ship.x = largeur/2
      ship.y = hauteur/2
      end

      –Conditionner la vitesse avec des valeurs limites

      function love.update(dt)
      –set timer reference
      timer = timer + dt
      print(timer)
      –set speed according to angle–
      force_x = dt*(ship.m*ship.acceleration/110)*math.cos(math.rad(ship.angle))
      force_y = dt*(ship.m*ship.acceleration/110)*math.sin(math.rad(ship.angle))
      –add gravity to the ship
      ship.vy = ship.vy + ship.m*gravity*dt/1000

      if(love.keyboard.isDown(« q »)) then
      ship.angle = ship.angle – 90*dt
      if(ship.angle < 0) then
      ship.angle = ship.angle + 360
      end
      end

      if(love.keyboard.isDown(« d »)) then
      ship.angle = ship.angle + 90*dt
      if(ship.angle > 360) then
      ship.angle = ship.angle – 360
      end
      end

      if(love.keyboard.isDown(« space »)) then
      lasttime_trigger = timer
      time_trigger_end = lasttime_trigger + boost_duration
      elapsed_time = time_trigger_end – lasttime_trigger
      print(« boost duration « ..boost_duration)
      print(« date of boost start: « ..lasttime_trigger)
      print(« boost will end at : « ..time_trigger_end)
      print(« elapsed time : « ..elapsed_time)
      –code pour le boost qui fait planter Löve
      ship.max_speed = 72
      force_x = force_x*2
      force_y = force_y*2
      print(« force x : « ..force_x)
      print(« force y : « ..force_y)

      print(« ship max speed after boost: »..ship.max_speed)
      if(time_trigger_end > timer) then
      ship.max_speed = ship.max_speed – 36
      print(« ship max speed when boost over: « ..ship.max_speed)
      force_x = force_x/2
      force_y = force_y/2
      print(« force x : « ..force_x)
      print(« force y : « ..force_y)
      end
      –fin de la partie qui bug
      end

      if(love.keyboard.isDown(« z »)) then
      –ship.vy = ship.vy – ship.m*30/50000;
      if(math.abs(ship.vx) <=ship.max_speed) then
      ship.vx = ship.vx + force_x
      else
      if ship.vx >0 then
      ship.vx = ship.max_speed
      else
      ship.vx = -ship.max_speed
      end
      end

      if(math.abs(ship.vy) <=ship.max_speed) then
      ship.vy = ship.vy + force_y
      else
      if ship.vy >0 then
      ship.vy = ship.max_speed/3
      else
      ship.vy = -ship.max_speed
      end
      end

      ship.isMoving = true
      else
      ship.isMoving = false
      end

      ship.x = ship.x + ship.vx*dt
      ship.y = ship.y + ship.vy*dt
      end

      function love.draw()
      love.graphics.draw(ship.img,ship.x,ship.y,math.rad(ship.angle),1,1,ship.img:getWidth()/2,ship.img:getHeight()/2)
      if(ship.isMoving == true)then
      love.graphics.draw(ship.engine_img,ship.x,ship.y,math.rad(ship.angle),1,1,ship.engine_img:getWidth()/2,ship.engine_img:getHeight()/2)
      else

      local sDebug = « Debug »
      sDebug = sDebug.. » angle = « ..tostring(ship.angle)
      sDebug = sDebug.. » vx = »..tostring(ship.vx)
      sDebug = sDebug.. » vy = »..tostring(ship.vy)
      love.graphics.print(sDebug,0,0)

      end
      end

    • #69545
      Stormbringer
      Participant

      Bonjour,
      Comme voilà bien trop longtemps que je ne suis pas passé par ici,j’en profite pour tenté de donner un petit coup de main.
      1 – S’il vous plait, lorsque vous mettez du code dans votre demande d’aide, c’est bien, mais utilisez les balises #code pour formater votre code et que nous puissions le récupérer et le tester sans efforts supplémentaire. Là, j’ai du reprendre tout le code pour corriger les problèmes de mise en forme du forum (reprise des  » pour les string, reprise des commentaires, reprise des soustractions, ….)

      2 – d’après ce que je vois, vous calculez force_x et force_y dans le update(dt) mais il n’est jamais utilisé. du coup, votre ship ne reçoit que la gravité avec la masse … il descend toujours.

      Je ne sais pas si vous avez codé tout ce bloc d’un coup, mais travaillez par itérations, c’est à dire, supprimez tout le code inutile dans votre cas de bug (par exemple, je fais un couper/coller dans un autre fichier temporaire pour ne rien perdre). Ainsi, votre portion de bug sera plus réduite.
      Puis, une fois corrigé, vous réintégrez petit à petit le code mis de coté en testant si cela fonctionne toujours.

      Essayez ça, puis, si ça ne passe toujours pas, revenez vers nous (en ne mettant que ce qui cloche et en formatant correctement votre code. Pensez aux balises, merci 😉

      A++
      Stormbringer

    • #69546
      z0tman
      Participant

      Je suis nouveau ici, donc je ne sais pas trop comment formuler ma question.
      En fait, c’est à la suite du module Lunar Lander, le vaisseau tourne et accélère avec les touches q, d et z.

      J’ai voulu ajouter un booster juste en mettant à jour la vitesse maximale du vaisseau et la force d’accélération, mais ils semble qu’il faille reprendre toute n’a démarche effectuée pour orientée la poussée du propulseur dans la direction oû pointe le vaisseau.

      Il faut tester sur une durée courte et fermer Lôve assez tôt pour retrouver mes tests de déboguage dans la console de zerobrane.

      Je verrai quand je pourrai, mais ça fonctionne si je remplace les forces par exemple par ship.vx = ship.vx*2 et idem pour ship.vy : le vaisseau fait une accélération vers la diagonale droite mais sans respecter la direction du vaisseau…

      Ça fait que c’est plus compliqué au niveau de l’organisation du code si ça fait faire en double le travail sur la vitesse, qui doit se rétablir à la fin du temps imparti pour éviter un crash, la principale difficulté pour réaliser un boost contrôlé.

    • #69553
      z0tman
      Participant

      En effet, il y a des conversions de symbole pendant le copié collé.
      Les guillemets changent, et on perd les double tirets pour les lignes de commentaires, ainsi que des indentations…

      J’ai un problème sous ubuntu que je dois réinstaller, pendant que je suis sur windows, j’essaie de le faire pareil.

    • #69555
      z0tman
      Participant

      J’ai pu reconstituer le code sous windows 10. Vu que je refais toute l’installation sous Ubuntu que j’apprends également à utiliser, ce n’est pas une grosse perte en soit, mais c’est vrai qu’il y a un problème avec les tirets dans la copie et avec les indentations.

      Je peux les garder juste en mettant # en balises, c’est ça ?

    • #69556
      z0tman
      Participant

      J’ai résolu le problème sous Windows finalement !

      En fait, il faut mettre dans une fonction ce qui a été fait sur la position quand on appuie sur « haut » (ou « z » dans mon cas).

      Après, il faut l’ajouter après avoir modifié temporairement la force et la vitesse maximale.

      C’est un peu plus compliqué à organiser (ça fait deux fonctions en plus avant la fonction love.update), mais l’avantage, c’est que ça fait plus réaliste pour gérer les changements de trajectoires où il faut redonner de l’accélération après une perte de vitesse…ce qui n’est pas possible avec le code source du cours uniquement.

    • #69557
      z0tman
      Participant

      Voici le code que j’ai sans débogage dans la console de zeroBrane :

      io.stdout:setvbuf('no')
      
      ship={}
      ship.x = 0
      ship.y = 0
      ship.vx = 0
      ship.vy = 0
      ship.angle = -90
      ship.acceleration = 2
      ship.max_speed = 36
      ship.m = 2000
      ship.isMoving = false
      ship.img = love.graphics.newImage("images/ship.png")
      ship.engine_img = love.graphics.newImage("images/engine.png")
      
      --variables temporelles pour boost
      boost_duration = 0.3
      lasttime_trigger = 0
      timer = 0
      
      gravity = 10
      
      function love.load()
        largeur = love.graphics.getWidth()
        hauteur = love.graphics.getHeight()
      
        ship.x = largeur/2
        ship.y = hauteur/2
      end
      
      --Conditionner la vitesse avec des valeurs limites
        function setSpeed(max_speed)
          if(math.abs(ship.vx) <= max_speed) then
            ship.vx = ship.vx + force_x
          else
            if ship.vx >0 then
              ship.vx = max_speed
            else
              ship.vx = -max_speed
            end
          end
      
          if(math.abs(ship.vy) <=max_speed) then
            ship.vy = ship.vy + force_y
          else
            if ship.vy >0 then
              ship.vy = max_speed/3
            else
              ship.vy = -max_speed
            end
          end
        end
      
        function updatePosition(deltaTime)
          ship.x = ship.x + ship.vx*deltaTime
          ship.y = ship.y + ship.vy*deltaTime
        end
      
      function love.update(dt)
        --set timer reference
        timer = timer + dt
        print(timer)
        --set speed according to angle–-
        force_x = dt*(ship.m*ship.acceleration/110)*math.cos(math.rad(ship.angle))
        force_y = dt*(ship.m*ship.acceleration/110)*math.sin(math.rad(ship.angle))
        --add gravity to the ship--
        ship.vy = ship.vy + ship.m*gravity*dt/1000
      
        if(love.keyboard.isDown("q")) then
          ship.angle = ship.angle - 90*dt
          if(ship.angle < 0) then
            ship.angle = ship.angle + 360
          end
        end
      
        if(love.keyboard.isDown("d")) then
          ship.angle = ship.angle + 90*dt
          if(ship.angle > 360) then
            ship.angle = ship.angle - 360
          end
        end
      
        if(love.keyboard.isDown("space")) then
          lasttime_trigger = timer -- sauvegarde l'instant où on enclenche le boost
          time_trigger_end = lasttime_trigger + boost_duration -- définit l'instant où le boost prendra fin
          elapsed_time = time_trigger_end - lasttime_trigger -- valeur supposée être égale à boost_duration
          --code pour le boost 
          ship.max_speed = 72
          force_x = force_x*4
          force_y = force_y*4
          setSpeed(ship.max_speed)
      
          if(time_trigger_end > timer) then
            ship.max_speed = ship.max_speed - 36
            force_x = force_x/4
            force_y = force_y/4
            setSpeed(ship.max_speed)
          end
          --fin de la partie pour le boost
        end
      
        if(love.keyboard.isDown("z")) then
          setSpeed(ship.max_speed)
          ship.isMoving = true
        else
          ship.isMoving = false
        end
        
        updatePosition(dt)
        
      end
      
      function love.draw()
        love.graphics.draw(ship.img,ship.x,ship.y,math.rad(ship.angle),1,1,ship.img:getWidth()/2,ship.img:getHeight()/2)
        if(ship.isMoving == true)then
          love.graphics.draw(ship.engine_img,ship.x,ship.y,math.rad(ship.angle),1,1,ship.engine_img:getWidth()/2,ship.engine_img:getHeight()/2)
        else
      
        local sDebug = "Debug"
        sDebug = sDebug.." angle = "..tostring(ship.angle)
        sDebug = sDebug.." vx ="..tostring(ship.vx)
        sDebug = sDebug.." vy ="..tostring(ship.vy)
        love.graphics.print(sDebug,0,0)
      
        end
      end
Vous lisez 6 fils de discussion
  • Vous devez être connecté pour répondre à ce sujet.