Gros débutant ici
Salut à tous.
Je viens de suivre l'initiation au code pour les grands débutants (comme moi). J'ai voulu coder un soin, comme ça pour voir mais sans que ça ne puisse dépasser les HP max. Je ne sais pas si c'est opti mais j'ait fait ça, ça marche, et je suis fier de moi ^^. Merci pour tout !
Hero = {}
Hero.energie = 100
Hero.energieMax = 150
Hero.soin = 75
print("L'energie du Héro est de", Hero.energie, " sur" , Hero.energieMax)
function soin (perso)
perso.energie = perso.energie + perso.soin
print("L'energie actuelle du Héro est", perso.energie)
if perso.energie >= perso.energieMax then
perso.energie = perso.energieMax
end
end
soin(Hero)
print( "L'energie du héro après le soin est de", Hero.energie, " sur", Hero.energieMax)
==> L'energie du Héro est de 100 sur 150
L'energie actuelle du Héro est 175
L'energie du héro après le soin est de 150 sur 150
Programme terminé en 0.08 secondes (pid : 54504).
C’est très bien, moi j’aurai mis le if à l’extérieur de ta fonction pour qu’elle soit toujours consulter même si tu n’applique pas un soin, en particulier si tu codes avec une GameLoop. par contre tu ne termine pas tes lignes avec un point virgules ?
Bonne continuation
Bravo, tu verras tu vas vite pouvoir faire des choses visuels hors console. C'est super bien foutu cette formation.
@leonotis Hello, merci pour ce retour 🙂 je n'ai pas encore essayé les boucles et pour les points virgules cela n'a pas encore été abordé dans les formations que j'ai suivi ici... Comme je l'ai dit je suis un gros débutant.
Je viens de finir l'atelier sur pong et je suis trop hypé.
j'ai fait en sorte que les raquettes soient un peu plus rapide que la balle et j'ai réussi à faire une balle ronde en arrondissant le carré ... en l'écrivant je me dis qu'il y avait sans doute moyen de faire un rond directement ... je vous met le code juste après mais j'ai une interrogation:
J'avais modifié le code pour que la balle accélère à chaque rebond et c'était rigolo mais à partir d'une certaine vitesse si la balle sortait aucun point n'était marqué et la balle disparaissait. Est-ce du à ma machine ou expérimente-je les limites des possibles ?
j'ai aussi essayé de modifier la largeur des raquettes pour qu'elles soient plus élégantes et ça m'a fait perdre la collision avec le bas de l'écran pour des raisons que je ne m'explique pas... si une bonne âme veut se risquer à une hypothèse
Mon code fonctionnel:
pad = {}
pad.x = 10
pad.y = 260
pad.largeur = 20
pad.hauteur = 80
pad.vitesse = 3
pad2 = {}
pad2.largeur = 20
pad2.x = love.graphics.getWidth() - (pad2.largeur+10)
pad2.y = 260
pad2.hauteur = 80
pad2.vitesse = 3
balle = {}
balle.x = 400
balle.y = 300
balle.largeur = 20
balle.hauteur = 20
balle.vitesse_x = 2
balle.vitesse_y = 2
score = {}
score.joueur1 = 0
score.joueur2 = 0
function centreBalle ()
balle.x = love.graphics.getWidth() / 2
balle.x = balle.x - balle.largeur / 2
balle.y = love.graphics.getHeight() / 2
balle.y = balle.y - balle.hauteur / 2
balle.vitesse_x = 2
balle.vitesse_y = 2
end
function love.load()
centreBalle()
end
function love.update()
-- comportement de la balle
balle.x = balle.x + balle.vitesse_x
balle.y = balle.y + balle.vitesse_y
-- controle du pad
if love.keyboard.isDown("s") and pad.y <= love.graphics.getHeight() - pad.hauteur then
pad.y = pad.y + pad.vitesse
end
if love.keyboard.isDown("z") and pad.y >= 0 then
pad.y = pad.y - pad.vitesse
end
-- controle du pad 2
if love.keyboard.isDown("down") and pad2.y <= love.graphics.getHeight() - pad2.hauteur then
pad2.y = pad2.y + pad2.vitesse
end
if love.keyboard.isDown("up") and pad2.y >= 0 then
pad2.y = pad2.y - pad2.vitesse
end
-- rebond de la balle
if balle.x == 0 then
balle.vitesse_x = balle.vitesse_x * -1
end
if balle.x == love.graphics.getWidth() - balle.largeur then
balle.vitesse_x = balle.vitesse_x * -1
end
if balle.y == 0 then
balle.vitesse_y = balle.vitesse_y * -1
end
if balle.y == love.graphics.getHeight() - balle.hauteur then
balle.vitesse_y = balle.vitesse_y * -1
end
-- collision avec le pad 1
if balle.x <= pad.x + pad.largeur and balle.y + balle.hauteur > pad.y and balle.y < pad.y + pad.hauteur then
balle.vitesse_x = -balle.vitesse_x
balle.x = pad.x + pad.largeur
end
-- collision avec le pad 2
if balle.x + balle.largeur >= pad2.x and balle.y + balle.hauteur > pad2.y and balle.y < pad2.y + pad2.hauteur then
balle.vitesse_x = -balle.vitesse_x
balle.x = pad2.x - balle.largeur
end
-- sortie de la balle à gauche
if balle.x == 0 then
score.joueur2 = score.joueur2 + 1
centreBalle()
end
-- sortie de la balle à droite
if balle.x + balle.largeur == love.graphics.getWidth() then
score.joueur1 = score.joueur1 + 1
centreBalle()
end
end
function love.draw()
-- pad 1
love.graphics.rectangle("fill",pad.x,pad.y,pad.largeur,pad.hauteur,5,5)
-- pad 2
love.graphics.rectangle("fill",pad2.x,pad2.y,pad2.largeur,pad2.hauteur,5,5)
-- balle
love.graphics.rectangle("fill",balle.x,balle.y,balle.largeur,balle.hauteur,10,10)
-- score
local score = score.joueur1.."-"..score.joueur2
love.graphics.print(score, (love.graphics.getWidth() / 2) -10 , 5)
-- ligne médiane
love.graphics.rectangle("fill",love.graphics.getWidth() / 2, 0, 1, love.graphics.getHeight())
end
@lucas-botella Pour ma part j'aurais fais de la manière suivante :
function soin (perso) if perso.energie + perso.soin > perso.energieMax then perso.energie = perso.energieMax else perso.energie = perso.energie + perso.soin end print("L'energie actuelle du Héro est", perso.energie) end
On contrôle si l'énergie + le soin dépasse l'énergie max, si c'est le cas on met le maximum possible sinon on ajoute seulement le soin.
@lucas-botella , mon hypothèse à ton problème est que le faite d'augmenter la vélocité de ta balle induit de plus grands écarts de positions entre chaque update.
Par exemple si ta balle, à force de prendre de la vitesse, se retrouve avec une velocité de 10px à chaque update et ta raquette fait une largeur de 2px.
Ta balle risque de "sauter" ta raquette et le test de collision ne sera pas vrais car tes box collider ne se rencontreront pas.
Pour la sortie d'écran avec l'ajout de point au score c'est similairement la même chose car tu vérifies si ta balles arrive à une coordonnée précise à la sortie de l'écran.
-- sortie de la balle à gauche if balle.x == 0 then score.joueur2 = score.joueur2 + 1 centreBalle() end
Donc si je reprends ton code : si balle.x = 0 alors sortie de l'écran (grossomodo)
mais si ta balle se déplace trop vite et saute ce fameux zéro, alors la condition n'est pas valide, pour le programme il n'y pas pas de sortie d'écran car tu teste juste la frontière de ton écran et non pas tout l’extérieur de celui ci.
Je te propose de changer ton symbole "==" par > ou < suivant le coté de l'écran que tu teste.
Donc : si balle.x est inférieur à zéro alors on est à l’extérieur !
et que tu sois à -1 ou -5 ou -25 ou même -0.00001 la condition sera valide car tu es inférieur à zéro, tu peux aussi faire : if balle.x <= 0 (pour inclure zéro)
J'ai amélioré mon Pong et j'ai trouvé les réponses à mes questions d'hier. La nuit porte conseil.
Dans cette version j'ai enfin des pad fins et une petite balle (je trouve cela plus élégant), les rebonds fonctionnent et le score aussi. J'ai de plus ajouté une fonction pour relancer le jeu du départ sans avoir à quitter. A 10 points le jeu s'arrête, la balle est au centre et un message apparait du côté du vainqueur. Je vais essayer de trouver comment ajouter des sons et je pense que mon Pong sera fini (pour le moment) et que je m'autoriserai à passer à la suite.
voici le code:
pad = {}
pad.x = 10
pad.y = 260
pad.largeur = 5
pad.hauteur = 80
pad.vitesse = 3
pad2 = {}
pad2.largeur = 5
pad2.x = love.graphics.getWidth() - (pad2.largeur+10)
pad2.y = 260
pad2.hauteur = 80
pad2.vitesse = 3
balle = {}
balle.x = 400
balle.y = 300
balle.largeur = 10
balle.hauteur = 10
balle.vitesse_x = 2
balle.vitesse_y = 2
score = {}
score.joueur1 = 0
score.joueur2 = 0
messageVictoire = {}
messageVictoire.joueur1 = "Bravo joueur 1"
messageVictoire.joueur1_x =900
messageVictoire.joueur1_y =700
messageVictoire.joueur2 = "Bravo joueur 2"
messageVictoire.joueur2_x =900
messageVictoire.joueur2_y =700
function centreBalle ()
balle.x = love.graphics.getWidth() / 2
balle.x = balle.x - balle.largeur / 2
balle.y = love.graphics.getHeight() / 2
balle.y = balle.y - balle.hauteur / 2
balle.vitesse_x = 2
balle.vitesse_y = 2
end
function relance()
score.joueur1 = 0
score.joueur2 = 0
pad.vitesse = 3
pad2.vitesse = 3
messageVictoire.joueur1_x =900
messageVictoire.joueur1_y =700
messageVictoire.joueur2_x =900
messageVictoire.joueur2_y =700
centreBalle()
end
function love.load()
centreBalle()
end
function love.update()
-- comportement de la balle
balle.x = balle.x + balle.vitesse_x
balle.y = balle.y + balle.vitesse_y
-- controle du pad
if love.keyboard.isDown("s") and pad.y <= love.graphics.getHeight() - pad.hauteur then
pad.y = pad.y + pad.vitesse
end
if love.keyboard.isDown("z") and pad.y >= 0 then
pad.y = pad.y - pad.vitesse
end
-- controle du pad 2
if love.keyboard.isDown("down") and pad2.y <= love.graphics.getHeight() - pad2.hauteur then
pad2.y = pad2.y + pad2.vitesse
end
if love.keyboard.isDown("up") and pad2.y >= 0 then
pad2.y = pad2.y - pad2.vitesse
end
-- relancer une partie
if love.keyboard.isDown("r") then
relance()
end
-- rebond de la balle
if balle.y <= 0 then
balle.vitesse_y = balle.vitesse_y * -1
end
if balle.y >= love.graphics.getHeight() - balle.hauteur then
balle.vitesse_y = balle.vitesse_y * -1
end
-- collision avec le pad 1
if balle.x <= pad.x + pad.largeur and balle.y + balle.hauteur > pad.y and balle.y < pad.y + pad.hauteur then
balle.vitesse_x = - balle.vitesse_x
balle.x = pad.x + pad.largeur
end
-- collision avec le pad 2
if balle.x + balle.largeur >= pad2.x and balle.y + balle.hauteur > pad2.y and balle.y < pad2.y + pad2.hauteur then
balle.vitesse_x = - balle.vitesse_x
balle.x = pad2.x - balle.largeur
end
-- sortie de la balle à gauche
if balle.x <= 0 then
score.joueur2 = score.joueur2 + 1
centreBalle()
end
-- sortie de la balle à droite
if balle.x + balle.largeur >= love.graphics.getWidth() then
score.joueur1 = score.joueur1 + 1
centreBalle()
end
-- victoire joueur 1
if score.joueur1 >= 10 then
pad.vitesse = 0
pad2.vitesse = 0
balle.vitesse_x = 0
balle.vitesse_y = 0
messageVictoire.joueur1_x = love.graphics.getWidth() / 4
messageVictoire.joueur1_y = love.graphics.getHeight() / 2
end
-- victoire joueur 2
if score.joueur2 >= 10 then
pad.vitesse = 0
pad2.vitesse = 0
balle.vitesse_x = 0
balle.vitesse_y = 0
messageVictoire.joueur2_x = love.graphics.getWidth() * (3/4)
messageVictoire.joueur2_y = love.graphics.getHeight() / 2
end
end
function love.draw()
-- pad 1
love.graphics.rectangle("fill",pad.x,pad.y,pad.largeur,pad.hauteur,2,2)
-- pad 2
love.graphics.rectangle("fill",pad2.x,pad2.y,pad2.largeur,pad2.hauteur,2,2)
-- balle
love.graphics.rectangle("fill",balle.x,balle.y,balle.largeur,balle.hauteur,5,5)
-- score
local score = score.joueur1.."-"..score.joueur2
love.graphics.print(score, (love.graphics.getWidth() / 2) -10 , 5)
-- ligne médiane
love.graphics.rectangle("fill",love.graphics.getWidth() / 2, 0, 1, love.graphics.getHeight())
-- victoire J1
love.graphics.print(messageVictoire.joueur1, messageVictoire.joueur1_x, messageVictoire.joueur1_y)
-- victoire J2
love.graphics.print(messageVictoire.joueur2, messageVictoire.joueur2_x, messageVictoire.joueur2_y)
end
J'ai trouvé comment mettre du son grâce à la doc en ligne ^^
@lucas-botella Pour intégrer du code tu as un icone "<>" dans la barre d'icones. Ce sera plus lisible.
- 6 Forums
- 240 Sujets
- 844 Posts
- 0 En ligne
- 45.5 {numéro}K Membres