home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
262.lha
/
SpriteWizard_v1.0
/
SW_CDemo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-06-30
|
6KB
|
249 lines
/* Demo on how to use SpriteWiz created data in C - By D. Visage
Written with Aztec C 3.4, but should compile with Lattice.
To compile with Aztec C : cc +l SW_CDemo.c
To link with Aztec C : ln SW_CDemo.o -lc32
(c) 1988 Message Software
James Messa and David A. Visage
GET THE MESSAGE! */
#include <stdio.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <graphics/sprite.h>
#include "Talker.h"
#define VERSION 0 /* Any version of intuition is cool! */
/* Color registers used */
#define COLOR00 0
#define COLOR01 1
#define COLOR02 2
#define COLOR21 21
#define COLOR22 22
#define COLOR23 23
/* Define certain maximum values */
#define MAX_INT 32767
#define MAX_DELAY 3
#define MAX_WIDTH 640
#define MAX_HEIGHT 200
/* Sprite minimum and maximum (X,Y) coordinates */
#define MIN_X 5
#define MAX_X 605
#define MIN_Y 10
#define MAX_Y 185
/* Defines for sprite */
#define SPRITE02 02
#define SPR_HEIGHT 16
/* Define return values for all functions used */
extern struct Window *OpenWindow();
extern struct Library *OpenLibrary();
extern struct Message *GetMsg();
extern struct ViewPort *ViewPortAddress();
extern ULONG GetSprite();
extern unsigned int rand();
extern int GetRand();
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct NewWindow MyWindow;
struct SimpleSprite MySprite;
/* Pointers to various structures */
struct RastPort *Rp;
struct ViewPort *Vp;
struct Window *WindowPtr;
struct IntuiMessage *MessagePtr;
char *PromoStr = "Designing and animating sprites is easy with SpriteWiz!";
main()
{
LONG SprNum;
LONG SpriteX,SpriteY;
LONG TestX,TestY;
WORD SpriteDX,SpriteDY;
int cntr,DelayVal;
/* Start main program */
if ( ( IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library",VERSION) ) == NULL )
{
printf("Cannot find intuition library! \n");
exit(1);
};
if ( ( GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library",VERSION) ) == NULL )
{
printf("Cannot find graphics library! \n");
exit(1);
};
MyWindow.LeftEdge = 0;
MyWindow.TopEdge = 0;
MyWindow.Width = MAX_WIDTH;
MyWindow.Height = MAX_HEIGHT;
MyWindow.DetailPen = COLOR00;
MyWindow.BlockPen = COLOR01;
MyWindow.Flags = WINDOWCLOSE | SMART_REFRESH | ACTIVATE;
MyWindow.IDCMPFlags = CLOSEWINDOW;
MyWindow.Title = (UBYTE *) "Sprite Wizard C demo - By D. Visage ";
MyWindow.MinWidth = MyWindow.MinHeight = 0;
MyWindow.MaxWidth = MyWindow.MaxHeight = 0;
MyWindow.Type = WBENCHSCREEN;
if ( ( WindowPtr = OpenWindow(&MyWindow) ) == NULL )
{
printf("Cannot open your window! \n");
exit(1);
};
/* Get needed ViewPort and RastPort */
Vp = ViewPortAddress(WindowPtr);
Rp = WindowPtr->RPort;
SetRGB4(Vp,COLOR00,0x0,0x0,0x0); /* Background black */
SetRGB4(Vp,COLOR01,0xf,0xf,0xf); /* Borders white */
SetRGB4(Vp,COLOR02,0xf,0x0,0x0); /* All else is red */
/* Get Promo string up there */
SetAPen(Rp,COLOR01);
Move(Rp,100,100);
Text(Rp,PromoStr,(LONG) strlen(PromoStr));
SetSeed(); /* Seed random number generator */
/* Allocate a sprite to play with */
if ( ( SprNum = GetSprite(&MySprite,SPRITE02) ) == - 1 )
{
printf("Could not allocate a sprite! \n");
exit(1);
};
/* Initialize the sprite */
MySprite.num = SprNum;
MySprite.height = SPR_HEIGHT;
MySprite.x = MIN_X + GetRand(MAX_X - MIN_X);
MySprite.y = MIN_Y + GetRand(MAX_Y - MIN_Y);
/* Place holders for current (X,Y) */
SpriteX = MySprite.x;
SpriteY = MySprite.y;
/* Get random DX direction */
if ( GetRand(2) == 0 )
SpriteDX = 1;
else
SpriteDX = - 1;
/* Get random DY direction */
if ( GetRand(2) == 0 )
SpriteDY = 1;
else
SpriteDY = - 1;
cntr = NUM_SPRITES - 1;
DelayVal = 0;
while ( TRUE )
{
MessagePtr = (struct IntuiMessage *) GetMsg(WindowPtr->UserPort);
if ( MessagePtr != NULL )
{
ReplyMsg(MessagePtr);
if ( MessagePtr->Class == CLOSEWINDOW )
{
FreeSprite(SprNum);
CloseWindow(WindowPtr);
exit(0);
};
};
/* Next (X,Y) position is current (X,Y) + current DX,DY */
TestX = SpriteX + SpriteDX;
TestY = SpriteY + SpriteDY;
/* Check if sprite is within bounds */
if ( TestX <= MIN_X || TestX >= MAX_X )
SpriteDX = - (SpriteDX);
if ( TestY <= MIN_Y || TestY >= MAX_Y )
SpriteDY = - (SpriteDY);
/* Add DX,DY to current sprite (X,Y) */
SpriteX += SpriteDX;
SpriteY += SpriteDY;
/* Move that puppy */
MoveSprite(Vp,&MySprite,SpriteX,SpriteY);
Delay(1);
/* Pause a bit before flipping images */
if ( DelayVal == 0 )
{
DelayVal = MAX_DELAY;
if ( cntr == (NUM_SPRITES - 1) ) /* Max sprites reached? */
cntr = 0;
else
cntr++;
/* Change colors of current sprite image */
SetPackedRGB(Vp,MySprInfo[cntr].SprColor1,COLOR21);
SetPackedRGB(Vp,MySprInfo[cntr].SprColor2,COLOR22);
SetPackedRGB(Vp,MySprInfo[cntr].SprColor3,COLOR23);
/* Change sprite imagry to next in animation sequence */
ChangeSprite(Vp,&MySprite,&MySprInfo[cntr].SpriteData[0]);
}
else
DelayVal--;
}; /* while (TRUE) */
}
/* Set a ViewPort color register from a Packed UWORD */
SetPackedRGB(VPortPtr,ColorVal,ColorReg)
struct ViewPort *VPortPtr;
UWORD ColorVal;
ULONG ColorReg;
{
ULONG RedBits,GreenBits,BlueBits;
RedBits = (ColorVal >> 8) & 0xf;
GreenBits = (ColorVal >> 4) & 0xf;
BlueBits = ColorVal & 0xf;
SetRGB4(VPortPtr,ColorReg,RedBits,GreenBits,BlueBits);
}
/* Get a random number between 0 and (MaxRange - 1) */
GetRand(MaxRange)
int MaxRange;
{
int Divisor,Value;
Divisor = MAX_INT/MaxRange;
Value = rand()/Divisor;
return(Value);
}
/* Seed random number generator based on the current time */
SetSeed()
{
ULONG Seconds,MicroSeconds;
unsigned int IntSeconds;
CurrentTime(&Seconds,&MicroSeconds);
IntSeconds = (unsigned int) Seconds;
srand(IntSeconds);
}