home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / aga_software / animdemo / input.c < prev    next >
C/C++ Source or Header  |  1993-01-22  |  3KB  |  121 lines

  1. /*******************************************************************************
  2.  *
  3.  * (c) Copyright 1993 Commodore-Amiga, Inc.  All rights reserved.
  4.  *
  5.  * This software is provided as-is and is subject to change; no warranties
  6.  * are made.  All use is at your own risk.  No liability or responsibility
  7.  * is assumed.
  8.  *
  9.  * input.c - handles joystick input and IDCMP RAWKEY input. Creates input events
  10.  * for the input.device based on the joystick.
  11.  *
  12.  ******************************************************************************/
  13.  
  14. #include <exec/ports.h>
  15. #include <devices/input.h>
  16. #include <devices/inputevent.h>
  17. #include <intuition/screens.h>
  18. #include <proto/exec.h>
  19. #include <stdio.h>
  20.  
  21. #include "stick.h"
  22. #include "sprites.h"
  23.  
  24. ULONG __asm ReadJoystick(register __a0 struct JoyStick *stick);
  25. void FireMissile(struct Input *input);
  26.  
  27.  
  28. void DoJoystick(struct Input *input)
  29. {
  30.     static ULONG laststate;
  31.     static WORD accelx = 1, accely = 1;
  32.     ULONG stickstate = ReadJoystick(input->Stick);
  33.  
  34.     if (stickstate & FIRE)
  35.     {
  36.     FireMissile(input);
  37.     }
  38.  
  39.     if (stickstate & (LEFT | RIGHT | UP | DOWN))
  40.     {
  41.     input->FakeEvent->ie_NextEvent = NULL;
  42.     input->FakeEvent->ie_Class = IECLASS_NEWPOINTERPOS;
  43.     input->FakeEvent->ie_SubClass = IESUBCLASS_PIXEL;
  44.     input->FakeEvent->ie_Code = IECODE_NOBUTTON;
  45.     input->FakeEvent->ie_Qualifier = NULL;
  46.     input->FakeEvent->ie_EventAddress = (APTR)input->NewPixel;
  47.  
  48.     input->InputIO->io_Data = (APTR)input->FakeEvent;
  49.     input->InputIO->io_Length = sizeof(struct InputEvent);
  50.     input->InputIO->io_Command = IND_WRITEEVENT;
  51.  
  52.     input->NewPixel->iepp_Position.X = input->Screen->MouseX;
  53.     input->NewPixel->iepp_Position.Y = input->Screen->MouseY;
  54.     input->NewPixel->iepp_Screen = input->Screen;
  55.  
  56.     if ((stickstate & laststate) & (LEFT | RIGHT))
  57.     {
  58.         accelx++;
  59.         accelx = min(10, accelx);
  60.     }
  61.     else
  62.     {
  63.         accelx = 0;
  64.     }
  65.     
  66.     if ((stickstate & laststate) & (UP | DOWN))
  67.     {
  68.         accely++;
  69.         accely = min(10, accely);
  70.     }
  71.     else
  72.     {
  73.         accely = 0;
  74.     }
  75.     
  76.     if (stickstate & LEFT)
  77.     {
  78.         input->NewPixel->iepp_Position.X += -accelx;
  79.     }
  80.     if (stickstate & RIGHT)
  81.     {
  82.         input->NewPixel->iepp_Position.X += accelx;
  83.     }
  84.     if (stickstate & UP)
  85.     {
  86.         input->NewPixel->iepp_Position.Y += -accely;
  87.     }
  88.     if (stickstate & DOWN)
  89.     {
  90.         input->NewPixel->iepp_Position.Y += accely;
  91.     }
  92.     
  93.     /* limit the movements */
  94.     if (input->NewPixel->iepp_Position.Y > (input->Screen->Height - XHAIRHEIGHT))
  95.     {
  96.         input->NewPixel->iepp_Position.Y = (input->Screen->Height - XHAIRHEIGHT);
  97.     }
  98.  
  99.     DoIO((struct IORequest *)input->InputIO);
  100.     }
  101.     laststate = stickstate;
  102. }
  103.  
  104. void HandleInput(struct Input *input)
  105. {
  106.     struct Message *msg;
  107.  
  108.     /* If the a key was pressed, bug out. */
  109.     if (msg = GetMsg(input->Screen->FirstWindow->UserPort))
  110.     {
  111.     ReplyMsg(msg);
  112.     /* The only possible message was a keypress */
  113.     *(input->BugOut) = NULL;
  114.     }
  115.     else
  116.     {
  117.     DoJoystick(input);
  118.     }
  119. }
  120.  
  121.