Obligement - L'Amiga au maximum

Samedi 27 mai 2017 - 15:50  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Soutien

N'hésitez pas à soutenir le projet Obligement



Contact

David Brunet

Courriel

 


Programmation : Blitz Basic - trucs et astuces
(Article écrit par Mathieu Chènebit et extrait d'Amiga News - janvier 1997)


Je dois le reconnaître, je ne savais pas quel type de programme faire pour la rubrique de ce mois. J'étais d'abord parti sur l'idée de continuer notre annuaire, et puis finalement, je suis revenu en arrière. Tout cela sera peut-être pour le mois prochain. C'est bien beau tout cela mais qu'allons-nous donc faire ? Eh bien je vais tâcher de vous donner quelques petites astuces, découvertes au fur à et mesure des longues heures passées devant l'écran gris du Blitz, qui vous seront fortes utiles.

Je prie encore une fois les programmeurs expérimentés de bien vouloir m'excuser, mais cette rubrique est destinée avant tout aux débutants et donc les astuces ne seront pas d'un niveau extraordinaire.

Applications externes

Tout d'abord, une des questions qui m'est venue à l'esprit très rapidement en utilisant le Blitz est la possibilité de lancer des applications externes depuis votre programme Blitz (dans le cas d'une documentation en ligne faisant appel à AmigaGuide par exemple, ou bien un gestionnaire de lancement de programmes comme ToolManager).

Il faudra pour cela utiliser la commande Execute_ suivie de trois arguments : le premier est le nom de la commande suivi de ses éventuels arguments (tout cela est bien évidemment une chaîne de caractères), et les deux derniers sont les directions des Entrées/Sorties (si vous utilisez 0, celles-ci seront redirigées vers NIL:). C'est clair ? Pas vraiment j'imagine :-). Essayons donc ce petit exemple :

if keycode=117 ; touche enfoncée=ESC
   Execute_ "C:AmigaGuide PROGDIR:Docs/Aide.guide",0,0
Endif

Ce tout petit bout de code inséré dans votre routine principale de gestion des événements vous permettra le plus simplement du monde d'avoir une aide en ligne disponible à tout moment ! Vous allez, grâce à cette petite fonction, donner une puissance que vous n'auriez jamais imaginée à vos programmes. Mais ce n'est pas tout, loin de là. On peut encore améliorer de beaucoup cette fonction : en effet, la lecture de votre fichier AmigaGuide stoppera carrément l'exécution de votre programme. Or, il se trouve que l'Amiga est multitâche (et ce, bien avant Windaube 95 ;-)).

On va donc faire tourner notre logiciel externe (dans notre cas AmigaGuide) de manière asynchrone, et pour cela, nous allons simplement lui ajouter la commande Run qui est parfaitement multitâche. Vous avez remarqué l'assignation PROGDIR: ? Il est parfois utilisé par les programmeurs (vous pouvez voir ce mot dans certains scripts d'installation par exemple), et il est bien sûr accessible depuis le Blitz grâce aux appels système (allez donc faire un tour vers la fin de votre manuel : un certain nombre des fonctions de l'OS de l'Amiga y sont décrites avec leur syntaxe, mais malheureusement, sans leur signification). Cela va vous permettre de charger certaines données depuis le répertoire où sera installé votre programme. Mais le gros inconvénient de la commande à utiliser est qu'elle est compliquée et qu'il faut en appeler d'autres avant. A utiliser par les utilisateurs avertis.

Mais il y a une autre méthode beaucoup plus simple ! Lorsque vous démarrez un programme Blitz, celui-ci désigne automatiquement le répertoire d'où le programme a été lancé comme le répertoire par défaut. A partir de là, vous n'aurez qu'à exécuter un CHDir (changement de répertoire) pour vous placer dans les répertoires où se trouvent vos données. Reformulons donc l'exemple que nous avons vu précédemment avec ce que nous venons d'apprendre :

if keycode=117 ; touche enfoncée=ESC
   succes=CHDir("Docs/")
   If succes<>1
      Execute_ "C:AmigaGuide PROGDIR:Docs/Aide.guide",0,0
   Endif
Endif

Un peu de vitesse

Maintenant, changeons un peu de sujet. Comment gagner de la vitesse de manière considérable ? En utilisant du code assembleur bien entendu ! Oui, mais là, vous vous dites "c'est bien beau, mais je n'y connais strictement rien en assembleur". Eh bien, figurez-vous que c'est exactement la même chose pour moi. Seulement, nous allons remplacer le symbole "/" par LSR pour nos divisions et le symbole "*" par LSL pour nos multiplications.

Seulement, il y a un hic, c'est que comme ces commandes fonctionnent en binaire, vous ne pourrez effectuer vos opérations qu'avec des puissances de 2. L'argument qui suit l'opération sera l'exposant de la puissance de 2 ("i LSR 4" divisera i par 2 puissance 4, c'est-à-dire par 16). Vous n'êtes pas convaincu de la différence de vitesse ? Tapez juste ce petit exemple :

WBstartup
ResetTimer
Repeat
   i+1
   resul.l=i LSL 2 ; miltiplication par 2 puissance 2, c'est-à-dire 4
Until i=10000
NPrint resul
NPrint Ticks
MouseWait
Forbid_
End

Essayez ensuite avec simplement le signe "*". Bon, ok, je vous donne les résultats : 56 "ticks" pour LSL et 65 pour "*", sur ma machine (68020 à 14 MHz). Ce qui vous fait quand même gagner 15% de vitesse sur un simple calcul. Alors, imaginez les différences que cela va faire lorsque vous allez vous essayer à la conversion Chunky -> bitmap pour faire un jeu 3D !

Capturez la police

On passe maintenant à la dernière astuce de ce mois. Elle va intéresser le plus grand nombre d'entre vous, j'imagine, par ses nombreuses conséquences, autres que celles de l'exemple que nous allons traiter. Nous allons capturer la police de caractères utilisée par le Workbench, afin de l'utiliser dans nos propres programmes (ce que la majorité des programmes DP et commerciaux fait).

Par exemple, votre Workbench utilise la police XEN.font. Vous programmez en Blitz, deux choix s'offraient alors à vous jusqu'à présent : utiliser la police par défaut (c'est-à-dire l'horrible Topaz), ou bien charger votre police. Oui mais voilà, lorsque vous allez diffuser vos programmes, vous ne pourrez pas connaitre la police de caractères que l'utilisateur a installée sur son Workbench. Notre routine va remédier à tout cela en allant simplement chercher le nom de la police du Workbench dans le fichier font.prefs du système.

Avant toute chose, je tiens à remercier un programmeur (dont j'ai malheureusement oublié le nom ;-)) qui a expliqué cela sur Internet et notre ami Pierre, qui en a fait la transcription pour que vous ayez directement un code clair et concis. Comme le fichier font.prefs est un fichier binaire, nous allons d'abord l'ouvrir en accès séquentiel, puis aller chercher les informations dedans avec l'instruction Get. Ensuite, on vérifie si le nom de la police existe bien et si c'est le cas, on essaye de la charger. Simple comme bonjour, n'est-ce pas ? Bon, allez, on attaque le source.

DEFTYPE .b SIZ,valeur
If ReadFile(0,"ENV:Sys/font.prefs") ; les fichiers de préférences sont toujours situés dans ENV:
   FileInput 0      ; on va chercher nos données dans le fichier 0
   Fields 0,valeur  ; on définit les champs de saisie à la variable "valeur"
   k=226            ; 62 pour la police des icônes - 226 par défaut - 390 pour la police écran
   Repeat
      Get 0,k       ; on se déplace à l'offset 226 ("k" sera transféré dans "valeur")
      font$=font$+Chr$(valeur   ; on rajoute à chaque passage dans la boucle une lettre du nom de la police
      k+1           ; on déplace le "curseur" de lecture d'un octet
   Until valeur<33  ; on répète notre boucle tant qu'il y a des lettres - en dessous du caractère ASCII 33,
                    ; ce ne sont plus des caractères qui peuvent être utilisés dans un nom
   Get 0,223        ; la taille de la police est trois octets avant son nom
   siz=valeur       ; on referme le fichier 0, font.prefs
   If Exists("Fonts:"+font$)    ; si le nom de la police existe réellement (on ne sait jamais)
      LoadFont 0,font$,siz      ; on charge la police
   EndIf
EndIf

Et voilà le travail ! Grâce à ces quelques lignes relativement simples, vos programmes bénéficieront de la police de caractères choisie par l'utilisateur pour son Workbench. Mais ce n'est pas, à mon sens, le plus intéressant. En effet, cette méthode est applicable quelle que soit la préférence du Workbench dont vous souhaitez bénéficier ! Il en sera donc de même pour les préférences d'Intuition, de la locale.library, de l'imprimante... Enfin, vérifiez tout de même, avant d'attaquer cette méthode, que vous n'avez pas déjà des commandes Blitz qui s'en occupent pour vous. Je ne le répèterai jamais assez : procurez-vous les bibliothèques de commandes additionnelles !

Si cet article vous a plu, faites le moi savoir par courrier électronique. De plus, je vous réserve une surprise pour un futur proche grâce à Orion Diffusion (qui fait encore une fois preuve de sa volonté de soutenir le Blitz) : le test des Blitz User Magazine (BUM). Bonne programmation !


[Retour en haut] / [Retour aux articles]