90

#trifesses#trifouet
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

91

Fadest ton lien pour la lib ne marche pas.

Sinon je ne comprend pas comment obtenir l'equivalent des .pal et .obj pour le son.

Imaginons: je lance ABC, je touche un peu les boutons, je trouve une mélodie sympa, je repère chaque données afin de pouvoir ecrire ma chaîne ASCII (du style char tune[]="O2 X6 I1 V90 T15 R125 H0 K0)... et après?

Comment dois-je me servir de cette chaine?
j'imagine qu'il va me falloir avoir des .obj mais comment les obtenir?




Mon site sur la LYNX :ZoneLynx

92

Oups...
J'ai corrigé le lien.

Pour le reste, il n'y a pas d'équivalent objet quand on utilise ABCMusic.
C'est l'intérêt, on compose sa musique dans une chaine de caractère (au format anglais certes), ensuite, la librairie abc se charge de la décrypter et de jouer la musique.
Dans ton exemple, pour jouer tune[]..., tu dois avoir une ligne abcmusic(0, tune); et c'est tout.

Tu verras, l'exemple de Karri est assez simple à comprendre en fait, malgré que les déclaration sdes voies de musique fait peur (en assembleur)
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

93

J'ai téléchargé ABCMUSIC.obj et j'ai modifié le makelibr.bat comme cela:

del test.olb
libr65 a test. ABCMUSIC.OBJ
move test.olb ..

J'ai recopier l'exemple de Karri dans mon fichier test.c.


Lorsque je lance le makelibr.bat, le fichier ABCMUSIC est bien trouvé mais il n'arrive pas à créer un fichier test.olb du coup lors du c test il me dis que ce fichier est manquant et ne me fabrique donc pas la rom.

Ou est-ce que je me plante?
Mon site sur la LYNX :ZoneLynx

94

Euh, ce ne serais pas plutôt :
libr65 a test.olb ABCMUSIC.OBJ
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

95

mur me stupido!
Mon site sur la LYNX :ZoneLynx

96

Excellent! Ca marche!

Mais du coup cela a amené plein de questions et j'aimerais savoir si je comprends bien :

Donc une mélodie c'est ça:
_abcmusic0
dc.b "O1X7I0V45T20R40H2K3"
dc.b "|:CDEEDEFFEFGEFDGG"
dc.b "I1CDEEDEFFEFGEFDCC"
dc.b "I0cBAABAGGAGFFEDEE"
dc.b "cBAABAGGAGFFEDCC"
dc.b "ECDDFDEEGEFGABcc"
dc.b "ECDDFDEEGEFGABcc"
dc.b "CDEEDEFFEFGEFDGG"
dc.b "CDEEDEFFEFGEFDCC:"

dc.b 0
#endasm

La ligne bleu pas de soucis j'ai compris, c'est là que l'on gère le tempo les octave le rythme... .

Pour les lignes en vert je pense que la mélodie est ecrite entre "|:" et ":" les lettres ce sont les notes mais que sont ses "I1" et "I0" des lignes 3 et 4?

Et le 0 de la derniére ligne je n'ais pas bien compris, est-ce le nombre de fois que l'on veut répéter la musique?






Mon site sur la LYNX :ZoneLynx

97

"I1" et "I0" il me semble que c'est pour changer d'instrument et le 0 de dernière ligne est très probablement une façon de gérer les données asm en chaine C (en C, une chaine de caractère est dite null terminated string vu que la longueur n'est pas enregistrée mais que la fin de chaine est repérée par le caractère null (à savoir 0))


EDEFFEFGEFDGGCDEEDEFFEFGEFDCC:"; ça reviendrait à avoir (en C) : abcmusic0="O1X7I0V45T20R40H2K3|:CDEEDEFFEFGEFDGGI1CDEEDEFFEFGEFDCCI0cBAABAGGAGFFEDEEcBAABAGGAGFFEDCCECDDFDEEGEFGABccECDDFDEEGEFGABccCDE
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

98

Voilà.
Les |: et : servent à gérer les boucles.
en gros, quand il tombe sur le : , il recommence à partir du |:
Ca permet d'avoir une intro et ensuite une phrase rythmique qui se répète
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

99

chinois
Mon site sur la LYNX :ZoneLynx

100

http://pageperso.aol.fr/firenzemouss/pirouette.o

Mon 1er prog avec musique!! (merci fadest!)

Bon il y à encore pas mal de pr comme syncroniser musique et animation le tout boucler à l'infinie (et au meme tempo) mais je suis quand même bien content!
Mon site sur la LYNX :ZoneLynx

101

une maison tout en carton !!!
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

102

Tiré du "livre-piano" musical de ma fille! Pour la prochaine j'hésite avec fait dodo ou ainsi font font font!
Mon site sur la LYNX :ZoneLynx

103

la la la shtroumpf la la ça serait pas mal aussi
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

104

RYGAR (./100) :
http://pageperso.aol.fr/firenzemouss/pirouette.o

Mon 1er prog avec musique!! (merci fadest!)


2008 une année a surprise, regardez bien cela, OUI vous avez bien lu, on remercie Fadest pour de la musique..... Surtout ne rien dire wink


GT Melomane top
avatar
Accrochez vous ca va être Cerebral !!

105

avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

106

embarrassed comme c'est beau!

N'empeche c'est dur de trouver des partitions sympa et pas trop complexes!
Mon site sur la LYNX :ZoneLynx

107

vince (./105) :
http://auxpetitesmains.free.fr/chansonpirouette.htm


H.S.

Vince le specialiste Tektonik du Yaronet !!



GT dehors
avatar
Accrochez vous ca va être Cerebral !!

108

GT Turbo (./104) :
[2008 une année a surprise, regardez bien cela, OUI vous avez bien lu, on remercie Fadest pour de la musique..... Surtout ne rien dire wink


GT Melomane top

Ben mon tuto sons digits date de septembre 2004, à l'époque ou Tempi avait mis une condition à la réalisation de graphs pour un IK+ sur Lynx : qu'il y a ait des sons digits. La deuxième condition (bah oui, tempi ne serait pas tempi sans en demander 2 fois plus), c'était des effets de zooms quand les combattants se rapprochent un peu comme les jeux Neo Geo, mais ça, c'est trop facile sur Lynx grin
Il avait bien fallu que je creuse un peu grin, même si le projet est tombé à l'eau plus tard

Pour le reste, sur ABC, c'est de la traduction de l'article de Karri lui-même, et idem, je voyais mal Space Dance sans musiques gni

Maintenant, je pense que j'ai payé mes dettes, je peux faire ce que je veux.
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

109

J'ai voulu réaliser une sorte d'image panoramique qui donnerait l'illusion que l'on regarde un paysage à 360°.

Le résulta est plutôt sympa sauf lorsque l'on s'arrête à l’ endroit de la jonction après un déplacement de gauche à droite (bizarrement lors des déplacements de droite à gauche je ne rencontre pas le Pb).

Je vous livre le code et la rom.

Pour vous rendre compte de ce que je veux dire, lancez la rom, appuyez sur « gauche » pendant 2 secondes puis relâchez.

J'ai vu qqpart que Vince tu avais fais une sorte d'image similaire alors si toi ou fadest aviez une idée du pourquoi de ce bug et de comment le corriger...


http://pageperso.aol.fr/firenzemouss/panorama.o

#include <stdlib.h>
#include <lynx.h>
#include <lynxlib.h>
#include "inc\lake.pal"

#define JOY_RIGHT 0x10
#define JOY_LEFT 0x20
#define JOY_DOWN 0x40
#define JOY_UP 0x80
#define BUTTON_OPTION1 0x08
#define BUTTON_OPTION2 0x04
#define BUTTON_INNER 0x02
#define BUTTON_OUTER 0x01
#define BUTTON_PAUSE 0x01

char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);

extern char lake[];

extern char SCB[];
#asm
_SCB dc.b $c0,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm

int x,y;
int dir_x;

void Vsync()
{
#asm
vretrace:
lda $fd0a
bne vretrace
#endasm
}

char main()
{
InitIRQ();
CLI;

SetBuffers(SCREEN, RENDER ,0);

SetRGB(pal);
DrawFBox(0,0,160,102,0);
SCBX(SCB) = 0;
SCBY(SCB) = 0;
SCBDATA(SCB) = lake;
x=0;

for( ; ; )
{
x=x+dir_x;

if (joystick & JOY_RIGHT)x--;
if (x<-450) {x=0;}
SCBX(SCB) = x;
DrawSprite(SCB);

SCBX(SCB) = x+450;
DrawSprite(SCB);

if (joystick & JOY_LEFT)x++;
if (x>0) {x=-450;}
SCBX(SCB) = x;
DrawSprite(SCB);

Vsync();
SwapBuffers();
}
}
Mon site sur la LYNX :ZoneLynx

110

J'ai pas étudié ton source en détail, mais à mon avis le problème vient du fait que ton programme est structuré comme ça :

- gestion de la touche droite -> mise à jour de x et dessin
- dessin qui utilise x
- gestion de la touche gauche -> mise à jour de x et dessin

Donc suivant que tu appuies sur gauche ou droite, tu utilises soit l'ancienne valeur de x, soit la nouvelle, dans la partie du milieu.
Solution : calcule d'abord la nouvelle valeur de x suivant les touches appuyées, et fait les opérations de dessin après.

Ah, et méfiance, tu fais [code]x=x+dir_x; [/code] alors que dir_x n'est pas initialisé.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

111

Merci d’avoir jeté un œil Zerosquare.

Je pense avoir compris ce que tu me dis mais je croyais justement que mon code faisait d’abord les calculs puis le dessin et si tel n’est pas le cas je ne vois pas comment le transformer.

En fait j'ai l'impression qu'il y a un micro temps de latence entre le moment ou la 1ere image se déplace est le moment ou la deuxième (dont la position est déterminée par la première) se repositionne.

Si ça se trouve le problème vient d’handy mais malheureusement j’ai cramé mon câble pour lancé ça sur console…
Mon site sur la LYNX :ZoneLynx

112

Essaie de modifier ton code comme ceci :

(...le début ne change pas...)
[code]for( ; ; )
{
if (joystick & JOY_RIGHT)x--;
if (x<-450) {x=0;}
if (joystick & JOY_LEFT)x++;
if (x>0) {x=-450;}

SCBX(SCB) = x;
DrawSprite(SCB);
SCBX(SCB) = x+450;
DrawSprite(SCB);

Vsync();
SwapBuffers();
}
[/code]
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

113

Cool, je n'ai plus rien à faire grin

Effectivement, la solution de Zerosquare me semble pas mal.
Sinon, tu peux aussi jouer avec le déplacement de la fenetre virtuelle pour des scrolls, c'est généralement plus rapide et efficace.
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

114

Autre possibilité : c'est peut être l'un des bugs matériels connus du moteur de sprite...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

115

Zerosquare je n'ai qu'un mot un à dire : "BRAVO" !

Ton bout de code fonctionne nickel. J'ai même l'impression que la vitesse de défilement est plus rapide.
Fadest (./113) :
tu peux aussi jouer avec le déplacement de la fenetre virtuelle pour des scrolls


Du coup deux questions : C'est quoi la fenetre virtuelle?
Comment on l'utilise?

Mon site sur la LYNX :ZoneLynx

116

Pas de quoi hehe
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

117

La fenetre virtuelle, qu'est ce ?

Imaginons que tu ais un espace d'affichage plus grand que l'écran de la Lynx.
Si tu veux te déplacer dans cet espace, tu as le choix entre 2 possibilités :
- déplacer ton fond, c'est à dire recalculer les positions x & y des sprites constituant ce décor à chaque appui sur une direction.
- déplacer ton écran, c'est à dire toujours afficher ces sprites au même endroits, mais changer le pixel haut/gauche ou commence l'affichage.

Pour prendre un exemple, imagines un grand poster et une petite feuille.
Si tu veux que ta feuille soit à un autre endroit du poster, soit tu déplaces tout le poster dessous, soit tu déplaces la feuille.

Là, c'est pareil, tu as 2 variables hoff et voff qui correspondent aux coordonnées du pixel 0,0 de ton écran dans ton monde virtuel.
Ce sont ces variables qui vont être modifiées en cas d'appui sur une direction.
L'idéal, c'est de combiner avec un affichage chainé de tes 2 images de fond pour ne faire qu'un ordre DrawSprite().
Le chainage de sprite permet de dire au moteur de sprite qu'après l'affichage d'un sprite, il faut qu'il affiche le suivant et ainsi de suite, c'est donc plus rapide à gérer pour la Lynx.

Normalement, ce sera un peu plus fluide que ta version actuelle. Même si bien sur, chainage + fenetre virtuelle, c'est surtout super efficace quand le fond est constitué de plein de petits blocs (ça évite de recalculer les coordonnées de chaques, et le chainage est obligatoire dans ce cas là).


Ton exemple deviendrait donc :
#include <stdlib.h>
#include <lynx.h>
#include <lynxlib.h>
#include "inc\lake.pal"

#define JOY_RIGHT 0x10
#define JOY_LEFT 0x20
#define JOY_DOWN 0x40
#define JOY_UP 0x80
#define BUTTON_OPTION1 0x08
#define BUTTON_OPTION2 0x04
#define BUTTON_INNER 0x02
#define BUTTON_OUTER 0x01
#define BUTTON_PAUSE 0x01

char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);

extern char lake[];

extern char SCB1[];
#asm
_SCB1 dc.b $c0,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm

extern char SCB2[];
#asm
_SCB2 dc.b $c0,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm

void Vsync()
{
#asm
vretrace:
lda $fd0a
bne vretrace
#endasm
}

char main()
{
InitIRQ();
CLI;

SetBuffers(SCREEN, RENDER ,0);

SetRGB(pal);
DrawFBox(0,0,160,102,0);
SCBX(SCB1) = 0;
SCBY(SCB1) = 0;
SCBDATA(SCB1) = lake;
SCBNEXT(SCB1) = SCB2;
SCBX(SCB2) = 450;
SCBY(SCB2) = 0;
SCBDATA(SCB2) = lake;

hoff=0;
voff=0;

for( ; ; )
{
if (joystick & JOY_RIGHT)hoff++;
if (hoff>450) {hoff=0;}


if (joystick & JOY_LEFT)hoff--;
if (hoff<0) {hoff=450;}

DrawSprite(SCB1);

Vsync();
SwapBuffers();
}
}



Pas testé, mais ça devrait marcher (enfin je pense).
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

118

http://www.monlynx.de/lynx/sprite.html#_13
Par contre plus de précision sur le pourquoi du comment par Fadest ou vince m'intéresserait bcp.
Un écran virtuel de 512*512 pour une résolution de 160*102 ok, mais pourquoi faire?
D'après ce que j'ai compris, le hardware ne recalcule que les sprites qui apparaissent vraiment (heureusement), donc l'idée fonctionnelle c'est de pouvoir mettre ses sprites en réserve ? de manière à tout déclarer au début et à les utiliser par la suite?
C'est de définir son monde à l'avance et de scroller dedans, ou alors de sauter d'un endroit à un autre pour faire des effets visuels violents?
Ce que je dis n'est pas très clair, mais j'attends vos avis !!

119

Note : je pense qu'on peut dépasser le 512x512, mais il y a peut-être des soucis de performance, je ne me rappelle plus.

En fait, le Lynx gère un système de clipping, c'est à dire qu'elle ne s'occupe pas des sprites ne devant pas être affichés.
L'intérêt ?
Par exemple, prenons un jeu de plate forme type Mario qui ferait 3 écrans de large et 1 de haut, donc du 480x102.
On reconstitue l'ensemble de cette image de 480x102 (le fond bleu, quelques nuages, les blocs de décors...), si possible avec des sprites chainés.
Tous ces objets ont une position fixe, avec x compris entre 0 et 480 et y compris entre 0 et 102.
Une fois défini, plus besoin de retourcher à tous ça.
Idem pour les enenmis, ils se déplacent dans ce monde suivant leur algotithme.

En fonction des déplacements du joueur, on déplace le sprite du joueur et parallèlement cet écran virtuel pour gérer le scrolling, ou la téléportation éventuelle...
Ca réduit considérablement les calculs entre chaque affichage.

O navait fait l'expérience il y a quelques années avec Fagemul je crois. Il avait fait une petite routine gérant un niveau comme décrit plus haut sans utiliser les astuces de la Lynx (sprites chainés et écran virtuel). Donc, à chaque affichage, il parcourait son tableau décrivant la map, calculait les coordonnées et affichait éventuellement le sprite individuellement.
Ca ramait. On avait ensuite modifier son programme pour déclarer une fois pour toute les sprites à l'aide d'une liste de sprite chainés, puis déplacer la fenetre virtuelle. C'était devenu très fluide. Il faut dire que du coup, la boucle principale du programme ne faisait rien de plus que celle donnée en exemple à Rygar plus haut (test joystick -> modification position personnage + déplacement éventuel de l'écran virtuel).


Ce serait le même principe pour une map dans un RPG avec des tiles de 16x16, il y en aurait 70 à l'écran en permanence. Sans le chainage, ça ramerait trop.
Et si on veut que notre map soit plus grande que l'écran, sans l'écran virtuel, on ferait une tonne de calculs à chaque déplacement, autant de perdu pour ce qui est vraiment important au jeu.

Cet écran virtuel est également utilisé dans Space Dance, en fait, les flèches ne montent pas, elels restent fixes, et c'est l'écran virtuel qui descend. Encore pour limiter les calculs entre 2 affichages.

avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

120

OK, merci de tes précisions.
Qu'entends tu exactement pas sprites chainés?
Comment faire quand le niveau de Mario est plus long? ou alors as-tu des exemples de jeux lynx où on voit clairement que la taille du niveau a été fait sur mesure des possibilités de la machine ?