Je viens de découvrir l'excellent Batari Basic pour la vénérable VCS : http://bataribasic.com
Pour résumer, il s'agit d'un basic sur PC, destiné à la VCS.
Pour être plus clair, la création d'un programme se déroule de cette manière :
- saisie du source dans un éditeur de texte sur l'ordinateur (Notepad, BBEdit, ...)
- compilation du source et génération d'un exécutable VCS
Ainsi, contrairement aux vieux basic, il ne s'agit pas d'un interprété, mais bien d'un compilateur, d'ou des performances assez étonnantes, à en voir ce qui a déjà été fait avec.
Et énorme avantage, il décharge l'utilisateur de tout ce qui est gestion de la vidéo, du comptage des cycles...
Bref, c'est moins performant que l'assembleur bien sur, mais la programmation VCS en devient tellement simple que celui qui a vraiment envie, un peu de temps et un peu de doc, peut se créer ces quelques jeux assez facilement.
Assez de blable, passons à la démo, je vous conseille de télécharger le compilateur sur le lien donné plus haut, il y a un peu de setup à faire et vous pouvez déjà essayer de compiler les 3 programmes donnés en exemple (le jeu de zombies est assez étonnant d'ailleurs).
Pour ma part, je me suis amusé une petite heure ce soir (sans rien connaitre de la prog VCS auparavant) à faire mon premier programme, et histoire de tenter de vous motiver, le voici :
set smartbranching on player0x = 50 : player0y = 2 player1x = 50 : player1y = 85 COLUPF = 90 missile0height=8 : missile0x = 4 : missile0y=40 missile1height=8 : missile1x = 160 : missile1y=40 ballheight=1 : ballx = 50 : bally = 50 x = 1 : y = 1 debut COLUP0 = 120 COLUP1 = 14 player0: %11111111 end player1: %11111111 end a = a + 1 : if a = 3 then a = 0 : ballx = ballx + x : bally = bally + y drawscreen if collision(missile0,ball) then x=-x if collision(missile1,ball) then x=-x if collision(player0,ball) then y=-y if collision(player1,ball) then y=-y if joy0up then if missile0y>10 then missile0y = missile0y - 1 if joy0down then if missile0y<84 then missile0y = missile0y + 1 if joy0left then if player0x>4 then player0x = player0x - 1 if joy0right then if player0x<151 then player0x = player0x + 1 player1x = player0x missile1y = missile0y goto debut
et maintenant, le même avec les commentaires.
A la base, il s'agit du programme que je fais toujours en premier quand je découvre une machine (nostalgie du GFA

Tout d'abord, la VCS a certaines limitations :
- 2 sprites monochromes
- 2 "missiles" (traits verticaux)
- 1 balle
Le tout sur une résolution plutôt limitée

Et un playfield (le fond d'écran) - des gros pixels généralement (en fait des blocs 8x8)
Notons que la doc de BBasic indique qu'il est possible de passer à 5 sprites sans problèmes (joie), et sans doute beaucoup mieux, mais restons aux bases pour l'instant
Pour ce premier programme, j'ai décidé de :
- ne pas utiliser de playfield
- utiliser les 2 missiles comme raquettes verticales
- utiliser les 2 sprites comme raquettes horizontales
- utiliser la balle comme ... balle

avant de commenter le source, quelques consignes et remarques qui vous éviteront de perdre du temps :
- on peut utiliser des numéros de ligne ... ou pas (un peu comme le GFA) - en fait les numéros de lignes sont des labels - voir plus loin
- il est possible de mettre plusieurs instructions sur la même ligne (séparées par : )
- il faut un espace au début de chaque ligne, sauf devant les labels et certains mots clés (end, return, ...) sinon, ça plante à la compilation
Allons y
set smartbranching on
Cette instruction (cf doc) sert à optimiser la génération de code pour les if...then. Bref, si vous voulez aller voir le codé généré, mettez la à off, sinon, mettez la à on
player0x = 50 : player0y = 2 player1x = 50 : player1y = 85 missile0height=8 : missile0x = 4 : missile0y=40 missile1height=8 : missile1x = 160 : missile1y=40 ballheight=1 : ballx = 50 : bally = 50
pour chaque sprite, missile et balle, il existe quelques variables prédéfinies telles que :
player0x : la position x du sprite du player 0
missile0height : la hauteur du missile 0
...
Là, j'initialise donc mes positions, et mes hauteurs de missiles (8 pixels, pour faire des raquettes)
x = 1 : y = 1
Le compilateur gère 26 variables différentes : de 'a' à 'z'
x et y servent ici à gérer la trajectoire de la balle
COLUPF = 90
La couleur du playfield (certes, je ne m'en sers pas, mais la balle est de la couleur d'affichage du playfield)
debut COLUP0 = 120 COLUP1 = 14 player0: %11111111 end player1: %11111111 end
définition du label debut (pour un goto ultérieur)
COLUP0 et COLUP1 définissent les couleurs des sprites player0 et player1 (et des missiles associés)
pour commencer à définir le dessin d'un sprite, on utilise le mot clé player0: ou player1:
un sprite fait 8 pixels de large, et peut faire tout la hauteur de l'acran si on veut.
Chaque ligne %nnnnnnnn représente don l'état d'un pixel (1=allumé, 0 = éteint) pour la ligne
On termine la définition du sprite par le mot clé end (pas d'espace avant, attention)
Là, j'ai donc défini chaque sprite comme faisant 8 pixels de large, et 1 pixel de hauteur
Hop, on attaque le programme
a = a + 1 : if a = 3 then a = 0 : ballx = ballx + x : bally = bally + y
Là, c'ets pour gérer le déplacement de la balle, on ajoute x et y aux coordonnées de la balle.
Petit tempo, je ne le fait pas à chaque passage, mais 1 fois sur 3 (pour que les raquettes se déplacent plus vite que la balle)
drawscreen
C'est l'ordre qui affiche les sprites à l'écran
if collision(missile0,ball) then x=-x if collision(missile1,ball) then x=-x if collision(player0,ball) then y=-y if collision(player1,ball) then y=-y
Et oui, il y a une soutine intégrée de gestion des collisions entre 2 objets : bonheur

Là, en cas de collision entre la balle et une raquette, je fais un rebond
if joy0up then if missile0y>10 then missile0y = missile0y - 1 if joy0down then if missile0y<84 then missile0y = missile0y + 1 if joy0left then if player0x>4 then player0x = player0x - 1 if joy0right then if player0x<151 then player0x = player0x + 1
La gestion du joystick 0.
En fonction de la direction choisie, une ou plusieurs de ces 4 variables sera positionnée (en fait, il s'agit de variables sur 1 bit, faut pas gacher la mémoire)
Je ne gère que misisle 0 ou player 0, car la raquette d'en face doit être synchro...
Il y a un test pour empéher le joueur de faire sortir sa raquette de l'écran
player1x = player0x missile1y = missile0y goto debut
Je resynchronise la raquette d'en face, et goto pour boucler...
une image :
[/url]
Et la rom :

Quelques remarques :
- les plus attentifs auront remarqué qu'il n'y a pas de gestion de la défaite (si on rate la balle) : c'ets un bon exercice, si vous voulez vous amuser

- malgré tout, en une trentaine de lignes (et pas optimisé, même si j'ai groupé par moment sur 1 ligne), c'est assez fort

- à la lecture de la doc, on peut faire beaucoup plus que ça, bien sur, on atteindra jamais de l'asm sauce pieuvre aux petits oignons, mais ça facilite tellement le dev sur VCS

Pour ma part, je vais peut-être jouer encore un peu avec, et qui sait, si j'ai une idée de jeu qui puisse répondre aux contraintes de la VCS, peut-être que je prolongerait l'expérience
En attendant, si d'autres veulent tester... plus on est de fous, plus on rit
