Auteur Sujet: Programme Lua  (Lu 925 fois)

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« le: 24 mai 2010 à 10:49:33 »
Qui sait programmer en Lua ?
Moi je suis tout nouveaux en programmation Lua.
J'utilise LualDE, un homebrew pour psp qui permet de programmé en Lua (sans blague  :o).

J'ai donc un petit peu appris les bases.
HelloWord = Succès
Affichez du texte = Succès
Affichez une image = Succès
Créez un menu = Succès
Collisions = Succès
Créez un jeux (Zelda) = Abandon (trop compliqué)
Créez un jeu (Mario) = Failed (j'ai essayé)..
Créez un jeu (Pong) = S U C C E S

Justement, j'ai un problème pour que sa soit un "Pong".

J'ai tous les "personnages", la "balle" et les 2 "raquettes".

Le problème, je peux contrôler la balle, au lieu d'une des raquettes (normal, à la base, je jouais à faire des collisions).

Problème n°1: Comment faire pour qu'une raquette soit contrôler par l'ordinateur et que la balle agisse comme une balle ? Car moi je serais simplement la mettre à coté d'une plateforme mais elle restera immobile..

Vous avez compris mon problème ?
Merci de m'aidez..
« Modifié: 25 mai 2010 à 18:37:21 par Zstan »

Hitochen

  • Baka Pink
  • Fan de mangas
  • ***
  • Messages: 711
    • Voir le profil
Programme Lua
« Réponse #1 le: 24 mai 2010 à 11:35:01 »
Tiens je t'ai trouvé un code sympa et assez clair, j'y est jeté un œil, il est bien commenter et agréable a lire
J'espère que sa suffira, j'ai jamais programmé en lua mais le programme a l'air sérieux.
--[[

PONG BY HAKURYU188
6/10/2009
www.hakuryu188-dev.blospot.com

--]]

function init()

size_ball = 16
load = false

   while load == false do
   System.draw()
   screen:clear()

   key = Controls.read()

   screen:print(50,60,"Pong",Color.new(255,255,255))
   screen:print(50,80,"Size ball: "..size_ball,Color.new(255,255,255))

   if key:right() and size_ball < 64 then
      size_ball = size_ball + 1
   end

   if key:left() and size_ball > 1 then
      size_ball = size_ball - 1
   end

   if key:cross() then
      load = true
   end

   System.endDraw()
   screen.flip()
   end

key = nil
System.sleep(300)
pong()

end

function reboot()
Image.free(ball_img)
Image.free(barre_img)
init()
end

function pong()

----------------------------------------------------------------------

function pspDebugScreenInit()
   System.draw() -- uniquement avec euphoria
   System.setCpuSpeed(cpu) -- Ne pas oublier de tester en 222 Mhz
   screen:clear()
end

function sceKernelSleepThread()
   System.endDraw() -- uniquement avec euphoria
   screen.flip()
end

----------------------------------------------------------------------

-- variable permettant d'entrer dans la boucle
quitter = false

-- vitesse du CPU
cpu = 333

-- on definit des variables indicant la taille de l'ecran
screen_value = {
X = 480,
Y = 272
}

math.randomseed(os.time())

-- creation de la balle:

-- on cree une image vide et de taille definit par size_ball
ball_img = Image.createEmpty(size_ball,size_ball)
-- on applique la couleur a la balle
ball_img:clear(Color.new(255,0,0))


-- creation des barres des joueurs:

-- taille de la barre des joueurs
size_barX = 10
size_barY = 40
-- on cree une image vide et de taille definit par size_bar
barre_img = Image.createEmpty(size_barX,size_barY)
-- on applique la couleur a la barre
barre_img:clear(Color.new(255,255,255))

-- vitesse des barres
barre_speed = 6

-- taille de la barre centrale
sizecentralbar = 3

-- position du score
scoreposition = 160

-- on cree une barre pour chaques joueurs
barre = {
-- le joueur 1
joueur1 = barre_img,
joueur1_posX = 0 + 20,
joueur1_posY = screen_value.Y/2 - size_barY/2,

-- le joueur 2
joueur2 = barre_img,
joueur2_posX = screen_value.X - size_barX - 20,
joueur2_posY = screen_value.Y - size_barY
}

-- on definit les scores de depart des deux joueurs
score = {
joueur1 = 0,
joueur2 = 0
}

-- on positionne la balle au centre de l'ecran pour le debut du jeu
position_ball = {
X = screen_value.X/2 + size_ball/2,
Y = screen_value.Y/2 + size_ball/2
}

-- vitesse de la balle au depart
ball_speedX = 3
ball_speedY = 3

-- vitesse minumum que peut atteindre la balle
ball_speedmin = 1

-- vitesse maximum que peut atteindre la balle
ball_speedmax = 7

-- coeficient de vitesse de la balle
ball_speedcoef = 1.2

posX = ball_speedX
posY = ball_speedX

-- on cree une fonction pour les colisions:
function colision()

-- si la balle sort...

   -- si la balle est dehors du cote du joueur1...
   if position_ball.X <= 0 then
      score.joueur2 = score.joueur2 + 1 -- on augmente le score d'un point du joueur 2
      replace_ball() -- on replace la balle au centre
   end

   -- si la balle est dehors du cote du joueur2...
   if position_ball.X >= screen_value.X then
      score.joueur1 = score.joueur1 + 1 -- on augmente le score d'un point du joueur 1
      replace_ball() -- on replace la balle au centre
   end


-- Pour que la balle rebondisse sur les barres...

   -- rebond sur la barre du joueur 1
   if position_ball.X <= barre.joueur1_posX + size_barX + ball_speedX and position_ball.X > barre.joueur1_posX then
      if position_ball.Y + size_ball >= barre.joueur1_posY and position_ball.Y <= barre.joueur1_posY + size_barY then
         posX = ball_speedX
      end
   end

   -- rebond sur la barre du joueur 2
   if position_ball.X + size_ball >= barre.joueur2_posX - ball_speedX and position_ball.X < barre.joueur2_posX + size_barX/2 then
      if position_ball.Y + size_ball >= barre.joueur2_posY and position_ball.Y <= barre.joueur2_posY + size_barY then
         posX = -ball_speedX
      end
   end


-- rebond de la balle sur les cotes

   if position_ball.Y <= 1 then
      posY = ball_speedY
   end

   if position_ball.Y >= screen_value.Y - size_ball then
      posY = -ball_speedY
   end

end

-- fonction indicant les coordonnees de la balle quand un joueur a perdu
function replace_ball()
position_ball.X = screen_value.X/2 + size_ball/2
position_ball.Y = screen_value.Y/2 + size_ball/2
end

-- inteligence artificielle du jeu
function ia()

   -- si la balle est dans la zone du joueur 2...
   if position_ball.X > (screen_value.X/2) and posX > 0 then

      -- si la balle est au dessus de la barre
      if position_ball.Y < (barre.joueur2_posY + (size_barY/2)) - (size_ball/2) then
         if barre.joueur2_posY > 0 then
            barre.joueur2_posY = barre.joueur2_posY - 5
         end
      end

      -- si la balle est au dessous de la barre
      if position_ball.Y > (barre.joueur2_posY + (size_barY/2)) + (size_ball/2) then
         if barre.joueur2_posY < (screen_value.Y - size_barY) then
            barre.joueur2_posY = barre.joueur2_posY + 5
         end
      end
   end
end

-- element selectionner au depart
local select = 1

-- statut de depart
local statut = "menu"

while not quitter == true do -- la boucle

pspDebugScreenInit() -- initialisation de l'ecran en mode debug

key = Controls.read() -- initialisation des touches


if statut == "menu" then


if select == 1 then
   y = 100
   game_mod = "twoplayers"
elseif select == 2 then
   y = 108
   game_mod = ""
elseif select == 3 then
   y = 116
end

screen:print(150,100,"2 joueurs",Color.new(255,255,255))
screen:print(150,108,"1 joueur VS CPU",Color.new(255,255,255))
screen:print(150,116,"Quitter",Color.new(255,255,255))
screen:print(130,y,"->",Color.new(255,0,0))

if key ~= nil and oldkey ~= nil then
   if key:up() and oldkey:up() ~= key:up() and select > 1 then
      select = select - 1
   end

   if key:down() and oldkey:down() ~= key:down() and select < 3 then
      select = select + 1
   end


   if key:cross() and oldkey:cross() ~= key:cross() then
      if select < 3 then
         select = nil
         statut = "game"
      else
         quitter = true
      end
   end
end

elseif statut == "game" then
-- on applique les colisions
colision()

-- affichage de la ligne centrale
screen:fillRect((screen_value.X/2) - (sizecentralbar/2),0,sizecentralbar,screen_value.Y,Color.new(255,255,255))

-- on affiche la balle
screen:blit(position_ball.X,position_ball.Y,ball_img)

-- affiche la barre 1
screen:blit(barre.joueur1_posX,barre.joueur1_posY,barre.joueur1)

-- affiche la barre 2
screen:blit(barre.joueur2_posX,barre.joueur2_posY,barre.joueur2)

-- on affiche le score du joueur 1
screen:print(scoreposition,60,score.joueur1,Color.new(255,255,255))

-- on affiche le score du joueur 2
screen:print(screen_value.X - scoreposition,60,score.joueur2,Color.new(255,255,255))

-- on affiche les vitesses de la balle
screen:print(2,264,"Ball speed: "..((math.abs(posX) + math.abs(posY))/2).."  X:"..math.abs(posX).."  Y:"..math.abs(posY),Color.new(0,0,255))

-- controle de la barre du joueur 1

if key:up() and barre.joueur1_posY > 0 then
   barre.joueur1_posY = barre.joueur1_posY - barre_speed
end

if key:down() and barre.joueur1_posY < screen_value.Y - size_barY then
   barre.joueur1_posY = barre.joueur1_posY + barre_speed
end

-- controle de la barre du joueur 2

-- on deninit le mode de controle de la barre du deuxieme joueur
if game_mod == "twoplayers" then

   -- si le joueur est humain...

   -- si on presse triangle, la barre monte
   if key:triangle() and barre.joueur2_posY > 0 then
      barre.joueur2_posY = barre.joueur2_posY - barre_speed
   end

   -- si on presse croix, la barre desend
   if key:cross() and barre.joueur2_posY < screen_value.Y - size_barY then
      barre.joueur2_posY = barre.joueur2_posY + barre_speed
   end

else

-- si le joueur est le CPU
ia()

end

-- la balle avance...
position_ball.X = position_ball.X + (posX/ball_speedcoef)
position_ball.Y = position_ball.Y + (posY/ball_speedcoef)

-- si on presse start, le programme sort de la boucle
if key:start() then
System.endDraw()
screen:clear(Color.new(0,0,0))
System.sleep(300)
reboot()
end

if key:select() then
quitter = true
end

-- on definit aleatoirement les vitesses X et Y de la balle
ball_speedX = math.random(ball_speedmin,ball_speedmax)
ball_speedY = math.random(ball_speedmin,ball_speedmax)

end -- on ferme la condition de statut

oldkey = key

sceKernelSleepThread() -- on arrete l'initialisation de l'ecran


end -- fin de la boucle


System.quit() -- on quitte le jeu

end

init()
« Modifié: 24 mai 2010 à 13:00:10 par Hitochen »


Écoutez ma volonté, vous, misérable qui ne servez a rien !

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #2 le: 24 mai 2010 à 12:47:00 »
Tiens je t'ai trouvé un code sympa et assez clair, j'y est jeté un œil, il est bien commenter et agréable a lire
J'espère que sa suffira, j'ai jamais programmé en lua mais le programme a l'air sérieux.

Merci, mais.. ou est le code o_O ..

Si ta essayé de le mettre en spoil' la psp ne les lit pas ..

Hitochen

  • Baka Pink
  • Fan de mangas
  • ***
  • Messages: 711
    • Voir le profil
Programme Lua
« Réponse #3 le: 24 mai 2010 à 12:59:56 »
Ok je modifie


Écoutez ma volonté, vous, misérable qui ne servez a rien !

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #4 le: 24 mai 2010 à 14:22:36 »
Ah c'est mieux, merci !

J'y été pas du tout ...

Tu a déja touché à des lignes de codes ?

(j'ai comme l'impression ..)

Arf.. il utilise Euphoria ..
Bon normalement je devrais m'en sortir .. (mais je suis qu'un débutant :'(, mais bonne élève   ;D)

function init()
= connait pas

while load == false do = connait pas, while true do peut-être ?

 if key:cross() then
      load = true
Avec luaDE, je pense que ce sera:

if pad:cross() then
load = true = heu sa connait pas ..

Et puis, sa facon de faire n'est pas très propre, enfin c'est pas dans l'orde que j'aurais fait ..

-- Pour que la balle rebondisse sur les barres...

   -- rebond sur la barre du joueur 1
   if position_ball.X <= barre.joueur1_posX + size_barX + ball_speedX and position_ball.X > barre.joueur1_posX then
      if position_ball.Y + size_ball >= barre.joueur1_posY and position_ball.Y <= barre.joueur1_posY + size_barY then
         posX = ball_speedX
      end
   end


Juste pour sa je le remercie infiniment =).

Merci hito' !


Faites pas attention à present, c'est juste pour me repérer

-- on positionne la balle au centre de l'ecran pour le debut du jeu
position_ball = {
X = screen_value.X/2 + size_ball/2,
Y = screen_value.Y/2 + size_ball/2
}

-- vitesse de la balle au depart
ball_speedX = 3
ball_speedY = 3

« Modifié: 24 mai 2010 à 14:32:50 par Zstan »

Hitochen

  • Baka Pink
  • Fan de mangas
  • ***
  • Messages: 711
    • Voir le profil
Programme Lua
« Réponse #5 le: 24 mai 2010 à 15:29:36 »

Tu a déja touché à des lignes de codes ?

Je fais des études en informatique, je touche pas au ligne de code, j'en bouffe ... :'(

Pour Function init(), c'est ce bloc d'instruction(en dessous) qui ne ce déclenchera que quand ont appelle la fonction init(), souvent init veut dire initialiser, et ca permet de placer les bases de ton jeu, quand tu commence ta partie en gros ca positionne tous tes éléments à l'endroit que tu leur a attribués.

function init()

size_ball = 16
load = false

   while load == false do
   System.draw()
   screen:clear()

   key = Controls.read()

   screen:print(50,60,"Pong",Color.new(255,255,255))
   screen:print(50,80,"Size ball: "..size_ball,Color.new(255,255,255))

   if key:right() and size_ball < 64 then
      size_ball = size_ball + 1
   end

   if key:left() and size_ball > 1 then
      size_ball = size_ball - 1
   end

   if key:cross() then
      load = true
   end

   System.endDraw()
   screen.flip()
   end

key = nil
System.sleep(300)
pong()

end



while load == false do , je pense que sa correspond a "tant que le chargement n'est pas fini" (chargement égale faux)
Après je n'ai pas étudié ce langage, alors je peux faire que des suppositions


if key:cross() then
      load = true

Avec luaDE, je pense que ce sera:

if pad:cross() then
load = true
= heu sa connait pas ..

Pour ca j'ai pas compris ce que tu voulais ?




Écoutez ma volonté, vous, misérable qui ne servez a rien !

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #6 le: 24 mai 2010 à 18:35:38 »
Ben Euphoria et LuaDE, la façon de rédiger et pas la même ..

Et if key:cross() then sera if pad:cross() dans LuaDe.
 

Par contre local = true je sais pas comment je dois le rédigez dans LuaDe ..

Hitochen

  • Baka Pink
  • Fan de mangas
  • ***
  • Messages: 711
    • Voir le profil
Programme Lua
« Réponse #7 le: 24 mai 2010 à 18:59:58 »
local est une variable booléenne, elle peut que contenir vrai ou faux (true ou false)
On l'utilise pour les condition, pas pour stocké des donné (exemple "Si variableX = vrai alors ....")
Je pence que tu peut la laisser telle qu'elle, mais si ca marche pas en Luade, tu peux sans problème la remplacer par une un variable numérique genre local=1 pour le vrai et local =0 pour le faux, il faudra juste changé les condition de tes Boucle et de tes Si


Écoutez ma volonté, vous, misérable qui ne servez a rien !

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #8 le: 24 mai 2010 à 21:39:07 »
Heu.. je sais pas si sa se voit mais je suis super débutant, serais pas tous faire sans tuto car tout seul toujours quelque erreurs ..

Mais local = 0 et 1 oui sa, j'y arriverais ..

Demain, j'ajouterais quelque ligne de code, je t'en serais reconnaissant si tu m'aide au fur et à mesure ! (Oh hitochen tt puissant ;) ) ;D

H.S:  Arf, moi qui voulait de devenir ingénieur en informatique .. Sais plus trop ..

Tu dois certainement utilisez le C++ ?
Sa doit être dur ..

Revenons au sujet: Après réflexion, j'ai décidez de tout recopiez, puis faire quelque modif ..

Sur LuaDE, j'aurais beaucoup de messages d'erreurs ? Si vrai alors = Hitochen va t'il m'aidez à les corrigez ? Please ?!

Ah et y a pas un moyen de mettre tout ce code dans un fichier.lua ou autre ? (que je puisse lire, directement sur LualDE, y a plusieurs onglets^^).
« Modifié: 25 mai 2010 à 18:36:02 par Zstan »

Hitochen

  • Baka Pink
  • Fan de mangas
  • ***
  • Messages: 711
    • Voir le profil
Programme Lua
« Réponse #9 le: 24 mai 2010 à 23:49:04 »
non je fait pas encore de c++, je fais du c
mais je te confirme que c'est galère, mais il faut pas te découragé, toi ta commencer sans les bases, normale que tu sois perdu ...
dans 2 semaine, je suis en vacance, je pourrai t'aider autant que tu veux


Écoutez ma volonté, vous, misérable qui ne servez a rien !

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #10 le: 25 mai 2010 à 17:09:07 »
- xD je fais sa pour le plaisir, sa me saoule pas, ce qui me saoule c'est de ne pas savoir "le" maitriser ..
Je parle du Lua.
Je connait rien du C .. ni du C++ ...

- Comment sa ? de quel bases tu parles ?

- Je voudrais que tu m'aide, dans 2 semaines à apprendre "ces bases".

- Ah et je peux en aucun cas me décourager, C'est soit ingénieur en informatique, soit Concepteur .. Je crois que dans les 2 cas on utilise un langage comme le C, nan ?

- Voila, j'ai fini de tapez tout le code à ma façon, et adaptée pur LUAlDE.
 Mais bon, j'ai fait pratiquement que du recopiages pour le code, je voudrais rajouter quelque trucs.

1) Je voudrait ajoutez au menu "crédit", pour pouvoir y écrire tous ceux qui mon aidée, toi, Le gars pour son code source, oslord pour son homebrew et un lien pour psp-animes. (si tu désire que je mettes un lien d'un site à toi ou quelconque, n'hésite pas)  ;)

2) Sa je sais le faire, je vais rajoutez un fond d'écran  :)
« Modifié: 25 mai 2010 à 18:42:53 par Zstan »

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #11 le: 26 mai 2010 à 23:02:28 »
Jeu terminée.

Mais je n'ais pratiquement rien changé.
(Ce soir je vais rajoutez du .mp3 au jeu^^).

Lien script.lua: http://dl.free.fr/getfile.pl?file=/68c3TolE

Suffit de le lançez avec un Lua Player !

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #12 le: 16 août 2010 à 22:35:53 »
Nostalgie ! J'ai adoré relire le topic x)

Je pense que c'est plus adaptée qu'ôn parle du jeu sur ce topic là et pas l'autre ..


hito : jcomprend pas, pour mettre une image en fond faut faire screen:blit(0,0,image) mais j'ai un message d'erreur ..
J'essaye d'introduire la maps dans le jeu là ..
« Modifié: 16 août 2010 à 22:38:55 par Zstan »

S7ptieme

  • Otaku
  • ****
  • Messages: 1898
  • Kusoooo ! ! !
    • Voir le profil
Programme Lua
« Réponse #13 le: 17 août 2010 à 15:37:36 »
comprend rien =S

Zstan

  • THE Otakus !
  • Otaku & Geek
  • *****
  • Messages: 2602
  • Cherche la lumiere, au plus profond des ténebres
    • Voir le profil
Programme Lua
« Réponse #14 le: 17 août 2010 à 15:42:25 »
comprend rien =S

Va faire des cours d'algorithmie  ;D
Tout et rien -> Sujet cree by hito..


Hito .. répond !