Fission est un casse-brique, la 0.1 est la toute première version "jouable", donc pas encore de brique à l'écran. Et là un peu de lecture : /*
Fission (casse brique) 0.1 - LYNX - kit BLL (newcc65)
24/11/2010
console tenu à la verticale
Handy/Option/Rotate Screen(Right)
D-pad et bouton pause
LYNX - video game */
#include <stdlib.h>
#include <lynx.h>
#include <lynxlib.h>
//{
extern void silence();
extern void abcmusic();
extern void update_music();
char abcmusic0[];
char abcmusic1[];
char abcmusic2[];
char abcmusic3[];
char abcmenu1[];
char abcmenu2[];
char abcbric[];
char abcaptvir[];
char abcboum[];
char abcpanne[];
char abces[];
#asm
xref _abcmenu1
xref _abcmenu2
xref _abcbric
xref _abcaptvir
xref _abcboum
xref _abcpanne
xref _abces
xref _abcmusic0
xref _abcmusic1
xref _abcmusic2
xref _abcmusic3
_abcmenu1
dc.b "O2X7I1V32T20R54H7K8"
dc.b "|:C4"
dc.b 0
_abcmenu2
dc.b "O3X7I1V16T20R54H7K12"
dc.b "|:c2"
dc.b 0
_abcbric
dc.b "O4X7I1V16T20R54H7K12"
dc.b "|:C1"
dc.b 0
_abcaptvir
dc.b "O2X15I1V32T1R14H6K30"
dc.b "|:C4D4C4E4D4C4D4"
dc.b 0
_abcboum
dc.b "O2X248I1V16T50R80H2K2"
dc.b "|:C2"
dc.b 0
_abcpanne
dc.b "O4X6I1V127T6R5H6K6"
dc.b "|:C4D4C4E4D4C4D4E4C4"
dc.b 0
_abces
dc.b "O4X6I1V127T6R16H2K3"
dc.b "|:C2D2C2E2D2C2D2E2C2"
dc.b 0
_abcmusic0
dc.b "O2X3I1V70T20R54H2K1"
dc.b "|:C4O3T2C4"
dc.b 0
_abcmusic1
dc.b "O2X7I0V45T20R80H8K1"
dc.b "|:C4D4E4F4"
dc.b "C4D4E4F4"
dc.b "c4B4A4E4"
dc.b "c4B4A4E4"
dc.b "E4F4G4A4"
dc.b "E4F4G4A4"
dc.b "C4D4E4F4"
dc.b "C4D4E4F4:"
dc.b 0
_abcmusic2
dc.b "O1X7I0V45T20R40H2K3"
dc.b "zzzzzzzz"
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
_abcmusic3
dc.b "O2X7I0V45T20R80H8K1"
dc.b "z4z4z2"
dc.b "|:C4D4E4F4"
dc.b "C4D4E4F4"
dc.b "c4B4A4E4"
dc.b "c4B4A4E4"
dc.b "E4F4G4A4"
dc.b "E4F4G4A4"
dc.b "C4D4E4F4"
dc.b "C4D4E4F4:"
dc.b 0
#endasm
//}
/* LYNX-specific #defines: */
#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_LEFT 0x02
#define BUTTON_RIGHT 0x01
#define BUTTON_PAUSE 0x01
#define SC BSTRETC H(a) (*(uint *)((a)+15)) // déformation, macro
#define SC BTILT(a) (*(uint *)((a)+17)) // déformation, macro
char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);
char pali[]={
0x00,0x0F,0x02,0x03,0x0A,0x04,0x05,0x06,0x07,0x0B,0x08,0x09,0x04,0x0B,0x0C,0x01,
0x00,0xFF,0x22,0x33,0xAA,0x44,0x55,0x66,0x77,0x00,0x88,0x99,0x53,0xBB,0xCC,0x11};
char palg[]={
0x00,0x0F,0x0A,0x00,0x03,0x05,0x08,0x0A,0x0C,0x0E,0x0D,0x00,0x04,0x03,0x02,0x00,
0x00,0xFF,0xF0,0x0F,0x3F,0x5F,0x8F,0xAF,0xCF,0xEF,0x28,0xF8,0x53,0x63,0x52,0x21};
/*****************************************************************************
** Ci-dessous, le contenu du fichier batchfile pour l'image imole.bmp **
**
set image01=imole.bmp
SPRPCK -t6 -S072072 -r001001 -a036036 -p0 %image01%
cmd
**
** Le point d'action de l'image imole est mis au centre de celle-ci, **
** 72/2 = 36 (-a036036). Le but de la manoeuvre est de réaliser un zoom **
** correctement. **
*****************************************************************************/
// Ci-dessous, le contenu du fichier batchfile pour l'image imole.bmp
// set image01=imole.bmp
// SPRPCK -t6 -S072072 -r001001 -a036036 -p0 %image01%
// cmd
// ci-dessus, le point d'action de l'image imole est mis au centre de celle-ci, 72/2 = 36 (-a036036).
extern char ipause[]; // image game over, d'une taille de 13*43;
extern char ititre[]; // image titre, d'une taille de 15*49;
extern char iname[]; // image nom/prénom de auteur, d'une taille de 93*9;
extern char imole[]; // image molecule, d'une taille de 72*72;
char SCB[];
#asm
_SCB dc.b $c7,$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 fondg[]; // image fond game, d'une taille de 160*102;
char SCBg[];
#asm
_SCBg 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 pushup[]; // image appuyez sur haut, d'une taille de 48*35;
char SCBp[];
#asm
_SCBp dc.b $c7,$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 raquet[]; // image raquette, d'une taille de 8*24;
char SCBr[];
#asm
_SCBr dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
char chiffres[]; //
// clip du sprite chiffres: 0123456789.LEV
extern char bc000000[];
extern char bc000001[];
extern char bc000002[];
extern char bc000003[];
extern char bc000004[];
extern char bc000005[];
extern char bc000006[];
extern char bc000007[];
extern char bc000008[];
extern char bc000009[];
extern char bc000010[];
extern char bc000011[];
extern char bc000012[];
extern char bc000013[];
char *chiffrestab[14] = {bc000000, bc000001, bc000002, bc000003, bc000004,
bc000005, bc000006, bc000007, bc000008, bc000009,
bc000010, bc000011, bc000012, bc000013};
char SCBchiffres1[]; // déclaration d'un nouveau controleur de sprite
char SCBchiffres2[]; // déclaration d'un nouveau controleur de sprite
char SCBchiffres3[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBchiffres1 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBchiffres2 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
;
_SCBchiffres3 dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
// ------------------------------------
char fleche[]; //
// clip du sprite fleches
extern char fd000000[];
extern char fd000001[];
extern char fd000002[];
extern char fd000003[];
extern char fd000004[];
extern char fd000005[];
extern char fd000006[];
char *fdtab[7] = {fd000000, fd000001, fd000002, fd000003, fd000004,
fd000005, fd000006};
char SCBfd[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBfd dc.b $c7,$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 fball[]; // image raquette, d'une taille de 8*24;
char SCBball[];
#asm
_SCBball dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
// ------------------------------------
char fbriq[]; //
// clip du sprite brique, d'une taille de 6*14, normale, dure et incassable.
extern char br000000[];
extern char br000001[];
extern char br000002[];
char *brtab[3] = {br000000, br000001, br000002};
char SCBbr[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCBbr dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
int posx,posy,level,score,compteur,xpush,ypush,relach;
int i;
char tempa,tempb,tempc,tempd,tempe,etape,filife,drap1,gspause,gsblip,mhaut,mbas; // de -128 à 127
int molescx,molescy,gmole;
int atest,unite,dizaine,centaine;
// ydirf --> déplacer légérement la flèche.
// dirf --> direction fleche de 0 à 6, mais aussi direction Y de la balle (-3 -2 -1 0 +1 +2 +3) (ici gauche/droite car LYNX verticale).
// bdirx --> direction X de la balle (ici haut/bas car le jeu se joue la LYNX tenu à la verticale).
char ydirf,dirf,bdirx,speedX,oboucl,basar;
int balldirX,balldirY;
int yplayer;
// assembler vertical retrace syncronisation routine
void Vsync()
{
#asm
vretrace:
lda $fd0a
bne vretrace
#endasm
}
// Hors de l'assembleur, point de salut...
// L'utilisation de la procedure suivante, lors de l'écran d'action,
// fait ramer le jeu.
void Fchiffres(clx,cly,classe)
int clx,cly,classe;
{
SCBDATA(SCBchiffres1) = chiffrestab[classe%14];
SCBX(SCBchiffres1) = clx;
SCBY(SCBchiffres1) = cly;
DrawSprite(SCBchiffres1);
}
/**************************************************************************
** **
** **
**************************************************************************/
char main()
{
InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
posx=76;
posy=47;
xpush=-48;
ypush=34;
// SCBX(SCB) = 60;
// SCBY(SCB) = 42;
// SCBDATA(SCB) = ititre;
// 1er sprite chainé (fond + raquette)
SCBX(SCBg) = -200;
SCBY(SCBg) = 0;
SCBDATA(SCBg) = fondg;
SCBNEXT(SCBg) = SCBp; // chainage de sprite info commande
SCBX(SCBp) = xpush;
SCBY(SCBp) = ypush;
SCBDATA(SCBp) = pushup;
//SCBCTL0(SCBp)= 0x001;//99; // pas glop
SCBNEXT(SCBp) = SCBr; // chainage de sprite raquette
SCBX(SCBr) = -200;
SCBY(SCBr) = 0;
SCBDATA(SCBr) = raquet;
SCBNEXT(SCBr) = SCBball; // chainage de sprite balle
SCBX(SCBball) = -200;
SCBY(SCBball) = 0;
SCBDATA(SCBball) = fball;
SCBNEXT(SCBball) = SCBfd; // chainage de sprite fleche directionnelle
SCBX(SCBfd) = 0;
SCBY(SCBfd) = 0;
SCBDATA(SCBfd) = fleche;
SCBX(SCBbr) = -200;
SCBY(SCBbr) = 0;
SCBDATA(SCBbr) = fbriq;
// 3ème sprite chainé (score)
SCBX(SCBchiffres1) = 0;
SCBY(SCBchiffres1) = 0;
SCBDATA(SCBchiffres1) = chiffres;
SCBNEXT(SCBchiffres1) = SCBchiffres2; // chainage de sprite
SCBX(SCBchiffres2) = 0;
SCBY(SCBchiffres2) = 0;
SCBDATA(SCBchiffres2) = chiffres;
SCBNEXT(SCBchiffres2) = SCBchiffres3; // chainage de sprite
SCBX(SCBchiffres3) = 0;
SCBY(SCBchiffres3) = 0;
SCBDATA(SCBchiffres3) = chiffres;
/**************************************************************************
** BOUCLE PRINCIPALE **
**************************************************************************/
for( ; ; )
{
update_music(); // petite subtilité de la gestion sonore
++gsblip; // economie ressource machine --> certaines des conditions n'ont pas besoin d'être lu par la LYNX à chaque boucle.
if (gsblip==5)
{
gsblip=1;
if (switches & BUTTON_PAUSE)
{
if (gspause==0) {gspause=1;silence();abcmusic(0,abcaptvir);}
}
if (!(switches & BUTTON_PAUSE))
{
if (gspause==1) gspause=2;
}
if (switches & BUTTON_PAUSE)
{
if (gspause==2) gspause=3;
}
if (!(switches & BUTTON_PAUSE))
{
if (gspause==3) gspause=0;
}
}
/**************************************************************************
**************************************************************************/
if (etape>=0 & etape<=4) // écran titre
{
/* set the palette */
SetRGB(pali); // Ceci sert à changer la palette de la Lynx.
DrawFBox(0,0,160,102,0); // couleur 0 (noire)
SCBX(SCBr) = -200; // raquette mis hors de l'écran
SCBX(SCBball) = -200; // balle mis hors de l'écran
SCBX(SCBfd) = -200; // fleche directionnelle mis hors de l'écran
//SCBX(SCB) = 78-(molescx/gmole);SCBY(SCB) = 42-(molescy/gmole)
//SCBX(SCB) = SCBX(SCB) - (molescx/6); SCBY(SCB) = SCBY(SCB) - (molescy/6);
SCBX(SCB) = 78; SCBY(SCB) = 52;
SCBDATA(SCB) = imole;
if (gspause==0)
{
if (etape==4) {
if (molescx>256) molescx=molescx-4;
if (molescy>128) molescy=molescy-8;
if (molescx<257 & molescy<129) {molescx=256;molescy=128;etape=2;mhaut=4;}
}
if (etape==3) {
if (molescx>128) molescx=molescx-8;
if (molescy>256) molescy=molescy-4;
if (molescx<129 & molescy<257) {molescx=128;molescy=256;etape=2;mbas=4;}
}
if (etape==2) {
if (molescx<384) molescx=molescx+(4+mbas);
if (molescy<384) molescy=molescy+(4+mhaut);
if (molescx>383 & molescy>383)
{
molescx=384;molescy=384;++tempc;mhaut=0;mbas=0;
if (tempc==3) tempc=1;
if (tempc==1) etape=3;
if (tempc==2) etape=4;
}
}
if (etape==1) {
++tempb;
if (tempb>64) {
tempb=0;etape=2;
}
}
if (etape==0) {
if (molescx<256) {
molescx=molescx+2;molescy=molescy+2;
if (molescx>255) {molescx=256;molescy=256;etape=1;gmole=2;}
}
}
}
SCBHS(SCB) = molescx;
SCBVS(SCB) = molescy;
DrawSprite(SCB); // affichage molecule
if (etape>0) {SCBHS(SCB) = 256;SCBVS(SCB) = 256;} // remise à 0 echelle des images SCB
SCBX(SCB) = 34; SCBY(SCB) = 2; SCBDATA(SCB) = iname; DrawSprite(SCB);
SCBX(SCB) = 74; SCBY(SCB) = 26; SCBDATA(SCB) = ititre; DrawSprite(SCB);
Fchiffres(6,68,2); // 2
Fchiffres(6,76,0); // 0
Fchiffres(6,84,1); // 1
Fchiffres(6,92,0); // 0
SCBDATA(SCBp) = pushup;
SCBX(SCBp) = xpush;//48;
SCBY(SCBp) = ypush;
SCBX(SCBg) = -200; // fond zone de jeu
//SCBX(SCBp) = xpush;
SCBX(SCBr) = -200; // raquette
DrawSprite(SCBg);
if (gspause==0 & etape>0)
{
if (xpush<8) xpush=xpush+2; // apparition de la bulle info "Push UP"
if (xpush>7)//(tempa>24 & etape==0) // petite teporisation avant d'autoriser le joueur de recommencer le jeu.
{
xpush=8;
++tempa; // bulle info clignote doucement
if (tempa>63) tempa=1;
if (tempa>0 & tempa<32) ypush=34;
if (tempa>31) ypush=-100;
if (joystick & JOY_RIGHT)
{
level=1;//3;//1;
tempa=0;tempb=0;etape=10;//xpush=-48;ypush=34;xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;elvl=0;
xpush=-48;ypush=34;
score=0;drap1=0; // drap1 agit sur l'affichage du score.
filife=3;
// bruitage menu :
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
SetRGB(palg); // Ceci sert à changer la palette de la Lynx.
SCBX(SCBg) = 0; // fond zone de jeu
SCBX(SCBp) = xpush;
relach=1;
}
}
}
}
/**************************************************************************
**************************************************************************/
if (etape==10) // ecran level
{
SCBDATA(SCBp) = pushup;
SCBX(SCBp) = xpush;//48;
SCBY(SCBp) = ypush;
SCBX(SCBr) = -200; // Coordonnée X de la raquette (ici mis hors de l'écran).
DrawSprite(SCBg); // Affichage fond jeu + info commande + raquette + balle + fleche directionnelle
Fchiffres(120,18,11); //L
Fchiffres(120,18+8,12); //E
Fchiffres(120,18+16,13); //V
Fchiffres(120,18+24,12); //E
Fchiffres(120,18+32,11); //L
unite = level % 10;
dizaine = level / 10 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%14];
SCBX(SCBchiffres1) = 120;
SCBY(SCBchiffres1) = 50+24;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%14];
SCBX(SCBchiffres2) = 120;
SCBY(SCBchiffres2) = 50+16;
DrawSprite(SCBchiffres1); // Affichage valeur testé
if (relach==1) {
if (!(joystick & JOY_RIGHT)) {relach=0;} // utile pour vérifier si le joueur n'appui plus sur D-pad haut
}
if (gspause==0 & xpush<8) xpush=xpush+2;
if (gspause==0 & xpush>7)//(tempa>24 & etape==0) // petite teporisation avant d'autoriser le joueur de recommencer le jeu.
{
xpush=7;
++tempa; // bulle info clignote doucement
if (tempa>63) tempa=1;
if (tempa>0 & tempa<32) ypush=34;
if (tempa>31) ypush=200;
if (relach==0) {
if (joystick & JOY_RIGHT) {
//level=1;//3;//1;
tempa=0;tempb=0;etape=20,yplayer=39;//xpush=-48;ypush=34;xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;elvl=0;
xpush=-48;ypush=34;
dirf=3;ydirf=6;
//score=0;drap1=0; // drap1 agit sur l'affichage du score.
//goship=0; posx=-40; posy=39;
//filife=3;
//govil=0;goroch=0;tyroch=0;chroch=0;
//SCBDATA(SCB) = fondlvl;
// bruitage menu :
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
// // bruitage panne sèche :
// silence();
// abcmusic(3,abcpanne);
//SetRGB(palg); // Ceci sert à changer la palette de la Lynx.
//SCBX(SCBg) = 0; // fond zone de jeu
SCBX(SCBp) = xpush;
//SCBX(SCBr) = 200; // raquette
relach=1; // utile pour vérifier si le joueur n'appui plus sur D-pad haut
Vsync();
SwapBuffers();
}
}
}
}
/**************************************************************************
**************************************************************************/
if (etape==20) // écran jeu 1 (fleche directionnelle)
{
// raquette :
SCBDATA(SCBr) = raquet;
SCBX(SCBr) = 32;
SCBY(SCBr) = yplayer;
// balle :
SCBX(SCBball) = 40;
SCBY(SCBball) = 48;
// fleche directionnelle :
SCBDATA(SCBfd) = fdtab[dirf%7];
SCBX(SCBfd) = 39+8;
SCBY(SCBfd) = (42-6)+ydirf;
if (gspause==0)
{
if (tempa>0) {--tempa;}
if (joystick & JOY_DOWN)
{
if (tempa==0 & dirf<6) {++dirf;tempa=16;++ydirf;++ydirf;}
}
if (joystick & JOY_UP)
{
if (tempa==0 & dirf>0) {--dirf;tempa=16;--ydirf;--ydirf;}
}
if (relach==1)
{
if (!(joystick & JOY_RIGHT)) {relach=0;} // utile pour vérifier si le joueur n'appui plus sur D-pad haut
}
if (joystick & JOY_RIGHT)
{
if (relach==0) {
SCBX(SCBfd) = -200; // fleche directionnelle mis hors de l'écran
dirf=dirf-3;bdirx=1;
tempa=0;etape=30;
balldirX=SCBX(SCBball);
balldirY=SCBY(SCBball);
}
}
}
DrawSprite(SCBg); // Affichage fond jeu + info commande + raquette + balle + fleche directionnelle
}
/**************************************************************************
**************************************************************************/
if (etape==30) // écran jeu 2
{
if (gspause==0)
{
if (dirf<0) // Si la balle se dirige vers la gauche, alors...
{
balldirY=balldirY-1;
if (dirf==-3) {speedX=3;}
if (dirf==-2) {speedX=2;}
if (dirf==-1) {speedX=1;}
if (balldirY<3) {balldirY=3;dirf=-dirf;} // cadre gauche
}
if (dirf==0) // Si la balle se dirige droit devant, alors...
{
speedX=0;
}
if (dirf>0) // Si la balle se dirige vers la droite, alors...
{
balldirY=balldirY+1;
if (dirf==1) {speedX=1;}
if (dirf==2) {speedX=2;}
if (dirf==3) {speedX=3;}
if (balldirY>93) {balldirY=93;dirf=-dirf;} // cadre droite (102-6 = 96-3 = 93)
}
++tempa;
if (tempa>speedX)
{
tempa=0;
if (bdirx==1) {
balldirX=balldirX+2; // ball monte
if (balldirX>154) {// collision haut du cadre: changement de direction
balldirX=154;bdirx=-bdirx; // inverse la direction de la balle
if (dirf==0) {
basar=random()%3; // de 0 à 2
--basar;dirf=basar; // -1 ou 0 ou 1
}
}
}
if (bdirx==-1) {
balldirX=balldirX-2;// ball descend
if (balldirX>32 & balldirX<40)// collision ball/raquette: changement de direction
{
if ((balldirY+1>yplayer-1 & balldirY+1<yplayer+24) | (balldirY+4>yplayer-1 & balldirY+4<yplayer+24))
{
balldirX=40;bdirx=-bdirx;
//gauche de la raquette :
if ((balldirY+1>yplayer-1 & balldirY+1<yplayer+4) | (balldirY+4>yplayer-1 & balldirY+4<yplayer+4))
{
if (dirf==-1) {dirf=-3;oboucl=1;}//break;
if (dirf==-2) {dirf=-3;oboucl=1;}
if (dirf==1) {dirf=-2;oboucl=1;}
if (dirf==2) {dirf=-3;oboucl=1;}
if (dirf==3) {dirf=-3;oboucl=1;}
if (dirf==0) {dirf=-2;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//gauche de la raquette :
if ((balldirY+1>yplayer+3 & balldirY+1<yplayer+9) | (balldirY+3>yplayer+4 & balldirY+4<yplayer+9))
{
if (dirf==-1) {dirf=-2;oboucl=1;}
if (dirf==-3) {dirf=-2;oboucl=1;}
if (dirf==1) {dirf=-1;oboucl=1;}
if (dirf==2) {dirf=-2;oboucl=1;}
if (dirf==3) {dirf=-2;oboucl=1;}
if (dirf==0) {dirf=-1;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//centre de la raquette :
if ((balldirY+1>yplayer+8 & balldirY+1<yplayer+15) | (balldirY+4>yplayer+8 & balldirY+4<yplayer+15))
{
if (dirf==1) {dirf=0;oboucl=1;}
if (dirf==2) {dirf=1;oboucl=1;}
if (dirf==3) {dirf=2;oboucl=1;}
if (dirf==-1) {dirf=0;oboucl=1;}
if (dirf==-2) {dirf=-1;oboucl=1;}
if (dirf==-3) {dirf=-2;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//droite de la raquette :
if ((balldirY+1>yplayer+14 & balldirY+1<yplayer+20) | (balldirY+4>yplayer+14 & balldirY+4<yplayer+20))
{
if (dirf==1) {dirf=2;oboucl=1;}
if (dirf==3) {dirf=2;oboucl=1;}
if (dirf==-1) {dirf=1;oboucl=1;}
if (dirf==-2) {dirf=2;oboucl=1;}
if (dirf==-3) {dirf=2;oboucl=1;}
if (dirf==0) {dirf=1;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//droite de la raquette :
if ((balldirY+1>yplayer+19 & balldirY+1<yplayer+24) | (balldirY+4>yplayer+19 & balldirY+4<yplayer+24))
{
if (dirf==1) {dirf=3;oboucl=1;}
if (dirf==2) {dirf=3;oboucl=1;}
if (dirf==-1) {dirf=2;oboucl=1;}
if (dirf==-2) {dirf=3;oboucl=1;}
if (dirf==-3) {dirf=3;oboucl=1;}
if (dirf==0) {dirf=2;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
}
}
}
}
test_finish:
if (joystick & JOY_DOWN) {
yplayer=yplayer+2;
if (yplayer>75) {yplayer=75;} // (102-24 = 78-3 = 75) ; 24 = largeur de la raquette
}
if (joystick & JOY_UP) {
yplayer=yplayer-2;
if (yplayer<3) {yplayer=3;}
}
}
SCBX(SCBball)=balldirX;SCBY(SCBball)=balldirY; // appliquer les variables balldirX et balldirY aux coordonnées de la balle.
SCBY(SCBr) = yplayer;
// Affichage fond jeu + info commande + raquette + balle + fleche directionnelle :
DrawSprite(SCBg);
}
/**************************************************************************
**************************************************************************/
/* test
*/
//atest=balldirX;//yplayer;//speedX;//dirf;//etape;
atest=etape;//SCBCTL0(SCBbr);
unite = atest % 10;
dizaine = atest / 10 % 10;
centaine = score / 100 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%14];
SCBX(SCBchiffres1) = 100;
SCBY(SCBchiffres1) = 53;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%14];
SCBX(SCBchiffres2) = 100;
SCBY(SCBchiffres2) = 53-8;
// centaine:
SCBDATA(SCBchiffres3) = chiffrestab[centaine%12]; // 0
SCBX(SCBchiffres3) = 100;
SCBY(SCBchiffres3) = 53-16;
DrawSprite(SCBchiffres1); // Affichage valeur testé
//if (etape==2 & gspause>0)
if (gspause>0) {
SCBDATA(SCB) = ipause;
SCBHS(SCB) = 256;SCBVS(SCB) = 256;
SCBX(SCB) = 73;SCBY(SCB) = 30;
DrawSprite(SCB);
}
Vsync();
SwapBuffers();
}
/**************************************************************************
** FIN de la BOUCLE PRINCIPALE **
**************************************************************************/
}
Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
Je suis entrain de finir une mini borne d'arcade avec une lynx à l'intérieur et j'hésitais à en faire aussi une avec l'écran en position vertical car je trouvais qu'il n'y avait pas assez de jeux qui utilisait cette mise en page mais vu tes réalisations je pense que cette petite borne verticale verra bien le jour Mon site sur la LYNX :ZoneLynx |
c'est obligé d'écrire dans votre compilateur: void Fchiffres(clx,cly,classe) int clx,cly,classe; { blabla } parce que c'est quand même plus facile de faire void Fchiffres(int clx, int cly, int classe) { blabla } non? Nspire wiki CONDUCTEUR Va-et-vient Des QUATRE MANCHE AVEC DES DIODES |
je sais oui, mais je demande si c'est nécessaire ici Nspire wiki CONDUCTEUR Va-et-vient Des QUATRE MANCHE AVEC DES DIODES |
De mémoire justement, ça marchait pas... Sinon, on peut tout faire avec des variables globales aussi |
(ah ok ^^) Nspire wiki CONDUCTEUR Va-et-vient Des QUATRE MANCHE AVEC DES DIODES |
Godzil (./3) :une âme charitable pour traduire/décrypter ? squalyl (./2) :de mémoire ça ne marchais pas comme ça. Mais à utiliser que pour tester la valeur des variables (je n'utilise pas encore mednafen), ou alors en dehors de l'écran de jeu (l'intro par exemple), car le chainage des sprites est primordial. RYGAR (./1) :J'ai déjà envie de voir ça exe version 0.2 : Fichier joint : chainage de sprites + point d'action de la balle mis au centre de celle-ci + correction interacton balle/raquette + bruitages source: Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
source, 1er partie: /*
Fission (casse brique) 0.2 - LYNX - kit BLL (newcc65)
27/11/2010
console tenu à la verticale
Handy/Option/Rotate Screen(Right)
D-pad et bouton pause
LYNX - video game */
#include <stdlib.h>
#include <lynx.h>
#include <lynxlib.h>
//{
extern void silence();
extern void abcmusic();
extern void update_music();
char abcmusic0[];
char abcmusic1[];
char abcmusic2[];
char abcmusic3[];
char abcmenu1[];
char abcmenu2[];
char abcball1[];
char abcball2[];
char abcbric[];
char abcaptvir[];
char abcboum[];
char abcpanne[];
char abces[];
#asm
xref _abcmenu1
xref _abcmenu2
xref _abcball1
xref _abcbric
xref _abcaptvir
xref _abcboum
xref _abcpanne
xref _abces
xref _abcmusic0
xref _abcmusic1
xref _abcmusic2
xref _abcmusic3
_abcmenu1
dc.b "O2X7I1V32T20R54H7K8"
dc.b "|:C4"
dc.b 0
_abcmenu2
dc.b "O3X7I1V16T20R54H7K12"
dc.b "|:c2"
dc.b 0
; ball :
_abcball1
dc.b "O4X3I1V70T20R32H2K1"
dc.b "|:C4"
_abcball2
dc.b "O4X3I1V70T20R32H2K1"
dc.b "| Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
beauregard (./7) :Ben la norme C K & R est la première norme du C, telle que définie par les auteurs du langage (Kernigan & Ritchie) Il y a eu des petites modifications ensuite. |
source, 2eme partie:
/**************************************************************************
** **
** **
**************************************************************************/
char main()
{
InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
posx=76;
posy=47;
xpush=-48;
ypush=34;
// SCBX(SCB) = 60;
// SCBY(SCB) = 42;
// SCBDATA(SCB) = ititre;
// 1er sprite chainé (fond + raquette)
SCBX(SCBg) = -200;
SCBY(SCBg) = 0;
SCBDATA(SCBg) = fondg;
SCBNEXT(SCBg) = SCBp; // chainage de sprite info commande
SCBX(SCBp) = xpush;
SCBY(SCBp) = ypush;
SCBDATA(SCBp) = pushup;
//SCBCTL0(SCBp)= 0x001;//99; // pas glop
SCBNEXT(SCBp) = SCBr; // chainage de sprite raquette
SCBX(SCBr) = -200;
SCBY(SCBr) = 0;
SCBDATA(SCBr) = raquet;
SCBNEXT(SCBr) = SCBball; // chainage de sprite balle
SCBX(SCBball) = -200;
SCBY(SCBball) = 0;
SCBDATA(SCBball) = fball;
SCBNEXT(SCBball) = SCBfd; // chainage de sprite fleche directionnelle
SCBX(SCBfd) = 0;
SCBY(SCBfd) = 0;
SCBDATA(SCBfd) = fdtab[dirf%7];//fleche;
horszone=150;// mettre les briques hors de l'écran visible. Sprite brique d'une taille de 6*14, 0=normale 1=dure 2=incassable.
SCBNEXT(SCBfd) = SCBbr01; // chainage de la brique 01
SCBX(SCBbr01) = 85-horszone;
SCBY(SCBbr01) = 16;
SCBDATA(SCBbr01) = brtab[0%3]; //
SCBNEXT(SCBbr01) = SCBbr02; // chainage de la brique 02
SCBX(SCBbr02) = 85-horszone;
SCBY(SCBbr02) = 16+14;
SCBDATA(SCBbr02) = brtab[0%3]; //
SCBNEXT(SCBbr02) = SCBbr03; // chainage de la brique 03
SCBX(SCBbr03) = 85-horszone;
SCBY(SCBbr03) = 16+28;
SCBDATA(SCBbr03) = brtab[0%3]; //
SCBNEXT(SCBbr03) = SCBbr04; // chainage de la brique 04
SCBX(SCBbr04) = 85-horszone;
SCBY(SCBbr04) = 16+42;
SCBDATA(SCBbr04) = brtab[0%3]; //
SCBNEXT(SCBbr04) = SCBbr05; // chainage de la brique 05
SCBX(SCBbr05) = 85-horszone;
SCBY(SCBbr05) = 16+56;
SCBDATA(SCBbr05) = brtab[0%3]; //
SCBNEXT(SCBbr05) = SCBbr06; // chainage de la brique 06
SCBX(SCBbr06) = 91-horszone;
SCBY(SCBbr06) = 16;
SCBDATA(SCBbr06) = brtab[0%3]; //
SCBNEXT(SCBbr06) = SCBbr07; // chainage de la brique 07
SCBX(SCBbr07) = 91-horszone;
SCBY(SCBbr07) = 16+14;
SCBDATA(SCBbr07) = brtab[0%3]; //
SCBNEXT(SCBbr07) = SCBbr08; // chainage de la brique 08
SCBX(SCBbr08) = 91-horszone;
SCBY(SCBbr08) = 16+28;
SCBDATA(SCBbr08) = brtab[0%3]; //
SCBNEXT(SCBbr08) = SCBbr09; // chainage de la brique 09
SCBX(SCBbr09) = 91-horszone;
SCBY(SCBbr09) = 16+42;
SCBDATA(SCBbr09) = brtab[0%3]; //
SCBNEXT(SCBbr09) = SCBbr10; // chainage de la brique 10
SCBX(SCBbr10) = 91-horszone;
SCBY(SCBbr10) = 16+56;
SCBDATA(SCBbr10) = brtab[0%3]; //
SCBNEXT(SCBbr10) = SCBbr11; // chainage de la brique 11
SCBX(SCBbr11) = 97-horszone;
SCBY(SCBbr11) = 16;
SCBDATA(SCBbr11) = brtab[0%3]; //
SCBNEXT(SCBbr11) = SCBbr12; // chainage de la brique 12
SCBX(SCBbr12) = 97-horszone;
SCBY(SCBbr12) = 16+14;
SCBDATA(SCBbr12) = brtab[0%3]; //
SCBNEXT(SCBbr12) = SCBbr13; // chainage de la brique 13
SCBX(SCBbr13) = 97-horszone;
SCBY(SCBbr13) = 16+28;
SCBDATA(SCBbr13) = brtab[0%3]; //
SCBNEXT(SCBbr13) = SCBbr14; // chainage de la brique 14
SCBX(SCBbr14) = 97-horszone;
SCBY(SCBbr14) = 16+42;
SCBDATA(SCBbr14) = brtab[0%3]; //
SCBNEXT(SCBbr14) = SCBbr15; // chainage de la brique 15
SCBX(SCBbr15) = 97-horszone;
SCBY(SCBbr15) = 16+56;
SCBDATA(SCBbr15) = brtab[0%3]; //
SCBNEXT(SCBbr15) = SCBbr16; // chainage de la brique 16
SCBX(SCBbr16) = 103-horszone;
SCBY(SCBbr16) = 16;
SCBDATA(SCBbr16) = brtab[0%3]; //
SCBNEXT(SCBbr16) = SCBbr17; // chainage de la brique 17
SCBX(SCBbr17) = 103-horszone;
SCBY(SCBbr17) = 16+14;
SCBDATA(SCBbr17) = brtab[0%3]; //
SCBNEXT(SCBbr17) = SCBbr18; // chainage de la brique 18
SCBX(SCBbr18) = 103-horszone;
SCBY(SCBbr18) = 16+28;
SCBDATA(SCBbr18) = brtab[0%3]; //
SCBNEXT(SCBbr18) = SCBbr19; // chainage de la brique 19
SCBX(SCBbr19) = 103-horszone;
SCBY(SCBbr19) = 16+42;
SCBDATA(SCBbr19) = brtab[0%3]; //
SCBNEXT(SCBbr19) = SCBbr20; // chainage de la brique 15
SCBX(SCBbr20) = 103-horszone;
SCBY(SCBbr20) = 16+56;
SCBDATA(SCBbr20) = brtab[0%3]; //
SCBNEXT(SCBbr20) = SCBbr21; // chainage de la brique 21
SCBX(SCBbr21) = 109-horszone;
SCBY(SCBbr21) = 16;
SCBDATA(SCBbr21) = brtab[0%3]; //
SCBNEXT(SCBbr21) = SCBbr22; // chainage de la brique 22
SCBX(SCBbr22) = 109-horszone;
SCBY(SCBbr22) = 16+14;
SCBDATA(SCBbr22) = brtab[0%3]; //
SCBNEXT(SCBbr22) = SCBbr23; // chainage de la brique 23
SCBX(SCBbr23) = 109-horszone;
SCBY(SCBbr23) = 16+28;
SCBDATA(SCBbr23) = brtab[0%3]; //
SCBNEXT(SCBbr23) = SCBbr24; // chainage de la brique 24
SCBX(SCBbr24) = 109-horszone;
SCBY(SCBbr24) = 16+42;
SCBDATA(SCBbr24) = brtab[0%3]; //
SCBNEXT(SCBbr24) = SCBbr25; // chainage de la brique 25
SCBX(SCBbr25) = 109-horszone;
SCBY(SCBbr25) = 16+56;
SCBDATA(SCBbr25) = brtab[0%3]; //
SCBNEXT(SCBbr25) = SCBscore1; // chainage score unité
SCBX(SCBscore1) = 4;
SCBY(SCBscore1) = 99-8;
SCBDATA(SCBscore1) = chiffrestab[0%14]; //
SCBNEXT(SCBscore1) = SCBscore2; // chainage score dizaine
SCBX(SCBscore2) = 4;
SCBY(SCBscore2) = 99-16;
SCBDATA(SCBscore2) = chiffrestab[0%14]; //
SCBNEXT(SCBscore2) = SCBscore3; // chainage score centaine
SCBX(SCBscore3) = 4;
SCBY(SCBscore3) = 99-24;
SCBDATA(SCBscore3) = chiffrestab[0%14]; //
SCBNEXT(SCBscore3) = SCBscore4; // chainage score millier
SCBX(SCBscore4) = 4;
SCBY(SCBscore4) = 99-32;
SCBDATA(SCBscore4) = chiffrestab[0%14]; //
SCBX(SCBscore1) = -10;SCBX(SCBscore2) = -10;SCBX(SCBscore3) = -10;SCBX(SCBscore4) = -10; // score placés hors de l'écran
// 3ème sprite chainé (score)
SCBX(SCBchiffres1) = 0;
SCBY(SCBchiffres1) = 0;
//SCBDATA(SCBchiffres1) = chiffres;
SCBNEXT(SCBchiffres1) = SCBchiffres2; // chainage de sprite
SCBX(SCBchiffres2) = 0;
SCBY(SCBchiffres2) = 0;
//SCBDATA(SCBchiffres2) = chiffres;
SCBNEXT(SCBchiffres2) = SCBchiffres3; // chainage de sprite
SCBX(SCBchiffres3) = 0;
SCBY(SCBchiffres3) = 0;
//SCBDATA(SCBchiffres3) = chiffres;
etape=10;SetRGB(palg); // provisoire
level=1;//3;//1;
tempa=0;tempb=0;etape=10;//xpush=-48;ypush=34;xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;elvl=0;
xpush=-48;ypush=34;
score=0;drap1=0; // drap1 agit sur l'affichage du score.
filife=3;
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
SetRGB(palg); // Ceci sert à changer la palette de la Lynx.
SCBX(SCBg) = 0; // fond zone de jeu
SCBX(SCBp) = xpush;
//SCBX(SCBr) = 200; // raquette
relach=1;
*/
/**************************************************************************
** BOUCLE PRINCIPALE **
**************************************************************************/
for( ; ; )
{
Vsync();
SwapBuffers();
update_music(); // petite subtilité de la gestion sonore
++gsblip; // economie ressource machine --> certaines des conditions n'ont pas besoin d'être lu par la LYNX à chaque boucle.
if (gsblip==5)
{
gsblip=1;
if (switches & BUTTON_PAUSE)
{
if (gspause==0) {gspause=1;silence();abcmusic(0,abcaptvir);}
}
if (!(switches & BUTTON_PAUSE))
{
if (gspause==1) gspause=2;
}
if (switches & BUTTON_PAUSE)
{
if (gspause==2) gspause=3;
}
if (!(switches & BUTTON_PAUSE))
{
if (gspause==3) gspause=0;
}
}
/**************************************************************************
**************************************************************************/
if (etape>=0 & etape<=4) // écran titre
{
/* set the palette */
SetRGB(pali); // Ceci sert à changer la palette de la Lynx.
DrawFBox(0,0,160,102,0); // couleur 0 (noire)
SCBX(SCBr) = -200; // raquette mis hors de l'écran
SCBX(SCBball) = -200; // balle mis hors de l'écran
SCBX(SCBfd) = -200; // fleche directionnelle mis hors de l'écran
SCBX(SCB) = 78; SCBY(SCB) = 52;
SCBDATA(SCB) = imole;
if (gspause==0)
{
if (etape==4) {
if (molescx>256) molescx=molescx-4;
if (molescy>128) molescy=molescy-8;
if (molescx<257 & molescy<129) {molescx=256;molescy=128;etape=2;mhaut=4;}
}
if (etape==3) {
if (molescx>128) molescx=molescx-8;
if (molescy>256) molescy=molescy-4;
if (molescx<129 & molescy<257) {molescx=128;molescy=256;etape=2;mbas=4;}
}
if (etape==2) {
if (molescx<384) molescx=molescx+(4+mbas);
if (molescy<384) molescy=molescy+(4+mhaut);
if (molescx>383 & molescy>383)
{
molescx=384;molescy=384;++tempc;mhaut=0;mbas=0;
if (tempc==3) tempc=1;
if (tempc==1) etape=3;
if (tempc==2) etape=4;
}
}
if (etape==1) {
++tempb;
if (tempb>64) {
tempb=0;etape=2;
}
}
if (etape==0) {
if (molescx<256) {
molescx=molescx+2;molescy=molescy+2;
if (molescx>255) {molescx=256;molescy=256;etape=1;gmole=2;}
}
}
}
SCBHS(SCB) = molescx;
SCBVS(SCB) = molescy;
DrawSprite(SCB); // affichage molecule
if (etape>0) {SCBHS(SCB) = 256;SCBVS(SCB) = 256;} // remise à 0 echelle des images SCB
SCBX(SCB) = 34; SCBY(SCB) = 2; SCBDATA(SCB) = iname; DrawSprite(SCB);
SCBX(SCB) = 74; SCBY(SCB) = 26; SCBDATA(SCB) = ititre; DrawSprite(SCB);
//
SCBX(SCBscore1) = 4;SCBX(SCBscore2) = 4;SCBX(SCBscore3) = 4;SCBX(SCBscore4) = 4;
SCBDATA(SCBscore1) = chiffrestab[0%14];
SCBDATA(SCBscore2) = chiffrestab[1%14];
SCBDATA(SCBscore3) = chiffrestab[0%14];
SCBDATA(SCBscore4) = chiffrestab[2%14];
//Fchiffres(6,68,2); // 2
//Fchiffres(6,76,0); // 0
//Fchiffres(6,84,1); // 1
//Fchiffres(6,92,0); // 0
SCBDATA(SCBp) = pushup;
SCBX(SCBp) = xpush;//48;
SCBY(SCBp) = ypush;
SCBX(SCBg) = -200; // fond zone de jeu
//SCBX(SCBp) = xpush;
SCBX(SCBr) = -200; // raquette
DrawSprite(SCBg); // Affichage fond jeu + info commande + raquette + balle + fleche directionnelle + briques + score
if (gspause==0 & etape>0)
{
if (xpush<8) xpush=xpush+2; // apparition de la bulle info "Push UP"
if (xpush>7)//(tempa>24 & etape==0) // petite teporisation avant d'autoriser le joueur de recommencer le jeu.
{
xpush=8;
++tempa; // bulle info clignote doucement
if (tempa>63) tempa=1;
if (tempa>0 & tempa<32) ypush=34;
if (tempa>31) ypush=-100;
if (joystick & JOY_RIGHT)
{
level=1;//3;//1;
tempa=0;tempb=0;etape=10;//xpush=-48;ypush=34;xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;elvl=0;
xpush=-48;ypush=34;
score=0;drap1=0; // drap1 agit sur l'affichage du score.
filife=3;
// bruitage menu :
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
// // bruitage panne sèche :
// silence();
// abcmusic(3,abcpanne);
SetRGB(palg); // Ceci sert à changer la palette de la Lynx.
SCBX(SCBg) = 0; // fond zone de jeu
SCBX(SCBp) = xpush;
relach=1;
SCBDATA(SCBscore1) = chiffrestab[0%14];
SCBDATA(SCBscore2) = chiffrestab[0%14];
SCBDATA(SCBscore3) = chiffrestab[0%14];
SCBDATA(SCBscore4) = chiffrestab[0%14];
}
}
}
//TextOut(24, 2, 2, 0, "Philippe Haouli present"); // lettre grise 32,32,32
//TextOut(24, 2, 1, 0, "Philippe Haouli"); // lettre blanche
}
/**************************************************************************
**************************************************************************/
if (etape==10) // ecran level
{
ShowScreen(); // Coordonnées de toutes les briques (voir au début de ce joyeux code).
//DrawSprite(SCBg); // Affichage fond jeu + info commande + raquette + balle + fleche directionnelle + briques + score
SCBDATA(SCBp) = pushup;
SCBX(SCBp) = xpush;//48;
SCBY(SCBp) = ypush;
SCBX(SCBr) = -200; // Coordonnée X de la raquette (ici mis hors de l'écran).
DrawSprite(SCBg); // Affichage fond jeu + info commande + raquette + balle + fleche directionnelle + score
Fchiffres(120,18,11); //L
Fchiffres(120,18+8,12); //E
Fchiffres(120,18+16,13); //V
Fchiffres(120,18+24,12); //E
Fchiffres(120,18+32,11); //L
unite = level % 10;
dizaine = level / 10 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%14];
SCBX(SCBchiffres1) = 120;
SCBY(SCBchiffres1) = 50+24;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%14];
SCBX(SCBchiffres2) = 120;
SCBY(SCBchiffres2) = 50+16;
DrawSprite(SCBchiffres1); // Affichage valeur testé
if (relach==1) {
if (!(joystick & JOY_RIGHT)) {relach=0;} // utile pour vérifier si le joueur n'appui plus sur D-pad haut
}
if (gspause==0 & xpush<8 & horszone==0) xpush=xpush+2;
if (gspause==0 & xpush>7)//(tempa>24 & etape==0) // petite teporisation avant d'autoriser le joueur de recommencer le jeu.
{
xpush=7;
++tempa; // bulle info clignote doucement
if (tempa>63) tempa=1;
if (tempa>0 & tempa<32) ypush=34;
if (tempa>31) ypush=200;
if (relach==0 & horszone==0) {
if (joystick & JOY_RIGHT) {
//level=1;//3;//1;
tempa=0;tempb=0;etape=20,yplayer=39;//xpush=-48;ypush=34;xlvla=160;xlvlb=160;xlvlc=160;xlvld=160;xlvle=160;elvl=0;
xpush=-48;ypush=34;
dirf=3;ydirf=6;
//score=0;drap1=0; // drap1 agit sur l'affichage du score.
//goship=0; posx=-40; posy=39;
//filife=3;
//govil=0;goroch=0;tyroch=0;chroch=0;
//SCBDATA(SCB) = fondlvl;
// bruitage menu :
silence();
abcmusic(0,abcmenu1);
abcmusic(1,abcmenu2);
// // bruitage panne sèche :
// silence();
// abcmusic(3,abcpanne);
//SetRGB(palg); // Ceci sert à changer la palette de la Lynx.
//SCBX(SCBg) = 0; // fond zone de jeu
SCBX(SCBp) = xpush;
//SCBX(SCBr) = 200; // raquette
relach=1; // utile pour vérifier si le joueur n'appui plus sur D-pad haut
Vsync();
SwapBuffers();
}
}
}
}
/**************************************************************************
**************************************************************************/
if (etape==20) // écran jeu 1 (fleche directionnelle)
{
// raquette :
SCBDATA(SCBr) = raquet;
SCBX(SCBr) = 32;
SCBY(SCBr) = yplayer;
// balle :
SCBX(SCBball) = 42;
SCBY(SCBball) = 50;
// fleche directionnelle :
SCBDATA(SCBfd) = fdtab[dirf%7];
SCBX(SCBfd) = 39+8;
SCBY(SCBfd) = (42-6)+ydirf;
if (gspause==0)
{
if (tempa>0) {--tempa;}
if (joystick & JOY_DOWN)
{
if (tempa==0 & dirf<6) {++dirf;tempa=16;++ydirf;++ydirf;}
}
if (joystick & JOY_UP)
{
if (tempa==0 & dirf>0) {--dirf;tempa=16;--ydirf;--ydirf;}
}
if (relach==1)
{
if (!(joystick & JOY_RIGHT)) {relach=0;} // utile pour vérifier si le joueur n'appui plus sur D-pad haut
}
if (joystick & JOY_RIGHT)
{
if (relach==0) {
SCBX(SCBfd) = -200; // fleche directionnelle mis hors de l'écran
dirf=dirf-3;bdirx=1;
tempa=0;etape=30;
balldirX=SCBX(SCBball);
balldirY=SCBY(SCBball);
}
}
}
DrawSprite(SCBg); // Affichage fond jeu + info commande + raquette + balle + fleche directionnelle + briques + score
}
/**************************************************************************
**************************************************************************/
if (etape==30) // écran jeu 2
{
if (gspause==0)
{
if (dirf<0) // Si la balle se dirige vers la gauche, alors...
{
if (balldirY<3)
{
balldirY=3;dirf=-dirf; // cadre gauche
// bruitage balle cadre:
silence();
abcmusic(1,abcball2);
}
if (dirf==-3) {
++Ytemp;
if (Ytemp>1) {Ytemp=0;balldirY=balldirY-3;odirx=3;} // vitesse Y réelle --> -1,5
}
if (dirf==-2) {balldirY=balldirY-1;odirx=2;} // vitesse Y --> -1
if (dirf==-1) {
++Ytemp;odirx=1;
if (Ytemp>1) {Ytemp=0;balldirY=balldirY-1;} // vitesse Y réelle --> -0,5
}
}
if (dirf==0) {odirx=0;} // vitesse X --> +2 balle se dirige droit devant.
if (dirf>0) // Si la balle se dirige vers la droite, alors...
{
if (dirf==1) {
++Ytemp;odirx=1;
if (Ytemp>1) {Ytemp=0;balldirY=balldirY+1;} // vitesse Y réelle --> +0,5
}
if (dirf==2) {balldirY=balldirY+1;odirx=2;} // vitesse Y --> +1
if (dirf==3) {
++Ytemp;
if (Ytemp>1) {Ytemp=0;balldirY=balldirY+3;odirx=3;} // vitesse Y réelle --> +1,5
}
if (balldirY>93)
{
balldirY=93;dirf=-dirf;// cadre droite (102-6 = 96-3 = 93)
// bruitage balle cadre:
silence();
abcmusic(1,abcball2);
}
}
if (odirx==0)
{
++Xtemp;
if (Xtemp>1)
{
Xtemp=0;
if (bdirx==1) balldirX=balldirX+3; // vitesse X réelle --> +1,5
if (bdirx==-1) balldirX=balldirX-3; // vitesse X réelle --> -1,5
}
}
if (odirx==1)
{
++Xtemp;
if (Xtemp>1)
{
Xtemp=0;
if (bdirx==1) balldirX=balldirX+3; // vitesse X réelle --> +1,5
if (bdirx==-1) balldirX=balldirX-3; // vitesse X réelle --> -1,5
}
}
if (odirx==2)
{
if (bdirx==1) balldirX=balldirX+1; // vitesse X --> +1
if (bdirx==-1) balldirX=balldirX-1; // vitesse X --> -1
}
if (odirx==3)
{
++Xtemp;
if (Xtemp>1)
{
Xtemp=0;
if (bdirx==1) balldirX=balldirX+1; // vitesse X réelle --> +0,5
if (bdirx==-1) balldirX=balldirX-1; // vitesse X réelle --> -0,5
}
}
if (bdirx==1) { // Si la balle monte
if (balldirX>154)
{// collision haut du cadre: changement de direction
balldirX=154;bdirx=-bdirx; // inverse la direction de la balle
if (dirf==0) {
basar=random()%3; // de 0 à 2
--basar;dirf=basar; // -1 ou 0 ou 1
}
// bruitage balle cadre:
silence();
abcmusic(1,abcball2);
}
else
{
// ici peut être test collision balle/brique
}
}
if (bdirx==-1) { // Si la balle descend
if (balldirX<18) // provisoire
{// collision bas du cadre: changement de direction
balldirX=18;bdirx=-bdirx; // inverse la direction de la balle
}
if (balldirX>34 & balldirX<42)// collision ball/raquette: changement de direction
{
//if ((balldirY+1>yplayer-1 & balldirY+1<yplayer+24) | (balldirY+4>yplayer-1 & balldirY+4<yplayer+24))
if (balldirY>yplayer-1 & balldirY<yplayer+24)
{
balldirX=42;bdirx=-bdirx;
// bruitage balle raquette:
silence();
abcmusic(0,abcball1);
//centre de la raquette :
//if ((balldirY+1>yplayer+7 & balldirY+1<yplayer+16) | (balldirY+4>yplayer+7 & balldirY+4<yplayer+16))
if (balldirY>yplayer+7 & balldirY<yplayer+16)
{
if (dirf==1) {dirf=0;oboucl=1;}
if (dirf==2) {dirf=1;oboucl=1;}
if (dirf==3) {dirf=2;oboucl=1;}
if (dirf==-1) {dirf=0;oboucl=1;}
if (dirf==-2) {dirf=-1;oboucl=1;}
if (dirf==-3) {dirf=-2;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//gauche de la raquette :
//if ((balldirY+1>yplayer+2 & balldirY+1<yplayer+8) | (balldirY+4>yplayer+2 & balldirY+4<yplayer+8))
if (balldirY>yplayer+2 & balldirY<yplayer+8)
{
//if (dirf==-1) {dirf=-2;oboucl=1;}
if (dirf==-1) {dirf=-1;oboucl=1;}
if (dirf==-3) {dirf=-2;oboucl=1;}
if (dirf==1) {dirf=-1;oboucl=1;}
if (dirf==2) {dirf=-2;oboucl=1;}
if (dirf==3) {dirf=-2;oboucl=1;}
if (dirf==0) {dirf=-1;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//droite de la raquette :
//if ((balldirY+1>yplayer+15 & balldirY+1<yplayer+21) | (balldirY+4>yplayer+15 & balldirY+4<yplayer+21))
if (balldirY>yplayer+15 & balldirY<yplayer+21)
{
//if (dirf==1) {dirf=2;oboucl=1;}
if (dirf==1) {dirf=1;oboucl=1;}
if (dirf==3) {dirf=2;oboucl=1;}
if (dirf==-1) {dirf=1;oboucl=1;}
if (dirf==-2) {dirf=2;oboucl=1;}
if (dirf==-3) {dirf=2;oboucl=1;}
if (dirf==0) {dirf=1;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//exgauche de la raquette :
//if ((balldirY+1>yplayer-1 & balldirY+1<yplayer+3) | (balldirY+4>yplayer-1 & balldirY+4<yplayer+3))
if (balldirY>yplayer-1 & balldirY<yplayer+3)
{
if (dirf==-1) {dirf=-2;oboucl=1;}//break;
if (dirf==-2) {dirf=-3;oboucl=1;}
if (dirf==1) {dirf=-2;oboucl=1;}
if (dirf==2) {dirf=-3;oboucl=1;}
if (dirf==3) {dirf=-3;oboucl=1;}
if (dirf==0) {dirf=-2;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
//exdroite de la raquette :
//if ((balldirY+1>yplayer+20 & balldirY+1<yplayer+24) | (balldirY+4>yplayer+20 & balldirY+4<yplayer+24))
if (balldirY>yplayer+20 & balldirY<yplayer+24)
{
if (dirf==1) {dirf=2;oboucl=1;}
if (dirf==2) {dirf=3;oboucl=1;}
if (dirf==-1) {dirf=2;oboucl=1;}
if (dirf==-2) {dirf=3;oboucl=1;}
if (dirf==-3) {dirf=3;oboucl=1;}
if (dirf==0) {dirf=2;oboucl=1;}
}
if (oboucl==1) {oboucl=0;goto test_finish;}
}
}
else
{
// ici peut être test collision balle/brique
}
}
//}
test_finish:
if (joystick & JOY_DOWN) {
yplayer=yplayer+2;
if (yplayer>75) {yplayer=75;} // (102-24 = 78-3 = 75) ; 24 = largeur de la raquette
}
if (joystick & JOY_UP) {
yplayer=yplayer-2;
if (yplayer<3) {yplayer=3;}
}
}
SCBX(SCBball)=balldirX;SCBY(SCBball)=balldirY; // appliquer les variables balldirX et balldirY aux coordonnées de la balle.
SCBY(SCBr) = yplayer;
ShowScreen(); // Coordonnées de toutes les briques (voir au début de ce joyeux code).
// Affichage fond jeu + info commande + raquette + balle + fleche directionnelle + briques :
DrawSprite(SCBg);
}
/**************************************************************************
**************************************************************************/
/* test
//atest=balldirX;//yplayer;//speedX;//dirf;//etape;
atest=etape;//SCBCTL0(SCBbr);
unite = atest % 10;
dizaine = atest / 10 % 10;
centaine = atest / 100 % 10;
// unité:
SCBDATA(SCBchiffres1) = chiffrestab[unite%14];
SCBX(SCBchiffres1) = 100;
SCBY(SCBchiffres1) = 53;
// dizaine:
SCBDATA(SCBchiffres2) = chiffrestab[dizaine%14];
SCBX(SCBchiffres2) = 100;
SCBY(SCBchiffres2) = 53-8;
// centaine:
SCBDATA(SCBchiffres3) = chiffrestab[centaine%12]; // 0
SCBX(SCBchiffres3) = 100;
SCBY(SCBchiffres3) = 53-16;
*/
//SCBDATA(SCBchiffres1) = chiffrestab[10%14];
//SCBX(SCBchiffres1) = 40;
//SCBY(SCBchiffres1) = yplayer;
//SCBY(SCBchiffres1) = yplayer+23;
/*** Tests important des coordonnées des images ***/
// SCBDATA(SCBchiffres1) = chiffrestab[10%14];
// SCBX(SCBchiffres1) = SCBX(SCBball);
// SCBY(SCBchiffres1) = SCBY(SCBball);
/*** fin de ces tests de coordonnée ***/
// DrawSprite(SCBchiffres1); // Affichage valeur testé
//if (etape==2 & gspause>0)
if (gspause>0) {
SCBDATA(SCB) = ipause;
SCBHS(SCB) = 256;SCBVS(SCB) = 256;
SCBX(SCB) = 73;SCBY(SCB) = 30;
DrawSprite(SCB);
}
//Vsync();
//SwapBuffers();
}
/**************************************************************************
** FIN de la BOUCLE PRINCIPALE **
**************************************************************************/
}
Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
Pen^2 (./9) :merci Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
RYGAR (./14) :Une 0.2 est rarement jouable. Tu n'as pas noté Quand aux interactions balle/briques, après avoir étudié de près le code Moon Patrol (mon jeu préféré sur VCS2600 soit dis en passant) j'ai enfin trouvé la soluce dans la soirée, joie ! Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
beauregard (./15) : J'ai pas "encore" noté de bug mais j'ai néanmoins une petite question : Parfois si on ne bouge pas la raquette la balle se met à rebondir de manière verticale raquette/haut du tableau, la balle effectue environs 3/4 aller retours puis d'un coup l'angle se modifie et au lieu de repartir en ligne droite, la balle part à nouveau en diagonale et la partie reprend. Le problème c'est que je n'arrive pas à trouver dans ton code la commande qui définie cette instruction...? Mon site sur la LYNX :ZoneLynx |
RYGAR (./16) : Quand la balle touche le plafond, j'utilise la commande random pour définir sa prochaine direction : 608 if (bdirx==1) { // Si la balle monte 609 if (balldirX>154) 610 {// collision haut du cadre: changement de direction 611 balldirX=154;bdirx=-bdirx; // inverse la direction de la balle 612 if (dirf==0) { 613 basar=random()%3; // de 0 à 2 614 --basar;dirf=basar; // -1 ou 0 ou 1 615 } 616 // bruitage balle cadre: 617 silence(); 618 abcmusic(1,abcball2); 619 } Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
Fission version 0.31 12 tableaux jouable les amis exe: http://www.mirari.fr/A0CK source: http://www.mirari.fr/cY3U source extension .h : http://www.mirari.fr/VEpb info brique (n'oubliez pas que le jeu se joue la console tenu à la verticale) Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
Alors alors, Passons sur les félicitations pour ton boulot rapide et impressionnant et ma joie de pouvoir enfin jouer à un arkanoide sur lynx pour ce concentrer sur les défauts Tout d'abord, le problème que je détaillais plus haut concernant le rebond mur/raquette en ligne droite devient omniprésent dans ta dernière mise a jour, autant quand il n'y avait pas de brique la balle ne faisait que deux ou trois aller retour en ligne droite autant là il suffit de lancer la balle avec un angle verticale et de ne pas bouger la raquette pour se faire toute les briques placées sur la même trajectoire. Ensuite lorsqu'il n'y a plus de brique et si on ne bouge toujours pas la raquette la balle fera pas loin de 5/6 aller retour mur/raquette avant de brusquement changer de direction. Ensuite il y a parfois de gros problème de collisions, la balle qui passe à travers trois briques sans rebondir (mais en les détruisant tout de même) ou bien des rebonds qui se font non pas sur le bord d'une brique mais sur son centre notamment dans les niveaux avec des briques indestructibles, les rebonds de la balle sur ces briques sont presque toujours aberrant. Sur ce je retourne essayer de passer le 10em tableaux. Et je ne résiste quand même pas, Wahou !!! Quel boulot impressionnant tu fais et quel plaisir de voir de nouveaux homebrew pour la Lynx !!! Mon site sur la LYNX :ZoneLynx |
oui, après réflexion, je pense que j'ai peut être pris le problème à l'envers concernant la collision balle/brique. Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
nouvelle version 0.5 http://www.mirari.fr/pIM7 explication X: explication Y: source .c http://www.mirari.fr/hz7b source .h http://www.mirari.fr/HZ0P jaquette face: Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
Ça commence à prendre vraiment forme là J'ai pu aller jusqu'au niveau 11 ou je suis resté bloqué à cause d'un bug. Je vais essayer d'expliquer le problème : Dans ce niveau tu as une ligne de 5 briques destructibles enfermées entre deux lignes de briques indestructibles, pour les briques destructibles citées aux extrémités gauche et droite pas de souci dés que la balle les touche elles disparaissent par contre pour les trois briques situées au centre lorsque la balle commence à rebondir entre les deux lignes indestructible l'écran nous affiche deux balles fixes l'une sur l'autre qui avance sans rebondir (ou si on ce fit au son on dirait que la balle rebondi tellement vite que l'affichage ne suit plus) et passent à travers les trois briques normalement destructibles sans leur faire de mal. Mon site sur la LYNX :ZoneLynx |
RYGAR (./22) :hier j'ai testé le 11ème tableau, et effectivement, la balle traverse même des briques normalement destructibles. Je pense trouver la soluce, mais aujourd'hui mon PC de dev a rendu l'âme: plusieurs bip horrible à son démarrage, hier et avant hier déjà il fallait redémarrer plusieurs fois la machine, mais là, couic. J'ai enlevé les barrettes de mémoire, la cartes graphique, mais rien y fait, faut que je passe de nouveau à la caisse, grml. Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
t'as pas perdu ton code en cours de dev, quand même ?! Nspire wiki CONDUCTEUR Va-et-vient Des QUATRE MANCHE AVEC DES DIODES |
beauregard (./23) : C'est moche ça Comme squalyl j'espère que tu avais ailleurs des sauvegardes de tes programmes ou que le disque dur est réutilisable. Mon site sur la LYNX :ZoneLynx |
Essaie aussi de changer l'alim, c'est un problème assez courant pour ce genre de symptômes. « Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau |
Je sauvegarde systématiquement sur clé USB. Le problème ne vient pas du DD, des barrettes mémoires ou encore de la carte graphique. Ce matin, je me suis dis: "le problème doit venir d'une barrette mémoire, comme j'ai pu le lire deci delà sur le web, pas bien grave." J'en enlève 1, "bip, bip", 2, "bip, bip", 3, "bip, bip" et enfin la 4ème "bip, bip", aie. J'enlève aussi la carte graphique "bip,bip", le disque dur, "bip,bip" (trop de bip dans une même phrase, hein ?). J'ai changé l'alim l'an dernier, mais je peux toujours remettre l'ancienne pour voir. merci pour votre soutient. ps: pour le nombre de bip, il y en a 5, peut être qu'il s'agit là d'un problème particulier bien définie ?? après recherche: 5 bips courts = Erreur de processeur Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |
nouvelle version, la 0.6 : Edité par beauregard le 10-02-2011 à 22:46:37.http://www.mirari.fr/tA95 source .c http://www.mirari.fr/aP8L source .h http://www.mirari.fr/RjQB bon jeu ! Megadrive http://www.yaronet.com/posts.php?sl=172&s=143753 Lynx http://www.yaronet.com/sujets.php?s=&f=255 |