Communauté

Notifications
Retirer tout

Gros débutant ici

12 Posts
5 Utilisateurs
3 Likes
605 Vu
Lucas Botella
(@lucas-botella)
Active Member
Inscription: Il y a 1 an
Posts: 6
Début du sujet  

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).


   
Citation
(@leonotis)
Active Member
Inscription: Il y a 5 ans
Posts: 11
 

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 


   
RépondreCitation
(@flightboy84)
New Member
Inscription: Il y a 2 ans
Posts: 2
 

Bravo, tu verras tu vas vite pouvoir faire des choses visuels hors console. C'est super bien foutu cette formation.


   
RépondreCitation
Lucas Botella
(@lucas-botella)
Active Member
Inscription: Il y a 1 an
Posts: 6
Début du sujet  

@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.


   
RépondreCitation
Lucas Botella
(@lucas-botella)
Active Member
Inscription: Il y a 1 an
Posts: 6
Début du sujet  

@flightboy84 J'ai hâte, merci !!


   
RépondreCitation
Lucas Botella
(@lucas-botella)
Active Member
Inscription: Il y a 1 an
Posts: 6
Début du sujet  

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


   
RépondreCitation
(@alw1362)
Active Member
Inscription: Il y a 8 ans
Posts: 8
 

@leonotis avec ou sans points-virgules c'est pareil en Lua, le seul cas où c'est obligatoire c'est si l'on met plusieurs instructions sur la même ligne.


   
Ducklear reacted
RépondreCitation
(@alw1362)
Active Member
Inscription: Il y a 8 ans
Posts: 8
 

@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.

 

 


   
RépondreCitation
(@leonotis)
Active Member
Inscription: Il y a 5 ans
Posts: 11
 

@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)


   
RépondreCitation
Lucas Botella
(@lucas-botella)
Active Member
Inscription: Il y a 1 an
Posts: 6
Début du sujet  

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


   
RépondreCitation
Lucas Botella
(@lucas-botella)
Active Member
Inscription: Il y a 1 an
Posts: 6
Début du sujet  

J'ai trouvé comment mettre du son grâce à la doc en ligne ^^


   
RépondreCitation
(@david)
Membre Admin
Inscription: Il y a 9 ans
Posts: 153
 

@lucas-botella Pour intégrer du code tu as un icone "<>" dans la barre d'icones. Ce sera plus lisible.


   
Axork reacted
RépondreCitation
Share:

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.