MSX Village forum

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

MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 781

Le 22/11/2010 à 23h13

Reprise du message précédent

On se calme dans les rangs et on se tient bien ! (J'ai raté ma vocation!) :fou

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à). :sick

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.

blocs



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



winniedepl



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

X-4 le point vert

X+4 le point vert clair

Y-4 les points bleus

Y+4 les points bleus clairs



Copier vers le presse-papierCode 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




Pour les déplacements négatifs il est important de ne pas descendre en dessous de zéro. En effet l'ordinateur ne sait pas copier en valeur négative et ne fera que copier à partir de (0,0) si les valeur sont inférieures. C'est pour ça qu'il y a un limiteur en ligne 2020 (Y>0). Les X n'ont pas besoin d'être gérés car X=0 entraine le passage à un niveau inférieur.



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.



Copier vers le presse-papierCode 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 ? :p


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
Stapha Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 22/11/2010 à 14h17

Messages: 35

Le 23/11/2010 à 14h40
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 :



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






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




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.
Site web    
galine Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 27/08/2010 à 02h22

Messages: 1363

Le 23/11/2010 à 15h38
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.
Google+    
Walter Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 02/10/2009 à 19h33

Messages: 1883

Le 23/11/2010 à 18h06
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. :top

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

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 23/11/2010 à 19h00
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 :D)

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 ))


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
kirem Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/11/2010 à 13h29

Messages: 45

Le 23/11/2010 à 22h46
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.
Site web    
Stapha Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 22/11/2010 à 14h17

Messages: 35

Le 24/11/2010 à 11h02
galine :
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.
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...



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).
Site web    
Stapha Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 22/11/2010 à 14h17

Messages: 35

Le 24/11/2010 à 11h07
Walter :
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. :top



Si tu ne disposes pas de MSX, ils te sont offerts pour ton PC en émulation sur le site de blueMSX. ;)
Merci pour l'information Walter : je ne savais quel était l'émulateur MSX à privilégier.



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.
Site web    
Stapha Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 22/11/2010 à 14h17

Messages: 35

Le 24/11/2010 à 11h16
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 :D)



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 ))
Salut Igal,

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...
Site web    
Stapha Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 22/11/2010 à 14h17

Messages: 35

Le 24/11/2010 à 11h24
kirem :
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.
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 !;)



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
Site web    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10748

Le 24/11/2010 à 15h45
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 !


:noel
Site web    
Stapha Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 22/11/2010 à 14h17

Messages: 35

Le 24/11/2010 à 20h32
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 :



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




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




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
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 25/11/2010 à 00h29
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


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Visiteur

Vagabond

Rang

Avatar

Message : 0

Le 25/11/2010 à 11h35
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)
   
Franck Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 22h54

Messages: 3345

Le 25/11/2010 à 17h16
N'en voulons pas à Stapha qui a donné une idée qui lui paraissait pouvoir aider à la création du programme.

Toute aide est bienvenue, surtout par des gens qui s'intéressent à notre standard de l'extérieur ! :)
   
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 25/11/2010 à 18h06
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é... ;)



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




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" :kiss

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" ;)




Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie