Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV

Apprendre
RPG Maker

Guides
Tutoriels
Making-of

Dans le
Forum

Section Entraide

Jeux: Cure Seekers / Jeux: Princesse Emmentale / Interviews: Ccd-Tof / Sorties: dans mon quartier, remasterisé (...) / News: Alex d'Or 2020 : Les résultats ! / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

135 connectés actuellement

10838201 visiteurs
depuis l'ouverture

7 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Hellsoft

Planète Glutko

BloGecko

Eclipso

ConsoleFun

RPG Maker VX

Guelnika & E-magination

Tous nos partenaires

Devenir
partenaire



Programmer la Master System. Chapitre 8, La manette de jeu

Cette fois si on attaque la gestion de la manette du jeu pour déplacer notre sprite à l'écran, on va voir aussi comment créer une simple fonction et les conditions.

Ecrit par Monos le 19/01/2018

image
Chapitre 8 : La manette de jeu et le déplacement du sprite

image
Voici la manette du jeu de la Master System. Elle possède deux boutons, et un pad à 4 boutons soit 6 boutons.

(Haut)(Bas)(Gacue)(Droite)(1 start)(2)

Notons aussi que la Master System possède un bouton Pause programmable et la Master System 1 un bouton Reset qui est aussi programmble au niveau logiciel. (Ce n'est pas du Hard)

La Master System possède deux emplacement pour brancher la manette de jeu. Port A et Port B.

Le SDK permet de tester de 4 manière si la manette de jeu est utilisé.
Si une touche est pressé. Si une touche est relaché, si une touche continue à être enfoncé. Et le statut d'une touche.

Nous allons préparer le sprite à être déplacé complétement en variable. On va déclarer la variable Y, et on remplace tous les "Y" de l'update et affichage du tiles par Position_Y.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
 
        // Déclaration de la variable Position_X
                unsigned char Position_Y = 0 ;
                
        SMS_addSprite (Position_X, Position_Y, 256);
        
        SMS_updateSpritePosition (0, Position_X, Position_Y);
 
 



Pour continuer un peu l'apprentissage du C avec vous, on va se créer une fonction qui va contenir le code qui va updater le sprite. Vu qu'elle ne renvois rien, ça sera void. Pour modifier le sprite, il faut trois arguement, l'id du sprite, la position X et la position Y : On va déclarer ses trois nouvelle variable directement dans la fonction comme ceci :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
 
void Update_Sprite(unsigned char ID_Sprite,unsigned char Position_X,unsigned char PositionY)
{
 
}
 
 



Ensuite à l'interrieur, nous allons placer le code adéquate et remplacer le 0 de la fonction uptade par ID_Sprite ce qui fait :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
void Update_Sprite(unsigned char ID_Sprite,unsigned char Position_X,unsigned char Position_Y)
{
                        // Retour du balayage écran
                        SMS_waitForVBlank();
                        
                        // Modification de la position du sprite 0 en fonction de la variable
                        
                        SMS_updateSpritePosition (ID_Sprite, Position_X, Position_Y);
                        
                        // On affiche les sprites à l'écran
                        SMS_copySpritestoSAT ();
}
 
 



On place le morceau de code en dessous de la fonction main.
Maintenant il faut déclarer la fonction. Pour cela vous placez au début du fichier au dessus de main, le nom de la fonction et les déclarations et vous ajoutez un ; comme ceci.

Portion de code : Tout sélectionner

1
void Update_Sprite(unsigned char ID_Sprite,unsigned char Position_X,unsigned char Position_Y);



Et maintenant dans la boucle on va appeller la fonction et lui passer les paramètres voulus.

Portion de code : Tout sélectionner

1
Update_Sprite(0,Position_X, Position_Y);



Cela donne ça :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
       while (1)
        {
                        // Modification de la variable
                        Position_X = Position_X+1; 
                        Update_Sprite(0,Position_X, Position_Y);
                        
                }
 


Si vous testez, le sprite va toujours bouger c'est normale.
Voila vous avez vu la création d'une petite fonction. Attention, vous ne pouvez pas modifier les variables qui sont déclarés dans le main, dans cette fonction.
Même si Position_X est identique que Position_X du main, ce n'est pas la même variable, ce n'est pas la même case mémoire. Mais ça on y reviendra beaucoup plus tard...

maintenant pour éviter les problèmes de variable, nous allons retravailler dans le main pour la gestion du pad et nous allons voir une partie fondamentale de la programmation... Les conditions. Les conditions permet de réaliser des actions quand la condition est remplis. Exemple dans notre cas.

Si le joueur utilise la touche droite de la manette alors on va ajouter 1 à la variable Position_X. En C une condition s'écrit comme ça :

Portion de code : Tout sélectionner

1
2
3
4
5
6
 
if (condition)
{
// code
}
 




La fonction pour tester en continu le pad de la master system c'est :

Portion de code : Tout sélectionner

1
 SMS_getKeysStatus() 


et nous allons assossier ça à un mot clef pour test. poiur le pad gauche c'est :

Portion de code : Tout sélectionner

1
PORT_A_KEY_RIGHT


et on assemble ça avec un &

On assemble tout çe maintenant et on modifie la Position X de 1.

Portion de code : Tout sélectionner

1
2
3
4
5
6
 
        if (SMS_getKeysStatus()& PORT_A_KEY_RIGHT)
                        {
                                Position_X = Position_X + 1 ;
                        }
 



On fait pareil avec Gauche, Haut et Bas. Attention pour Haut et Bas on touche la variable Position_Y et plus X.

Ce qui nous fait dans la boucle While...

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
 
while (1)
        {
                        // Modification de la variable
                        
                        if (SMS_getKeysStatus()& PORT_A_KEY_RIGHT)
                        {
                                Position_X = Position_X + 1 ;
                        }
                        
                        if (SMS_getKeysStatus()& PORT_A_KEY_LEFT)
                        {
                                Position_X = Position_X - 1 ;
                        }
                        
                        if (SMS_getKeysStatus()& PORT_A_KEY_UP)
                        {
                                Position_Y = Position_Y - 1 ;
                        }
                        
                        if (SMS_getKeysStatus()& PORT_A_KEY_DOWN)
                        {
                                Position_Y = Position_Y + 1 ;
                        }
                        
                        
                        Update_Sprite(0,Position_X, Position_Y);
                        
                }
 
 



Avec cette méthode nous pouvons nous déplacer aussi sur les diagonales. Ceci dit si vous utilisé avant les autres if, le mot clef else, on testera dans la chaine de condition, 1 et 1 seul condition. Une fois la condition testé, on passe à la fin de la chaine de if. Donc plus de diagonale.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
if (SMS_getKeysStatus()& PORT_A_KEY_RIGHT)
                        {
                                Position_X = Position_X + 1 ;
                        }
                        
                        else if (SMS_getKeysStatus()& PORT_A_KEY_LEFT)
                        {
                                Position_X = Position_X - 1 ;
                        }
                        
                        else if (SMS_getKeysStatus()& PORT_A_KEY_UP)
                        {
                                Position_Y = Position_Y - 1 ;
                        }
                        
                        else if (SMS_getKeysStatus()& PORT_A_KEY_DOWN)
                        {
                                Position_Y = Position_Y + 1 ;
                        }
 



Maintenant, notre sprite peut sortir de l'écran. Et si nous évitons tout ça ? C'est simple, nous allons faire une double condition. Débutons sur la droite. Pour que le sprite se déplace à droite, il faut que sa position X soit inférieur à 256- vu que c'est la taille de l'écran. (En partant de 0) et ba on placer ça aussi dans la condition avec un ET de condition. Et cette fois si c'est &&

Ce qui fait :

Portion de code : Tout sélectionner

1
2
3
4
5
6
 
if ( ( SMS_getKeysStatus()& PORT_A_KEY_RIGHT ) && ( Position_X < 256 ) )
                        {
                                Position_X = Position_X + 1 ;
                        }
 



Nous pouvons voir que le sprite est quand même mangé. On va rectifié ça en retirant aussi ça taille qui est de 8. Donc un 256-8.

Portion de code : Tout sélectionner

1
2
3
4
5
6
 
if ( ( SMS_getKeysStatus()& PORT_A_KEY_RIGHT ) && ( Position_X < 256-8 ) )
                        {
                                Position_X = Position_X + 1 ;
                        }
 




Réalisons la même opération pour les autres directions. Plus grand c'est le signe >

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
                        if ( ( SMS_getKeysStatus()& PORT_A_KEY_RIGHT ) && ( Position_X < 256-8 ) )
                        {
                                Position_X = Position_X + 1 ;
                        }
                        
                        else if ((SMS_getKeysStatus()& PORT_A_KEY_LEFT) && ( Position_X > 0 ) )
                        {
                                Position_X = Position_X - 1 ;
                        }
                        
                        else if ((SMS_getKeysStatus()& PORT_A_KEY_UP) && ( Position_Y > 0 ) )
                        {
                                Position_Y = Position_Y - 1 ;
                        }
                        
                        else if ((SMS_getKeysStatus()& PORT_A_KEY_DOWN) && ( Position_Y < 192-8 ) )
                        {
                                Position_Y = Position_Y + 1 ;
                        }
 



Faite bien attention au parenthèse. Toute les conditions sont dans une première parenthèse et prenez le plie de mettre aussi des parenthèse pour chaque sous condition.

Voici les symbole à connaitre pour tester les conditions :

== est égale. (Attention c'est bien un double égale, piège à con ça, et beaucoup erreur à ce niveau la)
> est supérieur à
< est inférieur à
>= Supérieur ou égale
<=inférieure ou égale
!= différent de.

et pour lier les conditions :
nous avons vu le ET représenté par
&& ET il faut que les conditions soit vrais.
|| Ou, si une des conditions est Vrais alors le code sera joué.

Pour aller plus loin.
SMS_getKeysStatus c'est donc pour connaitre le statut de la touche en gros c'est quand la touche est pressé dans notre exemple et que ça continue.

si vous remplacez par SMS_getKeysPressed, l'action ne sera pas répété car c'est au moment ou la touche est pressé que l'action va se faire.

et SMS_getKeysReleased, l'action va se faire quand la touche sera relâché.

Voila, vous savez utiliser le pad de la master system et déplacer un sprite.
La prochaine étape sera d'importer des graphismes via photoshop par exemple et les intégrer dans la mémoire vidéo. Nous réaliserons un écran titre au début, puis nous importerons des "tiles/sprites" et des palettes dans de future chapitre. Ouf plus besoin d'encoder à la main...


zoboner - posté le 31/10/2018 à 23:02:46 (1 messages postés)

❤ 0

Merci pour tout ces tuto bien cool.
Je ne sais pas si vous avez fait le tuto pour l'édition des graphismes? Car je suis très motivé de voir tout ça!
Chaque choses en son temps... Je sais que se genre de tuto demande du travail et une perte seche de vôtre temps libre, je félicite donc vos efforts.

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Articles perso | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Jeux complets | Tous les jeux | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers