π
<-
Chat plein-écran
[^]

Projet battleTank

Pour TI-Nspire OS 3.0 ou ultérieur.

Projet battleTank

Message non lude quentin974 » 09 Nov 2013, 12:56

Bonjour, bonjour !

Voilà comme promis, je poste mon tout premier code LUA, bien sur non optimisé et avant d'aller plus loin, je voudrais savoir ce que vous en pensez :

Code: Tout sélectionner
local t=2
local pi=math.pi
local puiss=4
local angle=0
local degre=0
local hautrect=2
local nopause=0
local x=10
local charge=1
local px=10
local b=1
local c=0
local j=1
local lp1=50
local lp2=50
local px2=290
local x2=290
local gameover=0
local y=4.9*((x-px)/(puiss*b))^2-c*(x-px)+192
function on.enterKey()
    if gameover==1 then
        t=2
        pi=math.pi
        puiss=4
        angle=0
        degre=0
        hautrect=2
        nopause=0
        x=10
        charge=1
        px=10
        b=1
        c=0
        lp1=50
        lp2=50
        px2=290
        x2=290
        gameover=0
        y=4.9*((x-px)/(puiss*b))^2-c*(x-px)+192
    end
    ---nopause=1 quand trace---
    nopause=nopause+1
    if nopause==1 then
    if j==1 then
        x=px
        px=px-2
    elseif j==2 then
        x2=px2
        px2=px2+2
    end
    timer.start(0.01)
    b=math.cos(angle)
    c=math.tan(angle)
    end
end
function on.timer()
    ---incremente---
    --- j 1 ---
  if j==1 then
    if x<317 then
        if angle>60 then
            t=3
        elseif angle>30 and angle<61 then
            t=4
        elseif angle<31 then
            t=5
        end
    x=x+t
    y=4.9*((x-px)/(puiss*b))^2-c*(x-px)+192
    charge=0
    if 191<y and 210>y then
            if x+3>px2-20 and x+3<px2+30 then
                lp2=lp2-4
                if x+3>px2-10 and x+3<px2+20 then
                    lp2=lp2-3
                end
            x=318
            end
    end
    if y>211 then
        x=318
    end
    ---fin incrementation---
    elseif x>316 then
    x2=px2
    y=4.9*((x2-px2)/(puiss*b))^2-c*(x2-px2)+192
    timer.stop()
    nopause=0
    charge=1
    j=2
    end
  --- j 2 ---
  elseif j==2 then
        if x2<2*px2 then
        if angle>60 then
            t=3
        elseif angle>30 and angle<61 then
            t=4
        elseif angle<31 then
            t=5
        end
        x2=x2+t
    y=4.9*((x2-px2)/(puiss*b))^2-c*(x2-px2)+192
    charge=0
    if y>211 then
        x2=2*px2
    end
    if 191<y and 210>y then
            if 2*px2-x2+4>px-19 and 2*px2-x2+6<px+31 then
                lp1=lp1-4
                if 2*px2-x2+4>px-9 and 2*px2-x2+6<px+21 then
                    lp1=lp1-3
                end   
                x2=2*px2+9
            end
     end
    ---fin incrementation---
    elseif x2>2*px2-1 then
    x=px
    y=4.9*((x-px)/(puiss*b))^2-c*(x-px)+192
    timer.stop()
    nopause=0
    charge=1
    j=1
    end
  end
    if lp1<0 or lp2<0 then
        gameover=1
    end
platform.window:invalidate()
end

function adoucir(gc)
    gc:setColorRGB(255,255,255)
    gc:setFont("sansserif","r",8)
    gc:drawString("Angle",295,105)
    gc:drawString(degre.."°",301,120)
    gc:drawString(puiss.."%",296,12)
    gc:drawRect(97,2,53,11)
    gc:drawRect(167,2,53,11)
    gc:setFont("serif","b",19)
    if gameover==1 then
    timer.stop()
    gc:drawString("Joueur "..j.." a gagné !",30,100)
    end
end


function obus(gc)
    ---obus---
    gc:setColorRGB(0,0,0)
    if j==1 then
    gc:fillArc(x+3,y,5,5,0,360)
    elseif j==2 then
    gc:fillArc(2*px2-x2+4,y,5,5,0,360)
    end
end


function tank(gc)
    ---tank 1---
    gc:setColorRGB(100,100,100)
    gc:fillRect(px,195,16,7)
    gc:fillRect(px+3,191,9,4)
    gc:fillRect(px+12,192,5,2)
    gc:setColorRGB(0,141,0)
    gc:drawLine(px,201,px,201)
    gc:drawLine(px+15,201,px+15,201)
    ---tank 2---
    gc:setColorRGB(255,0,0)
    gc:fillRect(px2,195,16,7)
    gc:fillRect(px2+4,191,9,4)
    gc:fillRect(px2-1,192,5,2)
    gc:setColorRGB(0,141,0)
    gc:drawLine(px2,201,px2,201)
    gc:drawLine(px2+15,201,px2+15,201)
end

function on.paint(gc)
    ---background---
    for degrade=180,211 do
    gc:setColorRGB(0,degrade-60,0)
    gc:fillRect(0,degrade,318,211)
    end
    gc:setColorRGB(180,180,255)
    gc:fillRect(0,0,318,180)
    ---panel---
    gc:setColorRGB(60,60,60)
    gc:fillRect(294,0,24,150)
    gc:fillRect(49,0,220,18)
    gc:fillRect(0,0,24,150)
    adoucir(gc)
    gc:drawRect(303,18,10,54)
    ---jauge et vie---
    if gameover==0 then
    gc:setColorRGB(0,200,0)
    gc:fillRect(305,70-hautrect,7,1+hautrect)
    gc:fillRect(169,4,lp2,8)
    gc:fillRect(149-lp1,4,lp1,8)
    end
    obus(gc)
    tank(gc)
    ---etat---
    if charge==0 then
        ---rond rouge---
        gc:setColorRGB(255,0,0)
        gc:fillArc(301,130,10,10,0,360)
        ---cercle et rect---
        gc:setColorRGB(255,255,255)
        gc:drawArc(301,130,10,10,0,360)
        gc:fillRect(304,134,5,3)
    else
        ---tick---
        gc:setColorRGB(0,255,0)
        for tick=136,138 do
        gc:drawLine(303,134,307,tick)
        end
        gc:drawLine(307,138,313,127)
    end
end
function on.charIn(touche)
if nopause<1 then
    if touche=="-" and puiss>4 then
        puiss=puiss-4
        hautrect=hautrect-2
        if j==1 then
        x=px
        elseif j==2 then
        x2=px2
        end
    elseif touche=="+" and puiss<100 then
        puiss=puiss+4
        hautrect=hautrect+2
        if j==1 then
        x=px
        elseif j==2 then
        x2=px2
        end
    elseif touche=="*" and degre<88 then
        angle=angle+pi/45
        degre=degre+4
        if j==1 then
        x=px
        elseif j==2 then
        x2=px2
        end
    elseif touche=="/" and degre>0 then
        angle=angle-pi/45
        degre=degre-4
        if j==1 then
        x=px
        elseif j==2 then
        x2=px2
        end
    elseif touche=="4" then
        on.arrowKey("left")
    elseif touche=="6" then
        on.arrowKey("right")
    end
    platform.window:invalidate()
end
end
function on.arrowKey(key)
    if nopause~=1 then
        if j==1 then
            if key=="left" and px>16 then
                px=px-15
            elseif key=="right" and px<px2-30 then
                px=px+15
            end
            x=px
        elseif j==2 then
            if key=="left" and px2>px+30 then
                px2=px2-15
            elseif key=="right" and px2<277 then
                px2=px2+15
            end
            x2=px2
        end
    platform.window:invalidate()
    end
end


Alors ? :D
Image

Cercle trigonométrique sur TI Nspire: archives_voir.php?id=9299
Thème modernity sur TI Nspire : archives_voir.php?id=9616
Maths générales pour z80 : archives_voir.php?id=9389
Géogebra pour z80 : archives_voir.php?id=10833
Avatar de l’utilisateur
quentin974
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Prochain niv.: 0.4%
 
Messages: 260
Images: 7
Inscription: 14 Nov 2012, 05:32
Localisation: Nice
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: L1 de Physique

Re: Projet battleTank

Message non lude AnToX98 » 09 Nov 2013, 18:52

C'est vraiment super :bj:

Néanmoins, il y a toujours quelques remarques à faire :D :

Au niveau de jeu :
- Le canon du tank devrait bouger en fonction de l'angle (pour qu'on sache à peu près ou l'on va tirer :) )
- Il faudrait des collines, parce que un terrain plat c'est un peut répétitif :D
- Y ajouter les jauges de vies
- Un menu :D : highscore, about, etc...
- Plusieurs type d'obus ? Explosifs, etc...
- Intuitivité des touches : remplacer les "X" et "/" pour changer l'angle par les touches "up" et "down" du pavé !

Je sais que je suis exigeant, mais ces ce genres de détails qui feront que ton jeu soit prenant :)

Sinon les graphismes sont très jolis, et bravo pour avoir réussi à dessiner le tank avec on.paint :D plutôt qu'à recourir à une image.

Au niveau du code :

- Bravo ! C'est rare de voir un code indenté chez les débutants :bj:
- Tu utilises les variables de manière exhaustive : aurais-tu peur d'utiliser les tables ? C'est la seule et donc très efficace structure de données en lua, alors tu peux oui en abuser :bj:

J'ai pas eu le temps de l'examiner plus en détail, mais c'est un très bon début, bravo :bj:

Continue ton jeu et il en sera digne des meilleurs :)
Avatar de l’utilisateur
AnToX98Premium
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 75.5%
 
Messages: 1022
Images: 15
Inscription: 19 Mai 2013, 16:54
Localisation: Paris, France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: 1ere S

Re: Projet battleTank

Message non lude AnToX98 » 09 Nov 2013, 18:58

Tiens, je viens de trouver un super jeu de tank sur lequel j'ai bien geeké : http://www.jeu.fr/jeu/tanks-2
Tu pourrais t'en inspirer :)
Avatar de l’utilisateur
AnToX98Premium
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 75.5%
 
Messages: 1022
Images: 15
Inscription: 19 Mai 2013, 16:54
Localisation: Paris, France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: 1ere S

Re: Projet battleTank

Message non lude quentin974 » 10 Nov 2013, 13:05

C'est noté ! :D
Alors récap :
- les collines vont considérablement ralentir mon code actuel à cause des conditions nécessaires. À moins bien sur que je trouve un autre moyen...
- l'angle du canon : ralentit un peu, mais en cours d'implémentation
- les jauges de vie y sont déjà, ou alors t'as un problème que je n'identifie pas ;)
- les touches "up" et "down", c'est fait
- les types d'explosifs : largement faisable, mais ralentit à cause des conditions
- le menu : je m'y attelle aussi !

Code
- l'indentation ? Je ne programme pas qu'en LUA, donc...
- merci pour les graphismes ! :D
- les classes ? J'ai pas encore vu ça ! :D Je vais regarder, je sens que ça peut aider !

En tout cas merci, à bientôt pour une MAJ !
Image

Cercle trigonométrique sur TI Nspire: archives_voir.php?id=9299
Thème modernity sur TI Nspire : archives_voir.php?id=9616
Maths générales pour z80 : archives_voir.php?id=9389
Géogebra pour z80 : archives_voir.php?id=10833
Avatar de l’utilisateur
quentin974
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Prochain niv.: 0.4%
 
Messages: 260
Images: 7
Inscription: 14 Nov 2012, 05:32
Localisation: Nice
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: L1 de Physique

Re: Projet battleTank

Message non lude AnToX98 » 10 Nov 2013, 13:18

Je ne vois pas en quoi des trucs que tu dis peuvent ralentir le jeu --'
Ton jeu n'a pas d'images, donc quoi que tu fasses, tu n'auras pas de ralentissement :bj:
Puis, ce qui compte, c'est le tir non ?
Avatar de l’utilisateur
AnToX98Premium
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 75.5%
 
Messages: 1022
Images: 15
Inscription: 19 Mai 2013, 16:54
Localisation: Paris, France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: 1ere S

Re: Projet battleTank

Message non lude quentin974 » 11 Nov 2013, 18:04

C'est justement le tir ( l'incrémentation de x dans le timer puis le dessin et toutes les autres conditions de on.paint ) qui est ( un peu, je l'admets ) ralenti.

Sinon des choses à revoir dans mon code ? Critor, Adriweb, Chockosta, Antox98, bref les spécialistes ?
Par contre, je vois pas comment utiliser les classes ici... Vous pourriez éventuellement me donner un exemple ici, s'il vous plaît ? :D
Image

Cercle trigonométrique sur TI Nspire: archives_voir.php?id=9299
Thème modernity sur TI Nspire : archives_voir.php?id=9616
Maths générales pour z80 : archives_voir.php?id=9389
Géogebra pour z80 : archives_voir.php?id=10833
Avatar de l’utilisateur
quentin974
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Prochain niv.: 0.4%
 
Messages: 260
Images: 7
Inscription: 14 Nov 2012, 05:32
Localisation: Nice
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: L1 de Physique

Re: Projet battleTank

Message non lude le solutionneur » 11 Nov 2013, 18:08

C'est vrai que Tanks 2 est super, ça serait cool de faire un jeu qui l'imite !
Avatar de l’utilisateur
le solutionneur
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 84.6%
 
Messages: 300
Inscription: 18 Déc 2011, 21:41
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Projet battleTank

Message non lude quentin974 » 11 Nov 2013, 18:22

Ouaip ! Mais comme je l'ai dit, il me faudra énormement de patience, et encore plus de "génie" pour gérer ça intelligemment ! Il est vraiment bien fait le jeu, je l'avoue !
En tout cas si quelqu'un a une idée, je suis preneur !
Parce que les collines ne sont pas excessivement compliquées en soi, mais après, c'est pour le test de la position du tank que je pense moins facile ... Du moins géré intelligemment ...
Avatar de l’utilisateur
quentin974
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Prochain niv.: 0.4%
 
Messages: 260
Images: 7
Inscription: 14 Nov 2012, 05:32
Localisation: Nice
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: L1 de Physique

Re: Projet battleTank

Message non lude AnToX98 » 12 Nov 2013, 17:58

Les classes d'objets sont juste une manière plus "clean" et plus logique de programmer, surtout dans le cas des jeux.
Niveau code c'est pas bien compliqué, les classes sont enfaite un "modèle" d'objet à lequel on va attribuer une série de caractéristiques, qu'on va pouvoir par la suite exploiter.
Pour bien que tu comprennes ce que je t'ai dis, dans un jeu de guerre par exemple, on aura une classe "soldat", une classe "cavalier" et une classe "artillerie". Note que grâce à ce "modèle", tu va en pouvoir créer autant que tu en veux.

Voila un petit code exemple pour t'aider à démarrer : un point coloré qui se déplace sur l'écran avec les touches directionnelles

On commence par définir le "modèle" d'objet :

Code: Tout sélectionner
tonmodele = class()


A chaque fois que tu créera un nouvel objet à partir du modèle, l'init va être appelé avec autant de paramètres que tu veux :

Code: Tout sélectionner
function tonmodele:Init(x,y) -- Entre les parenthèses tu va mettre tous les caractères nécessaires lors de la création de ta classe. Grace à cela, on pourra par exemple crée plusieurs objets à des positions x et y différentes
    self.x = x -- On définit les caractères de ma classe grace à self.
    self.y = y
end


Il faut définir comment dessiner l'objet :
Code: Tout sélectionner
function tonmodele:Paint(gc)
    local px = obj.x
    local py = obj.y
    gc:fillArc(px,py,15,15,0,360)
end


Maintenant tu dois créer ton objet à partir du modèle :

Code: Tout sélectionner
obj = tonmodele(50,50)


Ta fonction arrowKey pour déplacer ton objet :

Code: Tout sélectionner
function on.arrowKey(key)
    local px = obj.x
    local py = obj.y
    if key=="right" then
        px = px + 5
    elseif key=="left"
        --etc....
end
platform.window:invalidate()


Il ne reste plus que la fonction on.paint :

Code: Tout sélectionner
function on.paint(gc)
    tonmodele:Paint(gc)
end


PS : j'ai pas vérifié le code, mais je suis sur qu'il y a des erreurs, en espérant de t'avoir éclairé :)
Avatar de l’utilisateur
AnToX98Premium
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 75.5%
 
Messages: 1022
Images: 15
Inscription: 19 Mai 2013, 16:54
Localisation: Paris, France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: 1ere S

Re: Projet battleTank

Message non lude quentin974 » 12 Nov 2013, 18:28

Ah génial Antox ! Je comprends enfin mieux les classes ! Du coup je pense définir mes tanks en classes ! Voire meme une seule classe pour les deux avec des conditions !
Il n'empeche que je bloque pour les collines ! Je vais voir ça ce week-end à tête reposée !
Et encore merci !
Image

Cercle trigonométrique sur TI Nspire: archives_voir.php?id=9299
Thème modernity sur TI Nspire : archives_voir.php?id=9616
Maths générales pour z80 : archives_voir.php?id=9389
Géogebra pour z80 : archives_voir.php?id=10833
Avatar de l’utilisateur
quentin974
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Prochain niv.: 0.4%
 
Messages: 260
Images: 7
Inscription: 14 Nov 2012, 05:32
Localisation: Nice
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: L1 de Physique

Suivante

Retourner vers Nspire-Lua

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 13 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1322 utilisateurs:
>1285 invités
>32 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)