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