1

89

Je viens de découvrir l'excellent Batari Basic pour la vénérable VCS :

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 cheeky). Une sorte de Pong à 1 joueur avec 4 raquettes (1 sur chaque bord).
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 grin

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 cheeky

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 grin
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 :


Et la rom :
tromb Fichier joint : test.bas.bin

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 wink
- 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 eek
- à 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 top

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 wink
avatar

2

Ca a l'air drôlement sympa ce basic.
Si je me remotive un peu à programmer un de ces quatre je testerai smile
En attendant je met ton post en post-it wink

3

Je viens de l'installer ... je vais étudier tout ça ...

4

cool ! Bravo Fafa pour les infos ! smile

5

Pas mal de jeux sont déjà développés avec ce bataribasic et sont dispo chez AtariAge. J'en ai parlé sur le forum ReVival, je vous donne le lien ça peut toujours aider ! Aussi il peut être intéressant, si les auteurs sont d'accord bien sûr, d'étudier les sources des jeux développés en Bataribasic. Je peux peut-être les contacter si ça intéresse certains d'entre vous ?

http://forums.acbm.com/acbm/forum/viewthread?thread=408
avatarRevival Gamers : toute l'actu du jeu vidéo homebrew - demoscene - reportage - programmation - ...
http://cotegamers.com

6

Bien sur, tout coup de pouce est le bien venu.

avatarATARI Belgique toujours actif

http://gfa-basic.forumactif.com/

7

Je prépare un tuto pour les nuls ...

8

fredifredo, tu as bien raison car vu le niveau de certain wink

je parle pour moi biensur smile

Arklif tongue

9

il y a un peu de setup à faire

C'est bien là la première grande difficulté pour des novices ... L'installation est quand même un peu laborieuse, mais une fois que tout fonctionne c'est le bonheur totale smile

10

Tu prévois quelque chose pour les sous-nuls ?
avatarATARI Belgique toujours actif

http://gfa-basic.forumactif.com/

11

Déjà j'essaye de trouver une solution simple pour expliquer l'installation mais c'est vraiment pas facile de condenser une doc qui est déjà très claires mais fait 3 pages A4 écrites en polices de 10 ... gol

Je me demande quand même si aux vues des tutos et routines toutes faites en assembleur , le Batari vaille le coup ... vu ses limites techniques ... au pire je pourrais montrer quelques trucs à l'AC ... je suis en pleine réflexion sur le sujet ... mur

12

L'AC m'a permis de voir les quelques réalisations commerciales faites en Batari et là c'est la grosse deception sad
la qualité des jeux n'est vraiment pas à la hauteur ! sprites mono couleur et fonds presque vide ... comparer aux sorties de ces 10 dernières années c'est un retour 30 ans en arrière sick

Une installation complexe alliée à des résultats très moyens, voilà bien le problème de Batari pour l'instant !

Vive l'assembleur !

13

-

14

Est ce topic est toujours d'actualité ?

15

Déjà le monde des coders 2600 français se réduit à une ou 2 personnes, ensuite vu tous les exemples dispos en assembleur pourquoi utiliser ce langage qui réduit les capacités graphiques de cette console qui n'en a déjà pas beaucoup ? voilà sans doute les raisons qui expliquent que ça n'intéresse personne !

16

On va sans doute retirer ce topic de l'annonce. et Faire une liens dans le topic "programmation".

17

Je viens de jouer à 2 très bons jeux en batari basic dernièrement.

Alien greed adventure et Nite bear . miam

18

19

Pour ceux qui voudraient faire de jolis écran d'intro :

http://atariage.com/forums/topic/169819-the-titlescreen-kernel/

c'est une routine asm "usine à gaz" pour le Batari Basic mais c'est quand même pas mal !

20

Dis moi, Fadest, depuis tout ce temps, tu n'as jamais eu envie de coder la VCS en ASM ?
Pour de vrai quoi.
Pas juste compiler un truc qui tourne mais faire le jeu de A à Z.
C'est une expérience incroyable; je t'assure.smile
avatarcodeur VCS 2600

21

Perso je n'en doute pas ... J'ai même un projet de jeu sur 2600 qui pourrait être sympa smile

22

Excellent !!!!! smile
On peut voir quelque chose ?
avatarcodeur VCS 2600

23

J'ai même un projet de jeu sur 2600 qui pourrait être sympa

Je n'ai pas écrit "va être sympa" sad , un peu overbooké : j'ai juste le scénario et 2-3 tests graphiques ...

24

Ne te mets pas la pression smile
avatarcodeur VCS 2600