Obligement - L'Amiga au maximum

Mercredi 26 juillet 2017 - 08:28  

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


Contact

David Brunet

Courriel

 


Programmation : E - Mousemove et Painter (ajout d'un gadget)
(Article écrit par Olivier Adam - novembre 1998)


L'enfer du E. The Jumpin'Windows

Je me suis dit que vous aviez compris le coup des modules, mais je n'ai pas pu résister à l'envie de vous faire un gadget. Il n'est nécessaire que de corriger une ligne du painter_plugin puis de recompiler ce module et enfin de compiler Painter à son tour pour obtenir un joli gadget, dont l'intérêt est double :
  • D'une part, le noyau du programme est devenu multifenêtres !
  • D'autre part, c'est bien la première fois que je vois une fenêtre (Window, en anglais) qui en poursuit une autre !
La modification du module est la suivante (un bogue ?) :

Remplacer "CON_RESIZEX" par "RESIZEX", idem pour le "Y". Les commentaires du source de Painter ont été modifiés, ne laissant apparaître que les nouveaux. Des bogues ont été retirés, le jeu est donc de les identifier et de me faire parvenir la liste de ceux qui ont été ajoutés (le bogue n'est pas un monopole de µ-Soft, mais l'incompétence est protégée sous cette marque par le dépôt d'un brevet dans la plupart des pays).

Pour sauter à droite de notre fenêtre de Painter, la palette, si elle existe, utilise le signal du mousemove lorsque Painter est actif, en déduit la position de la planche à dessiner et bouge jusqu'à 5 pixels à droite de celle-ci. L'exécutable ne mesurant que 29 ko, on peut, je pense, compiler le projet avec la version démo du E.

N'oubliez pas que la version de EasyGui est la 3.3b2, et vu que les sources sont fournies, vous pouvez rajouter par exemple à ce module la détection des disquettes (DISK_INSERTED) qui a été oubliée. Si vous recevez ce message, mangez-le !

Source "painter.e"

->©Adam98

OPT OSVERSION=37        -> blue-box : B1230-IV@50
OPT PREPROCESS               

MODULE 'graphics/text',      
       'intuition/intuition',
       'intuition/screens',
       'tools/EasyGUI',
       'tools/exceptions', -> gestion des erreurs
       '*mousemove',
       '*painter_plugin', -> retaillage modifié !
       '*painter_rev'     

-> globales
DEF f_prems:PTR TO guihandle,
    f_deuzz:PTR TO guihandle,
    plug:PTR TO painter


-> programme
PROC main() HANDLE
-> locales
   DEF depth,
      di:PTR TO drawinfo,
      mh=NIL,
      mouse:PTR TO mousemove,
      s:PTR TO screen

    s:=LockPubScreen(NIL)     
      di:=GetScreenDrawInfo(s) 
        depth:=di.depth        
      FreeScreenDrawInfo(s,di) 
    UnlockPubScreen(NIL,s)   

-> l'interface multi-fenêtrée !
  mh:=multiinit()   ->initialisation de mh

-> première fenêtre
  f_prems:=addmultiA(mh,VERSION_INFO,
    NEW [EQROWS,
         [PLUGIN,{m_a}, NEW mouse],
      NEW [BEVEL,
          [PAINTER,0,NEW plug]
          ]
        ],NIL)
plug.color:=1
-> deuxième fenêtre
  f_deuzz:=addmultiA(mh,' ',
    NEW [PALETTE,{p_a},NIL,depth,3,8,plug.color],
        [EG_WTYPE,WTYPE_NOSIZE,
         EG_CLOSE,{close},
         EG_TOP,f_prems.wnd.topedge,
         EG_LEFT,(5+f_prems.wnd.leftedge+f_prems.wnd.width),
         NIL])

-> gestion des fenêtres très sommaire...
  multiloop(mh)

EXCEPT DO   
  cleanmulti(mh)      -> fait tout pour nous
  report_exception()  -> nous dit tout
ENDPROC

PROC close(mh:PTR TO multihandle,info) IS closewin(info)

PROC p_a(info,col)
plug.color:=col
ENDPROC

PROC m_a(info)
   IF f_deuzz<>0 THEN
movewin(f_deuzz,(5+f_prems.wnd.leftedge+f_prems.wnd.width),f_prems.wnd.topedge)
ENDPROC

Source "Painter_rev.e"

-> Bumpee revision bump module. Do not alter this file manually.

OPT MODULE
OPT EXPORT
OPT PREPROCESS

/*
BUMP
  NAME=painter
  VERSION=1
  REVISION=1
ENDBUMP
*/

CONST VERSION=1
CONST REVISION=1

CONST VERSION_DAY=31
CONST VERSION_MONTH=10
CONST VERSION_YEAR=98

#define VERSION_STRING {version_string}
#define VERSION_INFO {version_info}

PROC dummy() IS NIL

version_string: CHAR '$VER: '
version_info: CHAR 'painter 1.1 (31.10.98)',0

Source "Painter_plugin.e"

-> Example de plugin pour EasyGUI : Un Painter.
-> olivieradam@minitel.net (ASCII only !)

OPT MODULE       ->ceci est un module
OPT OSVERSION=37  ->version minimum du système


->modules                 objets , CONSTANTES
MODULE 'graphics/text',       ->textattr
       'intuition/intuition', ->window,intuimessage
       'intuition/screens',   ->screen
       'tools/EasyGUI'        ->plugin , PLUGIN

      -> notre objet : une surface pouvant être peinte
EXPORT OBJECT painter OF plugin
  xm:INT,   ->x souris
  ym:INT,   ->y souris
  color:INT ->couleur choisie
ENDOBJECT

EXPORT CONST PAINTER=PLUGIN


-> Les méthodes par défaut :


PROC will_resize() OF painter IS RESIZEX OR RESIZEY

PROC min_size(ta:PTR TO textattr,fh) OF painter IS 100,100 ->taille de 100x100

PROC render(ta:PTR TO textattr,x,y,xs,ys,w:PTR TO window) OF painter IS self.draw(w,0)

PROC message_test(imsg:PTR TO intuimessage,w:PTR TO window) OF painter
-> test automatique de l'interface
  DEF x,y
  IF (imsg.class=IDCMP_MOUSEBUTTONS) OR (imsg.code=SELECTUP) -> si on a cliqué alors :
    x:=imsg.mousex
    y:=imsg.mousey
    IF (x>=self.x) AND (y>=self.y) AND (x<(self.x+self.xs)) AND (y<(self.y+self.ys))
    -> et si en plus on a cliqué dans la fenêtre alors :
      self.xm:=x-self.x*1000/self.xs    -> changement d'échelle
      self.ym:=y-self.y*1000/self.ys
      RETURN TRUE  -> retourne vrai => provoque message_action()
    ENDIF
  ENDIF
ENDPROC FALSE      -> retourne faux => pas de message_action()

-> ici on peut extraire les touches appuyées aussi ex: Amiga

Alt Ctrl Help...
PROC message_action(class,qual,code,w:PTR TO window) OF painter
  self.draw(w,0) ->dessine l'outil 0 où l'on a cliqué
ENDPROC FALSE

-> méthode perso de dessin
PROC draw(w:PTR TO window,pad) OF painter -> le pad est là pour permettre d'ajouter des outils
  DEF xm,ym
  SELECT pad
     CASE 0
        xm:=self.xm*self.xs/1000+self.x       -> rechangement d'échelle
        ym:=self.ym*self.ys/1000+self.y
        SetStdRast(w.rport)                 -> des fois que...
-> ma petite brosse
        Line(xm-1,ym,xm+1,ym,self.color)
        Line(xm,ym+1,xm,ym-1,self.color)
        Plot(self.xm+self.x,self.ym+self.y,self.color)
   -> CASE 1 -> autre outil, par exemple : ligne, rond, rectangle...
     DEFAULT ; NOP -> outil par défaut, pour ne rien oublier
  ENDSELECT
ENDPROC

Source "mousemove.e"

-> mousemove-plugin
OPT OSVERSION=37
OPT EXPORT

MODULE 'tools/EasyGUI',
       'intuition/intuition'

OBJECT mousemove OF plugin
   mx,old_mx
   my,old_my
ENDOBJECT

PROC min_size(ta,fh) OF mousemove IS 0,0

PROC will_resize() OF mousemove IS FALSE

PROC render(ta,x,y,xs,ys,w:PTR TO window) OF mousemove IS EMPTY

PROC message_test(imsg:PTR TO intuimessage,w:PTR TO window) OF mousemove
   self.mx:=imsg.mousex
   self.my:=imsg.mousey
   self.old_mx:=self.mx
   self.old_my:=self.my
ENDPROC imsg.class=IDCMP_INTUITICKS

PROC message_action(class,qual,code,win) OF mousemove IS TRUE

[Télécharger les sources et les exécutables de cet article]



[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]