La Place des Développeurs [TUTO] Un jeu MSX2 en basic avec perso animé et plusieurs tableaux. De la bonne utilisation de SET PAGE, BLOAD...S, COPY et BMP2MSX
Reprise du message précédent
On se calme dans les rangs et on se tient bien ! (J'ai raté ma vocation!)Voilà, on arrive au plat principal, ça ne s'est pas fait sans mal car je n'ai pas été très méthodique dans mon approche des mouvements du Winnie. Il y avait pas mal de valeurs plus ou moins fantaisistes et quelques bugs. J'ai du tout reprendre pour pouvoir donner une explication qui découle d'un raisonnement et non d'une approche empirique des choses (Houlà je m'emballe là).
Allez! Passons aux explications:
#4 L'interaction avec le décor
Dans un premier temps il faut se rappeler les blocs de décors sur l'image des sprites et leur emplacement qui n'est pas du au hasard en effet ceux ci sont rangés par catégories:
2 principales: Les obstacles ou non.
2 sous-catégories: les interactives et les neutres.( des obstacles pouvant être interactifs: comme les portes)
En règle générale on range les catégories de sorte qu'une simple comparaison par "supérieur à" ou "inférieur à" suffise à détecter si c'est un obstacle ou pas.
On procède de la même manière pour les sous-catégories en les rangeant toutes dans un coin de la catégorie principale concernée.
Ici les obstacles ont les valeurs inférieures, les "bonus" sont dans la partie basse des non-obstacles.
C'est bien beau tout ça mais comment rattacher les coordonnées de Winnie avec la valeur du bloc sur lequel il marche?
Rien de plus simple enfin presque; il faut d'abord déterminer quel zone du Winnie est concernée par les blocs: ce sont se pieds! Il suffit ensuite de ramener ses pieds à la valeur d'une ligne et c'est cette ligne qui ne devra pas aller sur les obstacles!
Donc, il faudra scruter la valeur du point extrême de ligne + une valeur de déplacement pour le sens horizontal. et la valeur des deux points + la valeur de déplacement à chaque extrémité de cette ligne pour le sens vertical.
Ce n'est pas fini! il faut ramener cette valeur déjà bien complexe à la valeur du gabarit (en points) du niveau afin d'avoir un retour de valeur par le biais d'un POINT. C'est à dire divisé par 16 (la largeur d'un bloc) qu'il faut ramener à la valeur entière (INT) pour des raisons évidentes.
Par exemple pour Winnie ça donne ça:
En rouge ce sont les coordonnées du gabarit ayant permis d'afficher le niveau. Il faudra ajouter 200 à la valeur Y pour être bon!
En zone le point d'accroche en X et Y de notre Winnie (décalés de 4 points: valeur de déplacement).
En rose la "ligne de pieds de Winnie.
Le point vert est le point à scruter pour un déplacement sur la gauche :
- Sa valeur en X = INT ( (X+6) /16 )
- Sa valeur en Y = 200 +INT( (Y+41) /16)
On scrute le point obtenu:
- P= POINT ( INT ( (X+6) /16 ) , 200 +INT( (Y+41) /16))
On va faire un peu de math en comparant pour déterminer si ce n'est pas un obstacle; P>6 renvoie -1 si l'équation est vraie (pas d'obstacle) et 0 si elle est fausse (obstacle).
- X=X+ 4 * (P>6)
On aura bien X-4 c'est à dire X + 4*(-1) quand il n'y aura pas d'obstacle et X+0 c'est à dire X + 4*(0) quand il y a un obstacle.
Voilà il suffit d'opérer de même pour chaque déplacement du Winnie en n'oubliant pas que (-1)*(-1)=1
X-4 le point vert
X+4 le point vert clair
Y-4 les points bleus
Y+4 les points bleus clairs
Code BASIC :
1900 ' 1901 ' SP gestion mouvement: HAUT 1902 ' 2000 P=POINT(INT((X+10)/16),200+INT((Y+37)/16)) 2010 Q=POINT(INT((X+21)/16),200+INT((Y+37)/16)) 2020 Y=Y+4*(P>6)*(Q>6)*(Y>0):A=77:GOTO500 2400 ' 2401 ' SP gestion mouvement: DROITE 2402 ' 2500 P=POINT(INT((X+25)/16),200+INT((Y+41)/16)) 2520 X=X-4*(P>6):A=39:GOTO500 2900 ' 2901 ' SP gestion mouvement: BAS 2902 ' 3000 P=POINT(INT((X+10)/16),200+INT((Y+45)/16)) 3010 Q=POINT(INT((X+21)/16),200+INT((Y+45)/16)) 3030 Y=Y+4*(P>6)*(Q>6):A=153:GOTO500 3400 ' 3401 ' SP gestion mouvement: GAUCHE 3402 ' 3500 P=POINT(INT((X+6)/16),200+INT((Y+41)/16)) 3520 X=X+4*(P>6):A=115:GOTO500
Voilà pour les mouvements, pour l'interaction avec les objets qui se fait de façon automatique il suffit de scruter le point entre les pieds de Winnie (point magenta) à chaque tour de boucle.
Si la valeur obtenue est inférieure à il y a saut vers un sous programme gérant les différentes possibilités de scénario. Ici le Winnie disparait dans un trou ou vient étoffer son inventaire, mais cela peut tout aussi bien modifier une barre de vie, incrémenter un compteur, déclencher une explosion, etc...
Le principal étant qu'au départ le déclenchement ne se fasse que par un minimum d'instruction dans la boucle pour éviter la surcharge et un ralentissement excessif.
Code BASIC :
600 ' 601 ' BP:gestion rencontre avec un objet + saut SP 602 ' 700 P=POINT(INT((X+16)/16),200+INT((Y+41)/16)) 710 IFP<11THEN5000 ... 4900 ' 4901 ' SP gestion rencontre avec objet 4902 ' 5000 IF P=10THEN6000 ' si trou -> SP tombe 5005 PSET(INT((X+16)/16),200+INT((Y+41)/16)),15:B=P*6:F=P*5:PLAY"t200o5l64n=b;n=f;" 5010 COPY(240,191)-(255,206),1TO((INT((X+16)/16))*16,(INT((Y+41)/16))*16),2 5020 COPY(208,P*16-112)-(223,P*16-97),1TO(C*16+32,196),0 5040 C=C+1 5100 GOTO 310 5900 ' 5901 ' SP chute dans le trou 5902 ' 6000 FORI=0TO36STEP2 6020 COPY(X,Y)-(X+34,Y+50),2TO(0,0),3 6030 COPY(D,A)-(D+25,A+37-I),1TO(4,4+I),3,TPSET 6040 COPY(0,0)-(34,50),3TO(X,Y),0 6050 A=A+38:IFA=191THENA=39 6060 B=I+40:PLAY"t250o4l64n=b;" 6065 IFPLAY(0)=-1THEN6065 6070 NEXT 6080 M=0:N=0 6090 LINE(32,196)-(255,212),1,BF 6100 GOTO 210
C'est peut être la fin, je ne sais pas si je continue à expliquer le reste car c'est du plus classique, ces 4 chapitre étant à mon avis ce qui est le plus intéressant.
Et pour finir de façon scolaire: DES QUESTIONS ?
Le MSXien le plus à l'ouest ... ou presque
Bonjour à tous,
Alors voilà, je suis un amigaiste égaré dans ce forum MSX...
J'avoue que je n'étais pas très fan de cette architecture (à cause des scrollings saccadés) mais je dois admettre que mon jugement était faussé. De plus je trouve la communauté MSX très active et ce forum très sympa.
Je me permet donc de m'incruster ici car, bien que ne connaissant rien au MSX, je pense pouvoir apporter ma petite contribution à ce tuto.
Je le fais car je trouve la démarche de MSXosaure excellente. Si d'aventure mon intervention dérange certains ou que vous trouvez qu'elle pollue ce post, n'hésitez pas à me le dire et je l'effacerais (mon but est de participer, pas de gener. Mais parfois les bonnes intentions...)
D'abord une question : pourquoi stocker les niveaux en VRAM ? Cela ne serait pas plus rapide de le faire en RAM ?
Ensuite une remarque pour kirem : le système de MSXosaure est encore meilleur que ça. En codant les blocs sur 2 pixels, ce n'est pas 32 mais 256 blocs qui sont disponibles : 16xcouleur du pixel1 + couleur du pixel 2 (ou lecture d'un octet)
Enfin une suggestion :
En basic (en général, c'est peut-être faux avec le basic MSX...), les IF et les GOTO sont pénalisant. Mais il existe un moyen simple de s'en passer.
Il suffit de créer 2 tableaux qui contiendront les déplacement en X et Y et de les pré-alimenter avec les bonnes valeurs.
Le même principe devra être utilisé pour les valeurs de A
Du coup le code suivant :
peut être remplacé par :
Du coup le même code est exécuté qu'il y ait mouvement ou pas : plus besoin de mettre une temporisation (ou alors en mettre une tout le temps)
C'est une méthode qui s'avérait plus rapide sur les machines avec lesquelles je l'ai essayé. Bien sur, elle n'a sans doute aucun interet pour ce programme (puisque celui-ci tourne très bien sans) mais elle sera peut-être interessante dans certains cas.
Y a peut-être des erreurs (je ne connais pas le basic msx et je n'ai pas d'environnement) mais les interessés comprendront le principe
Un volontaire pour essayer et me dire si c'est eficace ?
Encore une fois, j'espère que ce post ne dérangera personne.
Alors voilà, je suis un amigaiste égaré dans ce forum MSX...
J'avoue que je n'étais pas très fan de cette architecture (à cause des scrollings saccadés) mais je dois admettre que mon jugement était faussé. De plus je trouve la communauté MSX très active et ce forum très sympa.
Je me permet donc de m'incruster ici car, bien que ne connaissant rien au MSX, je pense pouvoir apporter ma petite contribution à ce tuto.
Je le fais car je trouve la démarche de MSXosaure excellente. Si d'aventure mon intervention dérange certains ou que vous trouvez qu'elle pollue ce post, n'hésitez pas à me le dire et je l'effacerais (mon but est de participer, pas de gener. Mais parfois les bonnes intentions...)
D'abord une question : pourquoi stocker les niveaux en VRAM ? Cela ne serait pas plus rapide de le faire en RAM ?
Ensuite une remarque pour kirem : le système de MSXosaure est encore meilleur que ça. En codant les blocs sur 2 pixels, ce n'est pas 32 mais 256 blocs qui sont disponibles : 16xcouleur du pixel1 + couleur du pixel 2 (ou lecture d'un octet)
Enfin une suggestion :
En basic (en général, c'est peut-être faux avec le basic MSX...), les IF et les GOTO sont pénalisant. Mais il existe un moyen simple de s'en passer.
Il suffit de créer 2 tableaux qui contiendront les déplacement en X et Y et de les pré-alimenter avec les bonnes valeurs.
Le même principe devra être utilisé pour les valeurs de A
Du coup le code suivant :
Citation :
400 '
401 ' BP:deplacements heros: touches fleches + saut sous prog.
402 '
420 ON STICK(0)GOTO2000,2500,2500,2500,3000,3500,3500,3500
450 FORI=0TO90:A=0:NEXTI
500 GOSUB1000
...
1900 '
1901 ' SP gestion mouvement: HAUT
1902 '
2000 Y=Y-4:A=77:GOTO 500
2400 '
2401 ' SP gestion mouvement: DROITE
2402 '
2500 X=X+4:A=39:GOTO 500
2900 '
2901 ' SP gestion mouvement: BAS
2902 '
3000 Y=Y+4:A=153:GOTO 500
3400 '
3401 ' SP gestion mouvement: GAUCHE
3402 '
3500 X=X+4:A=115:GOTO 500
401 ' BP:deplacements heros: touches fleches + saut sous prog.
402 '
420 ON STICK(0)GOTO2000,2500,2500,2500,3000,3500,3500,3500
450 FORI=0TO90:A=0:NEXTI
500 GOSUB1000
...
1900 '
1901 ' SP gestion mouvement: HAUT
1902 '
2000 Y=Y-4:A=77:GOTO 500
2400 '
2401 ' SP gestion mouvement: DROITE
2402 '
2500 X=X+4:A=39:GOTO 500
2900 '
2901 ' SP gestion mouvement: BAS
2902 '
3000 Y=Y+4:A=153:GOTO 500
3400 '
3401 ' SP gestion mouvement: GAUCHE
3402 '
3500 X=X+4:A=115:GOTO 500
peut être remplacé par :
Citation :
100 '
101 ' Code à mettre dans l'initialisation
102 '
103 ' création des tableaux de déplacement et de celui qui contiendra la valeur de A
104 Dim DX(9): Dim DY(9): DIM VA(9)
105 ' Alimentation des tableaux (sans les valeurs nulles)
106 ' (les déplacement horizontaux sont privilégiés mais la gestion des diagonales est possible)
107 DX(3)=4: DX(4)=4: DX(5)=4: DX(7)=-4: DX(8)=-4: DX(9)=-4
108 DY(2)=-4: DY(6)=4
109 'Même principe pour A qui est remis à 0 quand il n'y a pas de déplacement semble-t-il
110 VA(1)=0:VA(2)=77:VA(3)=39:VA(4)=39:VA(5)=39:VA(6)=153:VA(7)=115:VA(8)=115:VA(9)=115
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 X=X+DX(S):Y=Y+DY(S):A=VA(S)
403 GOSUB 1000
101 ' Code à mettre dans l'initialisation
102 '
103 ' création des tableaux de déplacement et de celui qui contiendra la valeur de A
104 Dim DX(9): Dim DY(9): DIM VA(9)
105 ' Alimentation des tableaux (sans les valeurs nulles)
106 ' (les déplacement horizontaux sont privilégiés mais la gestion des diagonales est possible)
107 DX(3)=4: DX(4)=4: DX(5)=4: DX(7)=-4: DX(8)=-4: DX(9)=-4
108 DY(2)=-4: DY(6)=4
109 'Même principe pour A qui est remis à 0 quand il n'y a pas de déplacement semble-t-il
110 VA(1)=0:VA(2)=77:VA(3)=39:VA(4)=39:VA(5)=39:VA(6)=153:VA(7)=115:VA(8)=115:VA(9)=115
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 X=X+DX(S):Y=Y+DY(S):A=VA(S)
403 GOSUB 1000
Du coup le même code est exécuté qu'il y ait mouvement ou pas : plus besoin de mettre une temporisation (ou alors en mettre une tout le temps)
C'est une méthode qui s'avérait plus rapide sur les machines avec lesquelles je l'ai essayé. Bien sur, elle n'a sans doute aucun interet pour ce programme (puisque celui-ci tourne très bien sans) mais elle sera peut-être interessante dans certains cas.
Y a peut-être des erreurs (je ne connais pas le basic msx et je n'ai pas d'environnement) mais les interessés comprendront le principe
Un volontaire pour essayer et me dire si c'est eficace ?
Encore une fois, j'espère que ce post ne dérangera personne.
Stapha, n'aie craintes nous n'avons mangé personne et je penses que toute idée est bonne a prendre Je ne saurais te dire ce que vaut ton raisonnement concernant la programmation (je n'ai jamais été doué dans ce domaine ni dans aucun d'ailleur) mais sache que parfois un oeil extérieur (autres machines) permet d'apporter des idées neuves et je penses que ca permet a tous d'avancer.
Walter
Membre non connecté
Conseiller Municipal
C'est une bonne méthode Stapha. On constate que tu as la technique.
C'est vrai que les bons programmeurs trouvent des astuces qui simplifient des instructions logiques. Cela s'acquiert avec le temps et la pratique.
Ce 1er tuto réalisé de mains de Maître par notre ami MSXosaure donne des conseils détaillés dans la rédaction de programmes, en termes accessibles à tous.
Quelque soit le basic, c'est un langage de programmation qui nécessite un interprête pour être exécuté.
Les rapidités diffèrent de la vitesse d'horloge des machines. C'est à chacun de pianoter dans son coin, et de trouver la solution la plus élégante.
Merci pour ta participation.
Si tu ne disposes pas de MSX, ils te sont offerts pour ton PC en émulation sur le site de blueMSX.
C'est vrai que les bons programmeurs trouvent des astuces qui simplifient des instructions logiques. Cela s'acquiert avec le temps et la pratique.
Ce 1er tuto réalisé de mains de Maître par notre ami MSXosaure donne des conseils détaillés dans la rédaction de programmes, en termes accessibles à tous.
Quelque soit le basic, c'est un langage de programmation qui nécessite un interprête pour être exécuté.
Les rapidités diffèrent de la vitesse d'horloge des machines. C'est à chacun de pianoter dans son coin, et de trouver la solution la plus élégante.
Merci pour ta participation.
Si tu ne disposes pas de MSX, ils te sont offerts pour ton PC en émulation sur le site de blueMSX.
igal
Membre non connecté
Conseiller Municipal
Salut Stapha.
Ton code est très interressant, en l'état, il est beaucoup plus rapide mais comporte de nombreux problèmes que tu peux certainement résoudre avec un Emulateur comme BlueMsx.
Pour retravailler du code et avoir une vue plus claire de l'ensemble d'un programme, sous Emulation MSX:
Une fois le programme Chargé, je lance la commande suivante pour permettre sa lecture sur PC Réel.
Save"FICHIER.ASC",a
Ensuite tu n'as plus qu'à extraire ton FICHIER.ASC depuis la Disquette MSX vers ton PC en Utilisant DISK MANAGER, et l'ouvrir avec Note pad ou autre editeur Texte. (J'adore faire ca )
Une fois tes modifications terminées, tu fais glisser ton .ASC sur la disquette et sous Emulation MSX, tu LOAD"FICHIER.ASC puis SAVE"FICHIER.BAS. Voila comment je me facilite grandement la vie.
(Astuce trouvée sur le Forum je sais plus ou ))
Ton code est très interressant, en l'état, il est beaucoup plus rapide mais comporte de nombreux problèmes que tu peux certainement résoudre avec un Emulateur comme BlueMsx.
Pour retravailler du code et avoir une vue plus claire de l'ensemble d'un programme, sous Emulation MSX:
Une fois le programme Chargé, je lance la commande suivante pour permettre sa lecture sur PC Réel.
Save"FICHIER.ASC",a
Ensuite tu n'as plus qu'à extraire ton FICHIER.ASC depuis la Disquette MSX vers ton PC en Utilisant DISK MANAGER, et l'ouvrir avec Note pad ou autre editeur Texte. (J'adore faire ca )
Une fois tes modifications terminées, tu fais glisser ton .ASC sur la disquette et sous Emulation MSX, tu LOAD"FICHIER.ASC puis SAVE"FICHIER.BAS. Voila comment je me facilite grandement la vie.
(Astuce trouvée sur le Forum je sais plus ou ))
galine :
Merci Galine. J'ai bien vu la mentalité qui regne sur ce forum et mon inquiétude ne vient absolument pas de là mais de ma démarche. S'il s'agissait d'un topic de coding, il n'y aurait pas de problème. Mais il s'agit d'un tuto. MSXosaure pourrait estimer à juste titre que mon intervention n'a rien a y faire. Après le travail qu'il a fourni, c'est facile d'arriver après et de pondre 3 lignes de codes...Stapha, n'aie craintes nous n'avons mangé personne et je penses que toute idée est bonne a prendre Je ne saurais te dire ce que vaut ton raisonnement concernant la programmation (je n'ai jamais été doué dans ce domaine ni dans aucun d'ailleur) mais sache que parfois un oeil extérieur (autres machines) permet d'apporter des idées neuves et je penses que ca permet a tous d'avancer.
Il peut aussi estimer que mon post n'aide pas à la compréhension alors que lui a fait beaucoup d'effort pour expliquer des choses très utiles à ceux qui veulent apprendre (Certaines choses qu'il explique sont applicables avec d'autres langages et sur d'autres machines, ça va plus loin qu'un tuto basic msx).
Walter :
Merci pour l'information Walter : je ne savais quel était l'émulateur MSX à privilégier.C'est une bonne méthode Stapha. On constate que tu as la technique.
C'est vrai que les bons programmeurs trouvent des astuces qui simplifient des instructions logiques. Cela s'acquiert avec le temps et la pratique.
Ce 1er tuto réalisé de main de maître par notre ami MSXosaure donne des conseils détaillés dans la rédaction de programmes, en termes accessibles à tous.
Quelque soit le basic, c'est un langage de programmation qui nécessite un interprête pour être exécuté.
Les rapidités diffèrent de la vitesse d'horloge des machines. C'est à chacun de pianoter dans son coin, et de trouver la solution la plus élégante.
Merci pour ta participation.
Si tu ne disposes pas de MSX, ils te sont offerts pour ton PC en émulation sur le site de blueMSX.
C'est vrai que les bons programmeurs trouvent des astuces qui simplifient des instructions logiques. Cela s'acquiert avec le temps et la pratique.
Ce 1er tuto réalisé de main de maître par notre ami MSXosaure donne des conseils détaillés dans la rédaction de programmes, en termes accessibles à tous.
Quelque soit le basic, c'est un langage de programmation qui nécessite un interprête pour être exécuté.
Les rapidités diffèrent de la vitesse d'horloge des machines. C'est à chacun de pianoter dans son coin, et de trouver la solution la plus élégante.
Merci pour ta participation.
Si tu ne disposes pas de MSX, ils te sont offerts pour ton PC en émulation sur le site de blueMSX.
Ma participation était minime. Si je peux aider davantage, ce sera avec plaisir. ça serait même plutot fun d'apprendre le basic msx ou l'assembleur Z80 si ça peut apporter quelque chose ici.
igal :
Salut Igal,Salut Stapha.
Ton code est très interressant, en l'état, il est beaucoup plus rapide mais comporte de nombreux problèmes que tu peux certainement résoudre avec un Emulateur comme BlueMsx.
Pour retravailler du code et avoir une vue plus claire de l'ensemble d'un programme, sous Emulation MSX:
Une fois le programme Chargé, je lance la commande suivante pour permettre sa lecture sur PC Réel.
Save"FICHIER.ASC",a
Ensuite tu n'as plus qu'à extraire ton FICHIER.ASC depuis la Disquette MSX vers ton PC en Utilisant DISK MANAGER, et l'ouvrir avec Note pad ou autre editeur Texte. (J'adore faire ca )
Une fois tes modifications terminées, tu fais glisser ton .ASC sur la disquette et sous Emulation MSX, tu LOAD"FICHIER.ASC puis SAVE"FICHIER.BAS. Voila comment je me facilite grandement la vie.
(Astuce trouvée sur le Forum je sais plus ou ))
Ton code est très interressant, en l'état, il est beaucoup plus rapide mais comporte de nombreux problèmes que tu peux certainement résoudre avec un Emulateur comme BlueMsx.
Pour retravailler du code et avoir une vue plus claire de l'ensemble d'un programme, sous Emulation MSX:
Une fois le programme Chargé, je lance la commande suivante pour permettre sa lecture sur PC Réel.
Save"FICHIER.ASC",a
Ensuite tu n'as plus qu'à extraire ton FICHIER.ASC depuis la Disquette MSX vers ton PC en Utilisant DISK MANAGER, et l'ouvrir avec Note pad ou autre editeur Texte. (J'adore faire ca )
Une fois tes modifications terminées, tu fais glisser ton .ASC sur la disquette et sous Emulation MSX, tu LOAD"FICHIER.ASC puis SAVE"FICHIER.BAS. Voila comment je me facilite grandement la vie.
(Astuce trouvée sur le Forum je sais plus ou ))
Mon code a été écrit rapidement. Je ne savais pas s'il marcherait en l'état mais j'étais certains que les codeurs en comprendrait le principe.
Par contre, je ne vois pas ou se situent les nombreux problèmes. Je vais donc suivre ton conseil et celui de Walter et installer BlueMSX.
J'espère que ça me permettra d'apporter mon aide par la suite.
Merci pour la méthode, c'est vrai que ça a l'air hyper pratique.
Je note que tu as tenu a précisé qu'elle ne venait pas de toi : décidément, l'attitude des membres de ce forum est un modèle...
kirem :
Honte ? Y a pas de quoi... Visiblement, vaut mieux pas que je te raconte quelques anecdotes sur des choses que je ne voyais pas mais qui étaient énormes : c'est carrément des yeux qu'il m'aurait fallu !Merci Stapha de ta remarque j'ai honte de pas avoir vue qu'avec 2 pixels on travail sur un octet faut vraiment que je change d'ophtalmo.
Je suis certain que tu auras à l'avenir l'occasion de me corriger sur des choses bien plus grosses que celle là. Et je t'assure que moi je n'aurai pas honte du tout ! Edité par Stapha Le 24/11/2010 à 11h24
la version de stapha pour les déplacement marche seulement en théorie
si on l'applique directement au programme de winnie on ne calcule plus P et Q
donc seul le déplacement fonctionne mais plus les test avec le décor !
si on l'applique directement au programme de winnie on ne calcule plus P et Q
donc seul le déplacement fonctionne mais plus les test avec le décor !
Au départ je voulais simplement rebondir sur la leçon 3 du tuto pour dire qu'il y avait d'autres méthode que les IF et les sauts.
Je proposais simplement une autre façon de faire. On dirait que je me suis piégé...
Bon, pour calculer P et Q il faut modifier le code ainsi :
- on ne calcule plus les nouvelles coordonnées dans X et Y directement mais on le fait dans des variables temporaires NX et NY
- on s'appuie sur ces variables pour calculer P et Q
- Si P et Q sont correct et que Y n'est pas devenu négatif, on copie les variables temporaires dans X et Y. On fait la même chose pour A
ça donne :
Je ne sais pas si les instructions multiples après un THEN sont autorisées en MSX Basic. Si c'est le cas ça devient :
Ce n'est pas la seule méthode et surement pas la meilleure mais elle est simple et ne modifie pas le code original.
EDIT : A noter que le plus grand avantage de cette méthode est qu'elle rend la gestion des diagonales gratuite. C'est aussi pour ça que je disais qu'elle ne devait pas apporter grand chose dans ce cas... Edité par Stapha Le 24/11/2010 à 20h38
Je proposais simplement une autre façon de faire. On dirait que je me suis piégé...
Bon, pour calculer P et Q il faut modifier le code ainsi :
- on ne calcule plus les nouvelles coordonnées dans X et Y directement mais on le fait dans des variables temporaires NX et NY
- on s'appuie sur ces variables pour calculer P et Q
- Si P et Q sont correct et que Y n'est pas devenu négatif, on copie les variables temporaires dans X et Y. On fait la même chose pour A
ça donne :
Citation :
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P<7 OR Q<7 OR Y<0 THEN 407
406 X=NX:Y=NY:A=NA
407 GOSUB 1000
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P<7 OR Q<7 OR Y<0 THEN 407
406 X=NX:Y=NY:A=NA
407 GOSUB 1000
Je ne sais pas si les instructions multiples après un THEN sont autorisées en MSX Basic. Si c'est le cas ça devient :
Citation :
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P>6 AND Q>6 AND Y>-1 THEN X=NX:Y=NY:A=NA
406 GOSUB 1000
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P>6 AND Q>6 AND Y>-1 THEN X=NX:Y=NY:A=NA
406 GOSUB 1000
Ce n'est pas la seule méthode et surement pas la meilleure mais elle est simple et ne modifie pas le code original.
EDIT : A noter que le plus grand avantage de cette méthode est qu'elle rend la gestion des diagonales gratuite. C'est aussi pour ça que je disais qu'elle ne devait pas apporter grand chose dans ce cas... Edité par Stapha Le 24/11/2010 à 20h38
igal
Membre non connecté
Conseiller Municipal
Salut Stapha
Je teste ça de suite et je te tiens au courant.
Premier Code:
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P<7 OR Q<7 OR Y<0 THEN 407
406 X=NX:Y=NY:A=NA
407 GOSUB 1000
1 Moins rapide que l'original de Msxosaure.
2 Déplacements saccadés.
3 Déplacement vers la droite, Alterne Static, Droite, Static, Droite etc...
Je teste ton second code dans la foulée...
Teste second Code:
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P>6 AND Q>6 AND Y>-1 THEN X=NX:Y=NY:A=NA
406 GOSUB 1000
(Fonctionne)
Strictement identique au premier code en terme de résulta sur les 3 points. Edité par igal Le 25/11/2010 à 00h46
Je teste ça de suite et je te tiens au courant.
Premier Code:
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P<7 OR Q<7 OR Y<0 THEN 407
406 X=NX:Y=NY:A=NA
407 GOSUB 1000
1 Moins rapide que l'original de Msxosaure.
2 Déplacements saccadés.
3 Déplacement vers la droite, Alterne Static, Droite, Static, Droite etc...
Je teste ton second code dans la foulée...
Teste second Code:
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P>6 AND Q>6 AND Y>-1 THEN X=NX:Y=NY:A=NA
406 GOSUB 1000
(Fonctionne)
Strictement identique au premier code en terme de résulta sur les 3 points. Edité par igal Le 25/11/2010 à 00h46
Visiteur
Vagabond
Message : 0
En plus de ce qui a déja été dit auparavant, je voudrais ajouter que le pire ennemi d'un programmeur, c'est l'optimisation prématurée.
C'est une mauvaise idée. En fait, ce n'est pas seulement une mauvaise idée, c'est une TRES mauvaise idée.
Les quelques cycles grapillés ne justifient pas le côté bancal que prend rapidement le programme.
Cela me rappelle les demomakers Amiga, qui pensaient que taper dans la mémoire sans faire d'allocation était plus efficace que demander à la rom un bloc mémoire.
Ou encore sur PC, les boucles écrites religieusement avec "dec ecx + jnz" plutot qu'un "loop" (réputé moins efficace, même si les quelques cycles gagnés ne se voyaient pas).
Ou la lecture du port clavier plutot qu'un polling sur une interruption documentée pour vérifier si "esc" avait été pressé.
Les exemples ne manquent pas, et les mauvaises habitudes sont vite prises.
Ecrire du code clair est bien plus payant que l'optimisation de la "inner-loop critique", qui se révèle souvent pas si critique que ça.
Il ne sert à rien de tenter d'être plus malin que le compilateur. C'est être présomptueux et courir à la catastrophe.
N'importe quel compilateur est capable d'optimiser un switch/case, de couper les branches inutiles, de faire de l'inlining et du remplacement de valeurs à la compilation. Alors, cessez de vous faire des noeuds au cerveau, et laissez la tâche de génération de code au compilateur.
Vous n'êtes pas un générateur de code, vous êtes un programmeur.
Le basic MSX n'est pas compilé, mais mieux vaut prendre de bonnes habitudes dès le départ.
Pour conclure, une citation que j'aime beaucoup. On devrait l' inscrire en lettres d'or au fronton des écoles d' apprentis programmeurs:
"Les pires péchés en programmation sont commis au nom de l'efficacité (sans nécessairement l'atteindre), plus que tout autre raison - et ceci inclut la stupidité crasse" ( William Allan Wulf)
C'est une mauvaise idée. En fait, ce n'est pas seulement une mauvaise idée, c'est une TRES mauvaise idée.
Les quelques cycles grapillés ne justifient pas le côté bancal que prend rapidement le programme.
Cela me rappelle les demomakers Amiga, qui pensaient que taper dans la mémoire sans faire d'allocation était plus efficace que demander à la rom un bloc mémoire.
Ou encore sur PC, les boucles écrites religieusement avec "dec ecx + jnz" plutot qu'un "loop" (réputé moins efficace, même si les quelques cycles gagnés ne se voyaient pas).
Ou la lecture du port clavier plutot qu'un polling sur une interruption documentée pour vérifier si "esc" avait été pressé.
Les exemples ne manquent pas, et les mauvaises habitudes sont vite prises.
Ecrire du code clair est bien plus payant que l'optimisation de la "inner-loop critique", qui se révèle souvent pas si critique que ça.
Il ne sert à rien de tenter d'être plus malin que le compilateur. C'est être présomptueux et courir à la catastrophe.
N'importe quel compilateur est capable d'optimiser un switch/case, de couper les branches inutiles, de faire de l'inlining et du remplacement de valeurs à la compilation. Alors, cessez de vous faire des noeuds au cerveau, et laissez la tâche de génération de code au compilateur.
Vous n'êtes pas un générateur de code, vous êtes un programmeur.
Le basic MSX n'est pas compilé, mais mieux vaut prendre de bonnes habitudes dès le départ.
Pour conclure, une citation que j'aime beaucoup. On devrait l' inscrire en lettres d'or au fronton des écoles d' apprentis programmeurs:
"Les pires péchés en programmation sont commis au nom de l'efficacité (sans nécessairement l'atteindre), plus que tout autre raison - et ceci inclut la stupidité crasse" ( William Allan Wulf)
igal
Membre non connecté
Conseiller Municipal
Stapha :
Au départ je voulais simplement rebondir sur la leçon 3 du tuto pour dire qu'il y avait d'autres méthode que les IF et les sauts.
Je proposais simplement une autre façon de faire. On dirait que je me suis piégé...
EDIT : A noter que le plus grand avantage de cette méthode est qu'elle rend la gestion des diagonales gratuite. C'est aussi pour ça que je disais qu'elle ne devait pas apporter grand chose dans ce cas...
Je proposais simplement une autre façon de faire. On dirait que je me suis piégé...
Citation :
400 ' Code gérant les déplacement
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P>6 AND Q>6 AND Y>-1 THEN X=NX:Y=NY:A=NA
406 GOSUB 1000
401 S=STICK(0)+1
402 NX=X+DX(S):NY=Y+DY(S):NA=VA(S)
403 P=POINT(INT((NX+10)/16),200+INT((NY+41)/16))
404 Q=POINT(INT((NX+21)/16),200+INT((NY+41)/16))
405 IF P>6 AND Q>6 AND Y>-1 THEN X=NX:Y=NY:A=NA
406 GOSUB 1000
EDIT : A noter que le plus grand avantage de cette méthode est qu'elle rend la gestion des diagonales gratuite. C'est aussi pour ça que je disais qu'elle ne devait pas apporter grand chose dans ce cas...
Mod Racolage "ON"
Salut Stapha!
J'ai volontier besoin de tes connaissances pour ma tentative d'adaptation du Moteur Winnie en un programme plus adapté au Shoot Them Up.
La possibilité de se déplacer dans les 8 directions est très intéressante.
Voici le lien, c'est pas loin juste après la mairie => http://www.msxvillage.fr/forum/topic.php?id=507&pt=7#m7204
Mod Racolage "OFF"
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie