    1  /**********************************************************************
    2   * AniMaus: Ein kleines nicht einmal trickreiches Programm zum
    3   * Animieren des Mauszeigers während der Arbeit auf dem Amiga.
    4   * Das Programm muss gestartet werden mit: RUN AniMaus weil es endlos
    5   * läuft. Es stört keine anderen Tasks, ausser solche, die den Mauszeiger
    6   * benutzen (also fast alle !? ).
    7   * Versuche eigene Images zu entwerfen mit einem Sprite-Maker oder
    8   * benutzen den transparent Modus.
    9   *
   10   * Der Aztec-C-3.4 Compileraufruf sieht folgendermaßen aus:
   11   * cc AniMaus.c -Iinclude/ +L
   12   * ln AniMaus.o -Llib/c +CD  Die Sprite-Daten muessen ins CHIP-memory
   13   *
   14   * Benutzt man Lattice-C darf nicht vergessen werden mit ATOM -CD die
   15   * Daten ins CHIP-Memory zu legen und erst danach den Linker aufzurufen.
   16   *
   17   * Autor:Bernhard Emese
   18   * Das Programm ist sehr klein und läuft im Hintergrund. Man kann
   19   * es auch problemlos zweimal starten.
   20   **********************************************************************/
   21  
   22  #include <exec/types.h>
   23  #include <intuition/intuitionbase.h>
   24  #include <intuition/intuition.h>
   25  #include <functions.h>
   26  
   27  struct IntuitionBase *IntuitionBase;
   28  struct GfxBase *GfxBase;
   29  
   30  #define POINTER_WIDTH 15      /* nicht 16 da hot spot mittig sein soll */
   31  #define POINTER_HEIGHT 15     /* dasselbe wie oben */
   32  #define POINTER_XOFFSET -8    /* Definition des hot spot in der Mitte 
   33                                   des Zeigers */
   34  #define POINTER_YOFFSET -7
   35  #define NUMBER_OF_FRAMES 10   /* Anzahl der Bilder */
   36  
   37  #define TRANSPARENT FALSE     /* setze TRANSPARENT TRUE für 
   38                                   Transparent Modus */
   39  
   40  /* Das unsichtbare Bild wird im Transparent Modus in jedem zweiten
   41     Bildschirmbild benutzt, so erscheint
   42     der Mauszeiger durchsichtig, allerdings ein wenig flackernd wie
   43     ein interlaced Bild */
   44  
   45  UWORD UnvisibleImage[POINTER_HEIGHT*2+4] = {
   46   0,0,
   47   0x0000,0x0000, 0x0000,0x0000, 0x0000,0x0000,
   48   0x0000,0x0000, 0x0000,0x0000, 0x0000,0x0000,
   49   0x0000,0x0000, 0x0000,0x0000, 0x0000,0x0000,
   50   0x0000,0x0000, 0x0000,0x0000, 0x0000,0x0000,
   51   0x0000,0x0000, 0x0000,0x0000, 0x0000,0x0000,
   52   0,0,
   53  };
   54  
   55  /* Hier sind die einzelnen Phasen des Bewegungsablaufs gespeichert */
   56  
   57  UWORD PointerImage[NUMBER_OF_FRAMES][POINTER_HEIGHT*2+4] = {
   58  {0,0,
   59   0x0100,0x0100, 0x0100,0x0100, 0x0100,0x0100,
   60   0x0100,0x0100, 0x0100,0x0100, 0x0000,0x0100,
   61   0x0000,0x0100, 0xf93f,0xFeff, 0x0000,0x0100,
   62   0x0000,0x0100, 0x0100,0x0100, 0x0100,0x0100,
   63   0x0100,0x0100, 0x0100,0x0100, 0x0100,0x0100,
   64   0,0,},
   65  {0,0,
   66   0x0200,0x0200, 0x0200,0x0200, 0x0200,0x0200,
   67   0x0200,0x0200, 0x0100,0x0100, 0x0000,0x0100,
   68   0x001e,0x011e, 0x0920,0x0ee0, 0xf000,0xf100,
   69   0x0000,0x0100, 0x0100,0x0100, 0x0080,0x0080,
   70   0x0080,0x0080, 0x0080,0x0080, 0x0080,0x0080,
   71   0,0,},
   72  {0,0,
   73   0x0400,0x0400, 0x0400,0x0400, 0x0400,0x0400,
   74   0x0200,0x0200, 0x0200,0x0200, 0x000e,0x010e,
   75   0x0030,0x0130, 0x0100,0x06c0, 0x1800,0x1900,
   76   0xe000,0xe100, 0x0080,0x0080, 0x0080,0x0080,
   77   0x0040,0x0040, 0x0040,0x0040, 0x0040,0x0040,
   78   0,0,},
   79  {0,0,
   80   0x0000,0x0000, 0x0800,0x0800, 0x0400,0x0400,
   81   0x0400,0x0400, 0x0204,0x0204, 0x0018,0x0218,
   82   0x0020,0x0160, 0x0100,0x0280, 0x0800,0x0d00,
   83   0x3000,0x3080, 0x4080,0x4080, 0x0040,0x0040,
   84   0x0040,0x0040, 0x0020,0x0020, 0x0000,0x0000,
   85   0,0,},
   86  {0,0,
   87   0x0000,0x0000, 0x1000,0x1000, 0x0800,0x0800,
   88   0x0804,0x0804, 0x0418,0x0418, 0x0020,0x0220,
   89   0x0000,0x02c0, 0x0100,0x0000, 0x0000,0x0680,
   90   0x0800,0x0880, 0x3040,0x3040, 0x4020,0x4020,
   91   0x0020,0x0020, 0x0010,0x0010, 0x0000,0x0000,
   92   0,0,},
   93  {0,0,
   94   0x0000,0x0000, 0x0000,0x0000, 0x2008,0x2008,
   95   0x1010,0x1010, 0x0820,0x0820, 0x0000,0x0440,
   96   0x0000,0x0280, 0x0100,0x0000, 0x0000,0x0280,
   97   0x0000,0x0440, 0x0820,0x0820, 0x1010,0x1010,
   98   0x2008,0x2008, 0x0000,0x0000, 0x0000,0x0000,
   99   0,0,},
  100  {0,0,
  101   0x0000,0x0000, 0x0010,0x0010, 0x0020,0x0020,
  102   0x4020,0x4020, 0x3040,0x3040, 0x0800,0x0880,
  103   0x0000,0x0680, 0x0100,0x0000, 0x0000,0x02c0,
  104   0x0020,0x0220, 0x0418,0x0418, 0x0804,0x0804,
  105   0x0800,0x0800, 0x1000,0x1000, 0x0000,0x0000,
  106   0,0,},
  107  {0,0,
  108   0x0000,0x0000, 0x0020,0x0020, 0x0040,0x0040,
  109   0x0040,0x0040, 0x4080,0x4080, 0x3000,0x3080,
  110   0x0800,0x0d00, 0x0100,0x0280, 0x0020,0x0160,
  111   0x0018,0x0218, 0x0204,0x0204, 0x0400,0x0400,
  112   0x0400,0x0400, 0x0800,0x0800, 0x0000,0x0000,
  113   0,0,},
  114  {0,0,
  115   0x0040,0x0040, 0x0040,0x0040, 0x0040,0x0040,
  116   0x0080,0x0080, 0x0080,0x0080, 0xe000,0xe100,
  117   0x1800,0x1900, 0x0100,0x06c0, 0x0030,0x0130,
  118   0x000e,0x010e, 0x0200,0x0200, 0x0200,0x0200,
  119   0x0400,0x0400, 0x0400,0x0400, 0x0400,0x0400,
  120   0,0,},
  121  {0,0,
  122   0x0080,0x0080, 0x0080,0x0080, 0x0080,0x0080,
  123   0x0080,0x0080, 0x0100,0x0100, 0x0000,0x0100,
  124   0xf000,0xf100, 0x0920,0x0ee0, 0x001e,0x011e,
  125   0x0000,0x0100, 0x0100,0x0100, 0x0200,0x0200,
  126   0x0200,0x0200, 0x0200,0x0200, 0x0200,0x0200,
  127   0,0,},
  128  };
  129  
  130  /*********************  main **************************/
  131  
  132  main()
  133  {
  134  int I;
  135  
  136    if ((IntuitionBase=(struct IntuitionBase *)
  137           OpenLibrary("intuition.library",LIBRARY_VERSION))==NULL)
  138      exit(10);
  139      /* sollte nie passieren - weil intuition.lib immer vorhanden ist */
  140  
  141    if ((GfxBase=(struct GfxBase *)
  142             OpenLibrary("graphics.library",LIBRARY_VERSION))==NULL)
  143      exit(10);
  144      /* kein Problem wie oben, wenn passende LIBRARY_VERSION 33 */
  145  
  146    FOREVER /*  Diese Endlos Schleife ist definiert als: for(;;) */
  147      for(I=0;I<NUMBER_OF_FRAMES;I++)
  148      {
  149       SetPointer(IntuitionBase->ActiveWindow,&PointerImage[I][0],
  150                 POINTER_HEIGHT,POINTER_WIDTH,POINTER_XOFFSET,POINTER_YOFFSET);
  151  /* Dieser Aufruf ändert den Mauszeiger im momentan aktiven Fenster */
  152        WaitTOF();
  153  /* Ab jetzt schläft der Task für 20 ms, ohne CPU-Zeit zu verbrauchen
  154     bis zum nächsten Bildschirmbild */ 
  155  
  156  /* Im Transparent Modus verschwindet der Mauszeiger jedes zweite Bild,
  157     auf diese Weise ist der Text darunter immer sichtbar  */
  158        if (TRANSPARENT)
  159        {
  160        SetPointer(IntuitionBase->ActiveWindow,&UnvisibleImage[0],
  161                  POINTER_HEIGHT,POINTER_WIDTH,POINTER_XOFFSET,POINTER_YOFFSET);
  162          WaitTOF();
  163        }
  164      }
  165  
  166  /* Die folgenden Zeilen sind nur noetig, wenn die Endlosschleife FOREVER
  167   * nicht benutzt wird und das Programm aufhören soll zu laufen.
  168   * Allerdings müßte der ClearPointer Aufruf in jedem Fenster erfolgen,
  169   * das einmal aktiv war, deshalb kann es passieren, wenn verschiedene
  170   * Fenster mit AniMaus angeklickt waren, daß dort der Mauszeiger
  171   * aus Speicherschmutz besteht. Die Fenster muessen geschlossen und
  172   * neu geöffnet werden. */
  173  
  174  /*  ClearPointer(IntuitionBase->ActiveWindow); */
  175  /*  setzt den Mauszeiger auf das Bild das in preferences gesetzt wurde */
  176  /*  CloseLibrary(IntuitionBase); */
  177  /*  CloseLibrary(GfxBase); */
  178  }
