Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
AnimationTest.c
// |
// © Copyright 1991 Apple Computer, Inc. By Ricardo Batista |
// |
// Sprite Manager test application |
// |
// 05/16/91 |
// |
#include <Types.h> |
#include <QuickDraw.h> |
#include <QDOffscreen.h> |
#include <Memory.h> |
#include <OSUtils.h> |
#include <Windows.h> |
#include <Fonts.h> |
#include <Menus.h> |
#include <TextEdit.h> |
#include <Events.h> |
#include <Packages.h> |
#include <OSEvents.h> |
#include <Desk.h> |
#include <ToolUtils.h> |
#include <Scrap.h> |
#include <Resources.h> |
#include <Retrace.h> |
#include <SysEqu.h> |
#include "SpriteMgr.h" |
#define appleMenu 128 |
#define fileMenu 129 |
#define editMenu 130 |
#define setupMenu 131 |
#define quitItem 1 |
#define undoItem 1 |
#define cutItem 3 |
#define copyItem 4 |
#define pasteItem 5 |
#define clearItem 6 |
#define kCopyGItem 1 |
#define kCatItem 2 |
#define kHoleItem 3 |
#define kSkyItem 4 |
#define kWindowItem 5 |
#define kClockItem 6 |
#define okItem 1 |
#define cancelItem 2 |
short Initialize(void); |
void SetMenus(void); |
void AnalizeKeys(void); |
Boolean Working(void); |
Boolean DoCommand(long mResult); |
void DoAbout(); |
Boolean HandleMouseDowns(void); |
void CloseUp(void); |
void UpdateDisplayWindow(void); |
void UpdateAnimation(void); |
EventRecord myEvent; |
MenuHandle myMenu[5]; |
WindowPtr displayWindow; |
Boolean shiftK, commandK, optionK; |
Boolean inFront; |
Boolean activeMenus; |
Boolean cursorInvisible; |
short yBackID[4]; |
short rBackID[5]; |
short clockID; |
short windowID; |
short skyID; |
short catID; |
Point catPoint; |
short mouseHoleID; |
Point mouseHolePoint; |
Boolean doingCat, doingHole, hasWindow, hasSky, hasClock; |
main() |
{ |
if (Initialize()) |
return; |
while (Working()) |
; |
CloseUp(); |
} |
void UpdateDisplayWindow(void) |
{ |
GrafPtr savePort; |
GetPort(&savePort); |
SetPort(displayWindow); |
BeginUpdate(displayWindow); |
DoAnimation(true); |
EndUpdate(displayWindow); |
SetPort(savePort); |
} |
void CloseUp(void) |
{ |
if (cursorInvisible) |
ShowCursor(); |
CloseSpriteMgr(); |
displayWindow = 0L; |
} |
short Initialize(void) |
{ |
register short counter; |
Rect box; |
short err; |
PicHandle picH; |
Rect bYellowRect; |
Rect bRedBlueFloorRect; |
for (counter = 0; counter < 10; counter++) |
MoreMasters(); |
InitGraf(&qd.thePort); |
InitFonts(); |
InitWindows(); |
TEInit(); |
InitMenus(); |
InitDialogs(0L); |
DrawMenuBar(); |
FlushEvents(everyEvent,0L); |
InitCursor(); |
MaxApplZone(); |
InitAllPacks(); |
SetMenus(); |
activeMenus = true; |
cursorInvisible = false; |
box.top = box.left = box.right = box.bottom = 0; |
picH = GetPicture(141); // yellow background |
if (picH) { |
LoadResource((Handle) picH); |
bYellowRect = (**picH).picFrame; |
} |
picH = GetPicture(143); // red and blue tiles for floor |
if (picH) { |
LoadResource((Handle) picH); |
bRedBlueFloorRect = (**picH).picFrame; |
} |
box.bottom = bYellowRect.bottom + bRedBlueFloorRect.bottom; |
box.right = bYellowRect.right * 4; |
err = InitSpriteMgr(0L); |
if (err) { |
CloseSpriteMgr(); |
return(err); |
} |
displayWindow = (WindowPtr) NewAnimation(&box, box.right, box.bottom, "SpriteMgr Test"); |
if (!displayWindow) { |
CloseSpriteMgr(); |
return(1); |
} |
SetPort(displayWindow); |
box = bYellowRect; |
for (counter = 0; counter < 4; counter++) { |
yBackID[counter] = NewBackground(141, counter + 1, srcCopy, &box, 141 - counter); |
box.left += bYellowRect.right; |
box.right += bYellowRect.right; |
} |
box = bRedBlueFloorRect; |
box.top += bYellowRect.bottom; |
box.bottom += bYellowRect.bottom; |
for (counter = 0; counter < 5; counter++) { |
rBackID[counter] = NewBackground(143, counter + 20, srcCopy, &box, 143 + counter); |
box.left += bRedBlueFloorRect.right; |
box.right += bRedBlueFloorRect.right; |
} |
catID = NewSprite(140, 1, transparent, 0L, 0L, 140, 0L, false, 140); |
catPoint.h = 10; |
catPoint.v = 200; |
PutSprite(catID, catPoint.v, catPoint.h); |
mouseHoleID = NewForegroundSprite(134, 1, transparent, 0L, 0L, 134, 0L, false, 134); |
mouseHolePoint.v = 270; |
mouseHolePoint.h = 5; |
PutSprite(mouseHoleID, mouseHolePoint.v, mouseHolePoint.h); |
ActivateAnimation(); |
DoAnimation(false); // to show initial screen |
doingCat = false; |
doingHole = true; |
CheckItem(myMenu[setupMenu - 128], kCatItem, doingCat); |
CheckItem(myMenu[setupMenu - 128], kHoleItem, doingHole); |
hasWindow = hasSky = hasClock = false; |
return(0); |
} |
void SetMenus() |
{ |
char appleStr[2]; |
appleStr[0] = 1; |
appleStr[1] = 0x14; |
myMenu[appleMenu - 128] = NewMenu(appleMenu,appleStr); |
myMenu[fileMenu - 128] = NewMenu(fileMenu,"\pFile"); |
myMenu[editMenu - 128] = NewMenu(editMenu,"\pEdit"); |
myMenu[setupMenu - 128] = NewMenu(setupMenu,"\pTest"); |
AppendMenu(myMenu[appleMenu - 128],"\pAbout Color Sprites...;(-"); |
AddResMenu(myMenu[appleMenu - 128],'DRVR'); |
AppendMenu(myMenu[fileMenu - 128],"\pQuit/Q"); |
AppendMenu(myMenu[editMenu - 128],"\pUndo;(-;Cut/X;Copy/C;Paste/V;Clear"); |
AppendMenu(myMenu[setupMenu - 128],"\pCopy a GWorld to screen, d6=id;Move Cat;Move MouseHole"); |
AppendMenu(myMenu[setupMenu - 128],"\pSky;Window;Clock;(-;optionKey = selective update;commandKey = suspend animation"); |
InsertMenu(myMenu[appleMenu - 128],0); |
InsertMenu(myMenu[fileMenu - 128],0); |
InsertMenu(myMenu[editMenu - 128],0); |
InsertMenu(myMenu[setupMenu - 128],0); |
DrawMenuBar(); |
} |
void AnalizeKeys() |
{ |
if (myEvent.modifiers & cmdKey) |
commandK = true; |
else |
commandK = false; |
if (myEvent.modifiers & shiftKey) |
shiftK = true; |
else |
shiftK = false; |
if (myEvent.modifiers & optionKey) |
optionK = true; |
else |
optionK = false; |
} |
Boolean Working() |
{ |
register char theChar; |
register Boolean event; |
WindowPtr w; |
KeyMap keys; |
GetKeys(&keys[0]); |
if (keys[3] & 0x8) { |
// left |
if (doingCat) { |
catPoint.h -= 8; |
MoveSpriteTo(catID, catPoint.h, catPoint.v, 0); |
} |
if (doingHole) { |
mouseHolePoint.h -= 4; |
MoveSpriteTo(mouseHoleID, mouseHolePoint.h, mouseHolePoint.v, 0); |
} |
} |
if (keys[3] & 0x20) { |
// down |
if (doingCat) { |
catPoint.v += 8; |
MoveSpriteTo(catID, catPoint.h, catPoint.v, 0); |
} |
if (doingHole) { |
mouseHolePoint.v += 4; |
MoveSpriteTo(mouseHoleID, mouseHolePoint.h, mouseHolePoint.v, 0); |
} |
} |
if (keys[3] & 0x10) { |
// right |
if (doingCat) { |
catPoint.h += 8; |
MoveSpriteTo(catID, catPoint.h, catPoint.v, 0); |
} |
if (doingHole) { |
mouseHolePoint.h += 4; |
MoveSpriteTo(mouseHoleID, mouseHolePoint.h, mouseHolePoint.v, 0); |
} |
} |
if (keys[3] & 0x40) { |
// up |
if (doingCat) { |
catPoint.v -= 8; |
MoveSpriteTo(catID, catPoint.h, catPoint.v, 0); |
} |
if (doingHole) { |
mouseHolePoint.v -= 4; |
MoveSpriteTo(mouseHoleID, mouseHolePoint.h, mouseHolePoint.v, 0); |
} |
} |
if (activeMenus || (keys[1] & 0x8000)) { // command key down, allow menus |
if (!activeMenus) { |
if (cursorInvisible) { |
ShowCursor(); |
cursorInvisible = false; |
} |
} |
event = WaitNextEvent(everyEvent, &myEvent, 0L, 0L); |
AnalizeKeys(); |
} |
else { |
if (cursorInvisible == false) { |
HideCursor(); |
cursorInvisible = true; |
} |
event = false; |
DoAnimation(false); |
} |
if (event) { |
switch (myEvent.what) { |
case app4Evt: |
if (myEvent.modifiers & 128) |
inFront = true; |
else { |
inFront = false; |
if (cursorInvisible) { |
ShowCursor(); |
cursorInvisible = false; |
} |
} |
break; |
case activateEvt: |
w = (WindowPtr) myEvent.message; |
if (myEvent.modifiers & activeFlag) { |
} |
else { |
} |
break; |
case keyDown: |
case autoKey: |
theChar = myEvent.message & charCodeMask; |
if (commandK) { |
if (!DoCommand(MenuKey(theChar))) |
return(false); |
} |
else { |
w = FrontWindow(); |
} |
break; |
case updateEvt: |
w = (WindowPtr) myEvent.message; |
if (w == displayWindow) { |
UpdateDisplayWindow(); |
} |
break; |
case mouseDown: |
if (!HandleMouseDowns()) |
return(false); |
break; |
default: |
break; |
} |
} |
return(true); |
} |
void DoAbout() |
{ |
MoveTo(100,100); |
DrawString("\p A color sprite test by Ricardo Batista"); |
} |
Boolean DoCommand(long mResult) |
{ |
register short theItem; |
char st[250]; |
Rect box; |
short h, v; |
PicHandle picH; |
theItem = LoWord(mResult); |
switch (HiWord(mResult)) { |
case appleMenu: |
GetItem(myMenu[0],theItem,st); |
if (theItem > 2) |
OpenDeskAcc(st); |
else |
DoAbout(); |
break; |
case fileMenu: |
switch (theItem) { |
case quitItem: |
return(false); |
break; |
default: |
break; |
} |
break; |
case editMenu: |
if (!SystemEdit(theItem -1)) { |
switch (theItem) { |
case undoItem: |
break; |
case cutItem: |
ZeroScrap(); |
TEToScrap(); |
break; |
case copyItem: |
ZeroScrap(); |
TEToScrap(); |
break; |
case pasteItem: |
TEFromScrap(); |
break; |
case clearItem: |
break; |
default: |
break; |
} |
} |
break; |
case setupMenu: |
if (theItem == kCopyGItem) |
CopyGToScreen(); |
if (theItem == kCatItem) { |
if (doingCat) |
doingCat = false; |
else |
doingCat = true; |
CheckItem(myMenu[setupMenu - 128], kCatItem, doingCat); |
} |
if (theItem == kHoleItem) { |
if (doingHole) |
doingHole = false; |
else |
doingHole = true; |
CheckItem(myMenu[setupMenu - 128], kHoleItem, doingHole); |
} |
if (theItem == kClockItem) { |
if (hasClock) { |
hasClock = false; |
KillSprite(clockID); |
} |
else { |
hasClock = true; |
clockID = NewBackgroundSprite(200, 4, transparent, 0L, 30L, 200, 0L, |
false, 200); |
PutSprite(clockID, 60, 100); |
} |
CheckItem(myMenu[setupMenu - 128], kClockItem, hasClock); |
} |
if (theItem == kWindowItem) { |
if (hasWindow) { |
hasWindow = false; |
KillSprite(windowID); |
} |
else { |
hasWindow = true; |
windowID = NewBackgroundSprite(131, 1, transparent, 0L, 0L, 131, 0L, false, 131); |
PutSprite(windowID, 80, 260); |
} |
CheckItem(myMenu[setupMenu - 128], kWindowItem, hasWindow); |
} |
if (theItem == kSkyItem) { |
if (hasSky) { |
hasSky = false; |
KillBackground(skyID); |
} |
else { |
hasSky = true; |
picH = GetPicture(131); // need window frame |
if (picH) { |
LoadResource((Handle) picH); |
box = (**picH).picFrame; // get window rectangle, but needs compensation |
} |
h = box.right - box.left; |
v = box.bottom - box.top; |
box.top = 80 + 4; |
box.bottom = 80 + v - 4; |
box.left = 260 + 6; // compensate for edges of window |
box.right = 260 + h - 8; |
skyID = NewBackground(136, 200, srcCopy, &box, 200); |
AutoScrollBackground(skyID, 0, 2, 20L); |
} |
CheckItem(myMenu[setupMenu - 128], kSkyItem, hasSky); |
} |
break; |
default: |
break; |
} |
HiliteMenu(0); |
return(true); |
} |
Boolean HandleMouseDowns(void) |
{ |
WindowPtr whichWindow; |
Rect box; |
long new; |
short v, h; |
switch (FindWindow(myEvent.where,&whichWindow)) { |
case inSysWindow: |
SystemClick(&myEvent,whichWindow); |
break; |
case inMenuBar: |
return(DoCommand(MenuSelect(myEvent.where))); |
break; |
case inGrow: |
SetRect(&box,160,100,600,600); |
new = GrowWindow(whichWindow,myEvent.where,&box); |
if (new) { |
v = HiWord(new); |
h = LoWord(new); |
SetPort(whichWindow); |
SizeWindow(whichWindow,h,v,true); |
EraseRect(&(whichWindow->portRect)); |
InvalRect(&(whichWindow->portRect)); |
} |
break; |
case inGoAway: |
if (TrackGoAway(whichWindow,myEvent.where)) |
return(false); |
break; |
case inDrag: |
if (commandK || (FrontWindow() == whichWindow)) |
DragWindow(whichWindow,myEvent.where,&qd.screenBits.bounds); |
else { |
SelectWindow(whichWindow); |
SetPort(whichWindow); |
} |
break; |
case inContent: |
if (whichWindow != FrontWindow()) { |
SelectWindow(whichWindow); |
SetPort(whichWindow); |
} |
else { |
if (whichWindow == displayWindow) { |
if (activeMenus == false) { |
DeactivateAnimation(); |
ShowCursor(); |
activeMenus = true; |
cursorInvisible = false; |
} |
else { |
ActivateAnimation(); |
HideCursor(); |
activeMenus = false; |
cursorInvisible = true; |
} |
} |
} |
break; |
default: |
break; |
} |
return(true); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-10-10