Index des articles > Programmation > ETP - Fish Adventure's Tutorial

ETP - Fish Adventure's Tutorial

Article posté par geogeo

Fish Adventure's Tutorial

Introduction :

Pour télécharger les images (Tiles) de ce tutorial :
Cliquez ICI -> Images

Pour télécharger le programme final :
Cliquez ICI -> Programme

Pour télécharger simplement la version exécutable TI :
Cliquez ICI -> Exécutable

Voici un petit tutorial qui va permettre de vous expliquer les points clés pour
le développement d'une application telle que Fish Adventure, un petit jeu ou
vous devez diriger un poisson et lui faire éviter la foule d'obstacles qui
se présentent face à lui !!!

Ce tutorial ne s'adresse pas à ceux qui n'ont jamais fait de programmation car
il reprendra surtout la partie gestion de la map et programmation avancée sous ETP !!!
Il ne sera pas non plus expliqué l'obtention des images et des sprites présents dans la map !!!

Commencons sans plus attendre par la création de la map !!

Vous devez disposé de 13 tiles(petites images) réunies dans deux sprites :
-obstacle1
-poisson1

Le sprite poisson1 posséde 2 actions :
-nage(action 1)
-crash(action2)

Map :

Vous devez donc créer une map : (File -> New -> Map) :
Votre Map est créée et vous pouvez y accéder en cliquant sur le dossier Maps puis
le nom de votre map dans le Project Explorer !!!

Maintenant, il va vous falloir insérer vos sprites dans votre map !!!
Pour cela sélectionner le poisson et laisser appuyé jusqu'à ce qu'il apparaisse dans l'écran de la map !!!
Faites de même avec l'obstacle jusqu'à ce qu'il y ait 8 obstacles et le poisson sur la map !!!

Ensuite il va falloir positionner les sprites au bon endroit dans la map :
Pour cela cliquez pour chaque dans les colonnes X et Y pour chaque objet et rentrez les valeurs suivantes :

Sprite Name SPRITE X Y Action Visible
poisson11 poisson1 30 48 nage True
obstacle12 obstacle1 105 51 obstacle True
obstacle13 obstacle1 146 82 obstacle True
obstacle14 obstacle1 85 24 obstacle True
obstacle15 obstacle1 124 75 obstacle True
obstacle16 obstacle1 170 53 obstacle True
obstacle17 obstacle1 184 24 obstacle True
obstacle18 obstacle1 205 63 obstacle True
obstacle19 obstacle1 230 36 obstacle True

Voila votre map est prête vous aurez peut etre remarqué que les objets de la map s'appellent poisson11,
obstacle12, ce n'est pas parce qu'il y en a 10 avant : c'est parce que l'objet s'appelle (poisson1)1 et
(obstacle1)1,....

Il ne reste maintenant plus qu'à parler du code !!(Le plus important !!!) :

Code :

Nous allons ici traiter en détail des parties du code les plus importantes !!!
Tout d'abor la déclaration de variables publiques nécessaires au programme et le début du proramme : (Procedure MAIN) !!!

Public vitesse as Integer
Public scorer as Integer
Public HIScoreName[5] as String
Public HIScoreVal[5] as Integer
Public select as Integer

Procedure MAIN:

'The startpoint of your program
Clear
Local key as Integer
If vitesse = 0 Then
vitesse = 4
EndIf

Le menu est géré par la fonction Locate assez similaire à Output en Ti-Basic
donc nous allons pas trop nous étendre sur les effets utilisés ici !!!

Do
If vitesse > 6 Then
vitesse = 6
EndIf
Clear
Font 1
Locate 5,10," THE FISH ADVENTURE ",4
Locate 30,25,"Nouvelle Partie ",4
Locate 30,40,"Vitesse :",4
Locate 30,55,"High-Scores",4
Locate 30,70,"Quitter",4
Locate 100,80,"by Jeff",4
select=1
Do

Locate 10,15*select+10,"->",4
If select = 1 Then
Message "Appuyez sur ENTREE pour commencer"
ElseIf select = 2 Then
Message "Fleches droite/gauche pour modif la vitesse"
ElseIf select = 3 Then
Message "Les bests of the bests"
ElseIf select = 4 Then
Message "Appuyez sur ENTREE pour quitter le jeu"
EndIf
Locate 120,40,vitesse,4
key=GetKey()
Locate 10,15*select+10," ",4
If key = 337 Then
select=select-1
ElseIf key=340 Then
select=select+1
ElseIf key=338 And select=2 And vitesse>1 Then
vitesse=vitesse-1
ElseIf key=344 And select=2 And vitesse<6 Then
vitesse=vitesse+1
EndIf

If select = 0 Then
select = 4
ElseIf select = 5 Then
select = 1
EndIf

Loop While Not (key=264 Or (key=13 And select=1)Or (key=13 And select=4) Or (key=13 And select=3))

If key=264 Or select=4 Then
select=5
EndIf

If select=3 Then
GrayOn
DisplayHIScores
GrayOff
EndIf

If select=1 Then
GrayOn
MapDisplay
GrayOff
EndIf

Loop While Not (select=5)

On a donc mis en place le menu qui s'exécute tant qu'on appuie pas sur echap et tant qu'on ne sélectionne
pas quitter. Cet extrait utilise des fonctions qui n'ont pas encore été mises en place(MapDisplay,...). Nous allons donc
réaliser maintenant la partie qui va gérer les actions de la map : Procedure MapDisplay !!!
Pour cela allez dans le menu et cliquez sur Tools->Loop Wizard !!!Remplacez alors le code de la fenêtre ouverte par
le suivant (ou supprimez cette page dans le menu de gauche et écrivez ce code en dessous du code actuel -> conseillé par moi) !!!
Loop Wizard sert à créer des macros ScreenInit et ScreenRender qui vont permettre d'utiliser la map !!!

Procedure MapDisplay

Local exit as Integer
Local ancscore as Integer
Local niv as Integer
Local numobs as Integer
Local chang as Integer
Local perte as Integer
Local tour as Integer
Local m as Integer
Local r as Integer
exit=0
perte=0
scorer=0
tour=30
niv=0
chang=0
numobs=4
ancscore=0

ScreenInit

ScreeInit permet d'initialiser la map pour l'utiliser ultérieurement !!!
Voyons maintenant le code qui permet de gérer les niveaux. Celui-ci doit être déclaré en premier
dans notre boucle DO LOOPWHILE car il va modifier le nombre d'obstacles et la vitesse !!!

ScreenRender
If tour=30 Then
Locate 20,90,"Score : ",4
Locate 60,90,scorer,4
'TO DO: Place your gameplay code here
If KEY89_UP Then
poisson11.y=poisson11.y - 3
ElseIf KEY89_DOWN Then
poisson11.y=poisson11.y + 3
'ElseIf KEY89_LEFT Then
'poisson11.x=poisson11.x - 3
'ElseIf KEY89_RIGHT Then
'poisson11.x=poisson11.x + 3
EndIf

For m=1 To numobs

MapSprites[m].x=MapSprites[m].x-vitesse
If MapSprites[m].x<0 Then
Locate 60,90," ",4
scorer=scorer + niv*vitesse
MapSprites[m].x=210
MapSprites[m].y = 5 + Random (80)
EndIf

If AbsInt( poisson11.x-MapSprites[m].x )<8 Then
If AbsInt( poisson11.y-MapSprites[m].y )<8 Then
poisson11.action=2
tour=29
EndIf
EndIf

Next

If poisson11.y<8 Then
poisson11.action=2
tour=29
EndIf

If poisson11.y>91 Then
poisson11.action=2
tour=29
EndIf

'If poisson11.x<8 Then
'poisson11.x=8
'ElseIf poisson11.x>151
'poisson11.x=151
'EndIf

If scorer>=ancscore+55*niv*vitesse Then
chang=1
EndIf

ElseIf tour=0 Then
perte=1

Else
tour=tour-1
EndIf
If KEY89_2ND Then
exit=1
EndIf

Loop While (perte=0 And Not(KEY89_2ND))

ScreenRender permet d'utiliser les sprites en gérant mouvements,..
La boucle principale repose sur la condition tour (bleu) : si tour=30 normal,si tour<30 tour décroit jusqu'à 0 !!
Cela permet d'afficher plus longtemps l'action crash du poisson !!
Sinon j'ai décidé volontairement d'utiliser le sprite poisson1 par son nom dans la map : poisson11
Ainsi on accéde aux champs du tableau comme à l'ai de MapSprites[] par poisson11.x,poisson11.y,...
Chaque tour, chaque obstacle avance de vitesse pixels sur l'écran, si il arrive au point x=0, il se repositionne
aléatoirement au point x=210 et le score augmente !!!
Si 55 obstacles ont été passés on envoie le message de changement de niveau (chang=1) !!!
Enfin, nous allons passer à l'explication des tests sur la perte de la partie :
Nos sprites sont de la même taille (16*16) nous savons donc que si la valeur absolue de leur différence d'ordonnées
et d'abscisses est inférieure à 8, les deux sprites (poisson et obstacle) se touchent, c'est donc la fin de la partie !!!
Dans une boucle for comme ici, les lignes suivantes permettent d'effectuer le test pour chaque obstacle !!!

AbsInt( poisson11.x-MapSprites[m].x )<8
AbsInt( poisson11.y-MapSprites[m].y )<8

Il est nécessaire d'utiliser la valeur absolue car sinon cette valeur peut être négative bien qu les deux sprites ne se touchent pas !!
Quand la fin de la partie est repérée, on change l'action du poisson en crash : action2 !!!
Voici donc la fin de la fonction MapDisplay:

If exit=0 Then
Clear
Locate 50,20,"Score Final :",4
Locate 50,30,scorer,4
WaitKey
AddNewScore scorer
WaitKey
EndIf


Affichage du score final quoi de plus banal et appel à la fonction AddNewScore pour gérer les High Scores !!!
Attention il ne faut pas de parenthèses lors de l'appel d'une fonction avec arguments !!!
Vous pouvez recopier ce code sous votre code principal !!!
Voici les fonctions de gestion des High Scores :

Procedure AddNewScore(Score as Integer)
Clear
If Score <= HIScoreVal[4] Then
Font 0
Locate 1, 1, "Vous n'etes pas dans les Hi-Scores !!!", 4
WaitKey
Return
Else
Font 0
Locate 1, 1, "Bravo!!", 4
WaitKey
EndIf

Local Name as String
Local i as Integer
Local k as Integer
Name = EnterString("Rentres ton nom :")
i = 4
Do While Score > HIScoreVal[i] And i>=0
i = i - 1
Loop
For k = 4 To i + 2 Step -1
HIScoreName[k]=HIScoreName[k-1]
HIScoreVal[k]=HIScoreVal[k-1]
Next

HIScoreName[i+1] = Name
HIScoreVal[i+1] = Score
DisplayHIScores
Return


Procedure DisplayHIScores:
ClearAll
Local i as Integer
Local j as Integer
DarkPlane
Locate 35, 2, "HI-SCORE TABLE", 4
LightPlane
Locate 35, 2, "HI-SCORE TABLE", 4
Font 0
For i=0 To 4
DarkPlane
If HIScoreVal[i]>0 Then

Locate 2,16+i*8,HIScoreName[i],4
Locate 100,16+i*8,HIScoreVal[i],4
EndIf
Next
WaitKey

Function EnterString(Request as String) as String
Local Key as Integer
Local retStr as String
Local i as Integer

ClearAll
Font 1
DarkPlane
Line 0,28,239,28,4
Line 0,39,239,39,4
LightPlane

For i = 28 To 39
Line 0,i,239,i,4
Next
DarkPlane
Locate 10, 30, Request, 1
LightPlane
Locate 10, 30, Request, 1
retstr = " "
Do
DarkPlane
Locate 30, 50, " ", 4
Locate 30, 50, retstr, 4
LightPlane
Locate 30, 50, " ", 4
Locate 30, 50, retstr, 4
Key = GetKey()
If Key <> 264 And Key <> 13 And Key <> 257 And Key <> 263 Then
retstr = retstr & Chr(Key)
EndIf
If Key = 257 And Len(retstr) > 1 Then
retstr = Left(retstr, Len(retstr) - 1)
ElseIf Key = 263 Then
retstr = " "
EndIf
Loop While Key <> 264 And Key <> 13
Return Right(retStr,Len(retstr)-1)

Les fonctions de gestion des High-Scores ont été obtenu avec l'option (Tools -> HI-Scores Wizard) de ETP Studio !!!
Pour cela ces fonctions ne seront pas expliquées !!!

Voila vous pouvez maintenant faire F8 ou Run->Compile ou bien encore cliquer sur le raccourci de la barre d'outils !!!

J'espère que ce tuto vous aura aidé à mieux comprendre l'utilisation des maps sous ETP !!!
Si vous avez des questions n'hésitez pas à vous adressez à Onur ou encore à moi : Jeff !!!


>> Vos commentaires [0]

Pas de commentaires

Poster un commentaire


Seuls les membres peuvent poster des commentaires