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 !!!