-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlisting35.html
executable file
·586 lines (495 loc) · 24.3 KB
/
listing35.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<!-- BEGIN META TAG INFO -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="home" href="http://developer.apple.com/">
<link rel="find" href="http://developer.apple.com/search/">
<link rel="stylesheet" type="text/css" href="../../documentation/css/adcstyle.css" title="fonts">
<script language="JavaScript" src="../../documentation/js/adc.js" type="text/javascript"></script>
<!-- END META TAG INFO -->
<!-- BEGIN TITLE -->
<title>WiredSprites - /Start Code/QTWiredSprites.c</title>
<!-- END TITLE -->
<script language="JavaScript">
function JumpToNewPage() {
window.location=document.scpopupmenu.gotop.value;
return true;
}
</script>
</head>
<!-- BEGIN BODY OPEN -->
<body>
<!--END BODY OPEN -->
<!-- START CENTER OPEN -->
<center>
<!-- END CENTER OPEN -->
<!-- BEGIN LOGO AND SEARCH -->
<!--#include virtual="/includes/adcnavbar"-->
<!-- END LOGO AND SEARCH -->
<!-- START BREADCRUMB -->
<div id="breadcrumb">
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td scope="row"><img width="340" height="10" src="images/1dot.gif" alt=""></td>
<td><img width="340" height="10" src="images/1dot.gif" alt=""></td>
</tr>
<tr valign="middle">
<td align="left" colspan="2">
<a href="http://developer.apple.com/">ADC Home</a> > <a href="../../referencelibrary/index.html">Reference Library</a> > <a href="../../samplecode/index.html">Sample Code</a> > <a href="../../samplecode/QuickTime/index.html">QuickTime</a> > <a href="../../samplecode/QuickTime/idxWiredMoviesandSprites-date.html">Wired Movies and Sprites</a> > <A HREF="javascript:location.replace('index.html');">WiredSprites</A> >
</td>
</tr>
<tr>
<td colspan="2" scope="row"><img width="680" height="35" src="images/1dot.gif" alt=""></td>
</tr>
</table>
</div>
<!-- END BREADCRUMB -->
<!-- START MAIN CONTENT -->
<!-- START TITLE GRAPHIC AND INTRO-->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td><h1><div id="pagehead">WiredSprites</div></h1></td>
</tr>
</table>
<!-- END TITLE GRAPHIC AND INTRO -->
<!-- START WIDE COLUMN -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr align="left" valign="top">
<td id="scdetails">
<h2>/Start Code/QTWiredSprites.c</h2>
<form name="scpopupmenu" onSubmit="return false;" method=post>
<p><strong>View Source Code:</strong>
<select name="gotop" onChange="JumpToNewPage();" style="width:340px"><option selected value="ingnore">Select File</option>
<option value="listing1.html">/Application Files/ComApplication.c</option>
<option value="listing2.html">/Application Files/ComApplication.h</option>
<option value="listing3.html">/Application Files/ComResource.h</option>
<option value="listing4.html">/Application Files/QTWiredSprites.r</option>
<option value="listing5.html">/Application Files/WiredSpriteUtilities.c</option>
<option value="listing6.html">/Application Files/WiredSpriteUtilities.h</option>
<option value="listing7.html">/Clippings/AddMovieResource.txt</option>
<option value="listing8.html">/Clippings/AddOverrideSamples.txt</option>
<option value="listing9.html">/Clippings/AddSpriteActions.txt</option>
<option value="listing10.html">/Clippings/AddSpriteSampleToMedia.txt</option>
<option value="listing11.html">/Clippings/AssignImageGroupIDs.txt</option>
<option value="listing12.html">/Clippings/CreateKeyFrameSample.txt</option>
<option value="listing13.html">/Clippings/CreateMovieFile.txt</option>
<option value="listing14.html">/Clippings/InsertMediaIntoTrack.txt</option>
<option value="listing15.html">/Clippings/SetSpriteProperties.txt</option>
<option value="listing16.html">/Clippings/SpriteTrackProperties.txt</option>
<option value="listing17.html">/Common Files/ComFramework.c</option>
<option value="listing18.html">/Common Files/ComFramework.h</option>
<option value="listing19.html">/Common Files/EndianUtilities.c</option>
<option value="listing20.html">/Common Files/EndianUtilities.h</option>
<option value="listing21.html">/Common Files/ImageCompressionUtilities.c</option>
<option value="listing22.html">/Common Files/ImageCompressionUtilities.h</option>
<option value="listing23.html">/Common Files/MacFramework.c</option>
<option value="listing24.html">/Common Files/MacFramework.h</option>
<option value="listing25.html">/Common Files/MacPrefix.h</option>
<option value="listing26.html">/Common Files/QTUtilities.c</option>
<option value="listing27.html">/Common Files/QTUtilities.h</option>
<option value="listing28.html">/Common Files/SpriteUtilities.c</option>
<option value="listing29.html">/Common Files/SpriteUtilities.h</option>
<option value="listing30.html">/Common Files/WinFramework.c</option>
<option value="listing31.html">/Common Files/WinFramework.h</option>
<option value="listing32.html">/Common Files/WinPrefix.h</option>
<option value="listing33.html">/Completed Lab/QTWiredSprites.c</option>
<option value="listing34.html">/Completed Lab/QTWiredSprites.h</option>
<option value="listing35.html">/Start Code/QTWiredSprites.c</option>
<option value="listing36.html">/Start Code/QTWiredSprites.h</option></select>
</p>
</form>
<p><strong><a href="WiredSprites.zip">Download Sample</a></strong> (“WiredSprites.zip”, 1.43M)<BR>
<strong><a href="WiredSprites.dmg">Download Sample</a></strong> (“WiredSprites.dmg”, 1.96M)</p>
<!--
<p><strong><a href="#">Download Sample</a></strong> (“filename.sit”, 500K)</p>
-->
</td>
</tr>
<tr>
<td scope="row"><img width="680" height="10" src="images/1dot.gif" alt=""><br>
<img height="1" width="680" src="images/1dot_919699.gif" alt=""><br>
<img width="680" height="20" src="images/1dot.gif" alt=""></td>
</tr>
<tr>
<td scope="row">
<!--googleon: index -->
<pre class="sourcecodebox">////////////// File: QTWiredSprites.c//// Contains: QuickTime wired sprites support for QuickTime movies.//// Written by: Sean Allen// Revised by: Chris Flick and Tim Monroe// Based (heavily!) on the existing MakeActionSpriteMovie.c code written by Sean Allen.//// Copyright: © 1997-1998 by Apple Computer, Inc., all rights reserved.//// Change History (most recent first)://// <5> 03/20/00 rtm made changes to get things running under CarbonLib// <4> 07/30/99 rtm added QTWired_AddCursorChangeOnMouseOver to illustrate new// sprite-as-button behaviors added in QT4; added this action to penguin one// <3> 09/30/98 rtm tweaked call to AddMovieResource to create single-fork movies// <2> 03/26/98 rtm made fixes for Windows compiles// <1> 03/25/98 rtm first file; integrated existing code with shell framework// //// This sample code creates a wired sprite movie containing one sprite track. The sprite track contains// six sprites: two penguins and four buttons.// // The four buttons are initially invisible. When the mouse enters (or "rolls over") a button, it appears.// When the mouse is clicked inside a button, its image changes to its "pressed" image. When the mouse// is released, its image changes back to its "unpressed" image. If the mouse is released inside the button, // an action is triggered. The buttons perform the actions of go to beginning of movie, step backward,// step forward, and go to end of movie.// // The first penguin shows all of the buttons when the mouse enters it, and hides them when the mouse exits.// The first penguin is the only sprite that has properties that are overriden by the override sprite samples.// These samples override its matrix (in order to move it) and its image index (in order to make it "waddle").// // When the mouse is clicked on the second penguin, it changes its image index to it's "eyes closed" image.// When the mouse is released, it changes back to its normal image. This makes it appear to blink when clicked on.// When the mouse is released over the penguin, several actions are triggered. Both penguins' graphics states are // toggled between copyMode and blendMode, and the movie's rate is toggled between zero and one.// // The second penguin moves once per second. This occurs whether the movie's rate is currently zero or one,// because it is being triggered by a gated idle event. When the penguin receives the idle event, it changes// its matrix using an action which uses min, max, delta, and wraparound options.//// The movie's looping mode is set to palindrome by a frame-loaded action.//// So, our general strategy is as follows (though perhaps not in the order listed)://// (1) Create a new movie file with a single sprite track.// (2) Assign the "no controller" movie controller to the movie.// (3) Set the sprite track's background color, idle event frequency, and hasActions properties.// (4) Convert our PICT resources to animation codec images with transparency.// (5) Create a key frame sample containing six sprites and all of their shared images.// (6) Assign the sprites their initial property values.// (7) Create a frameLoaded event for the key frame.// (8) Create some override samples that override the matrix and image index properties of// the first penguin sprite.//// NOTES:// // *** (1) ***// There are event types other that mouse related events (for instance, Idle and FrameLoaded).// Idle events are independent of the movie's rate, and they can be gated so they are send at most// every n ticks. In our sample movie, the second penguin moves when the movie's rate is zero,// and moves only once per second because of the value of the sprite track's idleEventFrequencey property.// // *** (2) ***// Multiple actions may be executed in response to a single event. In our sample movie, rolling over// the first penguin shows and hides four different buttons.// // *** (3) ***// Actions may target any sprite or track in the movie. In our sample movie, clicking on one penguin// changes the graphics mode of the other.// // *** (4) ***// Conditional and looping control structures are supported. In our sample movie, the second penguin// uses the "case statement" action.// // *** (5) ***// Sprite track variables that have not been set have a default value of zero. (The second penguin's// conditional code relies on this.)// // *** (6) ***// Wired sprites were previously known as "action sprites". Don't let the names of some of the utility// functions confuse you. We'll try to update the source code as time permits.// // *** (7) ***// Penguins don't fly, but I hear they totally shred halfpipes on snowboards.////////////// header files#include "QTWiredSprites.h"////////////// QTWired_CreateWiredSpritesMovie// Create a QuickTime movie containing a wired sprites track.////////////OSErr QTWired_CreateWiredSpritesMovie (void){ short myResRefNum = 0; short myResID = movieInDataForkResID; Movie myMovie = NULL; Track myTrack; Media myMedia; FSSpec myFile; Boolean myIsSelected = false; Boolean myIsReplacing = false; StringPtr myPrompt = QTUtils_ConvertCToPascalString(kWiredSavePrompt); StringPtr myFileName = QTUtils_ConvertCToPascalString(kWiredSaveFileName); QTAtomContainer mySample = NULL; QTAtomContainer myActions = NULL; QTAtomContainer myBeginButton, myPrevButton, myNextButton, myEndButton; QTAtomContainer myPenguinOne, myPenguinTwo, myPenguinOneOverride; QTAtomContainer myBeginActionButton, myPrevActionButton, myNextActionButton, myEndActionButton; QTAtomContainer myPenguinOneAction, myPenguinTwoAction; RGBColor myKeyColor; Point myLocation; short isVisible, myLayer, myIndex, myID, i, myDelta; Boolean hasActions; long myFlags = createMovieFileDeleteCurFile | createMovieFileDontCreateResFile; OSType myType = FOUR_CHAR_CODE('none'); UInt32 myFrequency; QTAtom myEventAtom; long myLoopingFlags; ModifierTrackGraphicsModeRecord myGraphicsMode; OSErr myErr = noErr; ////////// // // create a new movie file and set its controller type // ////////// // ask the user for the name of the new movie file QTFrame_PutFile(myPrompt, myFileName, &myFile, &myIsSelected, &myIsReplacing); if (!myIsSelected) goto bail;// Step 1.// Insert "CreateMovieFile.clp" here// Step 2.// Insert "CreateKeyFrameSample.clp" here// Step 3.// Insert "AssignImageGroupIDs.clp" here// Step 4.// Insert "SetSpriteProperties.clp" here // Step 5.// Insert "AddSpriteActions.clp" here// Step 6.// Insert "AddSpriteSampleToMedia.clp" here// Step 7.// Insert "AddOverrideSamples.clp" here// Step 8.// Insert "InsertMediaIntoTrack.clp" here// Step 9.// Insert "SpriteTrackProperties.clp" here // Step 10.// Insert "AddMovieResource.clp" here bail: free(myPrompt); free(myFileName); if (mySample != NULL) QTDisposeAtomContainer(mySample); if (myBeginButton != NULL) QTDisposeAtomContainer(myBeginButton); if (myPrevButton != NULL) QTDisposeAtomContainer(myPrevButton); if (myNextButton != NULL) QTDisposeAtomContainer(myNextButton); if (myEndButton != NULL) QTDisposeAtomContainer(myEndButton); if (myResRefNum != 0) CloseMovieFile(myResRefNum); if (myMovie != NULL) DisposeMovie(myMovie); return(myErr);}////////////// QTWired_AddPenguinTwoConditionalActions// Add actions to the second penguin that transform him (her?) into a two state button// that plays or pauses the movie.//// We are relying on the fact that a "GetVariable" for a variable ID which has never been set// will return zero. If we needed a different default value, we could initialize it using the// frameLoaded event.//// A higher-level description of the logic is:// // On MouseUpInside// If (GetVariable(DefaultTrack, 1) = 0)// SetMovieRate(1)// SetSpriteGraphicsMode(DefaultSprite, { blend, grey } )// SetSpriteGraphicsMode(GetSpriteByID(DefaultTrack, 5), { ditherCopy, white } )// SetVariable(DefaultTrack, 1, 1)// ElseIf (GetVariable(DefaultTrack, 1) = 1)// SetMovieRate(0)// SetSpriteGraphicsMode(DefaultSprite, { ditherCopy, white })// SetSpriteGraphicsMode(GetSpriteByID(DefaultTrack, 5), { blend, grey })// SetVariable(DefaultTrack, 1, 0)// Endif// End// //////////OSErr QTWired_AddPenguinTwoConditionalActions (QTAtomContainer theContainer, QTAtom theEventAtom){ QTAtom myNewActionAtom, myNewParamAtom, myConditionalAtom; QTAtom myExpressionAtom, myOperatorAtom, myActionListAtom; short myParamIndex, myConditionIndex, myOperandIndex; float myConstantValue; QTAtomID myVariableID; ModifierTrackGraphicsModeRecord myBlendMode, myCopyMode; myBlendMode.graphicsMode = blend; myBlendMode.opColor.red = myBlendMode.opColor.green = myBlendMode.opColor.blue = 0x8fff; // grey myCopyMode.graphicsMode = ditherCopy; myCopyMode.opColor.red = myCopyMode.opColor.green = myCopyMode.opColor.blue = 0xffff; // white AddActionAtom(theContainer, theEventAtom, kActionCase, &myNewActionAtom); myParamIndex = 1; AddActionParameterAtom(theContainer, myNewActionAtom, myParamIndex, 0, NULL, &myNewParamAtom); // first condition myConditionIndex = 1; AddConditionalAtom(theContainer, myNewParamAtom, myConditionIndex, &myConditionalAtom); AddExpressionContainerAtomType(theContainer, myConditionalAtom, &myExpressionAtom); AddOperatorAtom(theContainer, myExpressionAtom, kOperatorEqualTo, &myOperatorAtom); myOperandIndex = 1; myConstantValue = kButtonStateOne; AddOperandAtom(theContainer, myOperatorAtom, kOperandConstant, myOperandIndex, NULL, myConstantValue); myOperandIndex = 2; myVariableID = kPenguinStateVariableID; AddVariableOperandAtom(theContainer, myOperatorAtom, myOperandIndex, 0, NULL, 0, myVariableID); AddActionListAtom(theContainer, myConditionalAtom, &myActionListAtom); AddMovieSetRateAction(theContainer, myActionListAtom, 0, Long2Fix(1)); AddSpriteSetGraphicsModeAction(theContainer, myActionListAtom, 0, 0, NULL, 0, 0, NULL, &myBlendMode, NULL); AddSpriteSetGraphicsModeAction(theContainer, myActionListAtom, 0, 0, NULL, 0, kTargetSpriteID, (void *)kPenguinOneSpriteID, &myCopyMode, NULL); AddSpriteTrackSetVariableAction(theContainer, myActionListAtom, 0, kPenguinStateVariableID, kButtonStateTwo, 0, NULL, 0); // second condition myConditionIndex = 2; AddConditionalAtom(theContainer, myNewParamAtom, myConditionIndex, &myConditionalAtom); AddExpressionContainerAtomType(theContainer, myConditionalAtom, &myExpressionAtom); AddOperatorAtom(theContainer, myExpressionAtom, kOperatorEqualTo, &myOperatorAtom); myOperandIndex = 1; myConstantValue = kButtonStateTwo; AddOperandAtom(theContainer, myOperatorAtom, kOperandConstant, myOperandIndex, NULL, myConstantValue); myOperandIndex = 2; myVariableID = kPenguinStateVariableID; AddVariableOperandAtom(theContainer, myOperatorAtom, myOperandIndex, 0, NULL, 0, myVariableID); AddActionListAtom(theContainer, myConditionalAtom, &myActionListAtom); AddMovieSetRateAction(theContainer, myActionListAtom, 0, Long2Fix(0)); AddSpriteSetGraphicsModeAction(theContainer, myActionListAtom, 0, 0, NULL, 0, 0, NULL, &myCopyMode, NULL); AddSpriteSetGraphicsModeAction(theContainer, myActionListAtom, 0, 0, NULL, 0, kTargetSpriteID, (void *)kPenguinOneSpriteID, &myBlendMode, NULL); AddSpriteTrackSetVariableAction(theContainer, myActionListAtom, 0, kPenguinStateVariableID, kButtonStateOne, 0, NULL, 0); return(noErr);}////////////// QTWired_AddWraparoundMatrixOnIdle// Add beginning, end, and change matrices to the specified atom container.////////////OSErr QTWired_AddWraparoundMatrixOnIdle (QTAtomContainer theContainer){ MatrixRecord myMinMatrix, myMaxMatrix, myDeltaMatrix; long myFlags = kActionFlagActionIsDelta | kActionFlagParameterWrapsAround; QTAtom myActionAtom; OSErr myErr = noErr; myMinMatrix.matrix[0][0] = myMinMatrix.matrix[0][1] = myMinMatrix.matrix[0][2] = EndianS32_NtoB(0xffffffff); myMinMatrix.matrix[1][0] = myMinMatrix.matrix[1][1] = myMinMatrix.matrix[1][2] = EndianS32_NtoB(0xffffffff); myMinMatrix.matrix[2][0] = myMinMatrix.matrix[2][1] = myMinMatrix.matrix[2][2] = EndianS32_NtoB(0xffffffff); myMaxMatrix.matrix[0][0] = myMaxMatrix.matrix[0][1] = myMaxMatrix.matrix[0][2] = EndianS32_NtoB(0x7fffffff); myMaxMatrix.matrix[1][0] = myMaxMatrix.matrix[1][1] = myMaxMatrix.matrix[1][2] = EndianS32_NtoB(0x7fffffff); myMaxMatrix.matrix[2][0] = myMaxMatrix.matrix[2][1] = myMaxMatrix.matrix[2][2] = EndianS32_NtoB(0x7fffffff); myMinMatrix.matrix[2][1] = EndianS32_NtoB(Long2Fix((1 * kSpriteTrackHeight / 4) - (kPenguinHeight / 2))); myMaxMatrix.matrix[2][1] = EndianS32_NtoB(Long2Fix((3 * kSpriteTrackHeight / 4) - (kPenguinHeight / 2))); SetIdentityMatrix(&myDeltaMatrix); myDeltaMatrix.matrix[2][1] = Long2Fix(1); // change location myErr = AddSpriteSetMatrixAction(theContainer, kParentAtomIsContainer, kQTEventIdle, 0, NULL, 0, 0, NULL, &myDeltaMatrix, &myActionAtom); if (myErr != noErr) goto bail; myErr = AddActionParameterOptions(theContainer, myActionAtom, 1, myFlags, sizeof(myMinMatrix), &myMinMatrix, sizeof(myMaxMatrix), &myMaxMatrix);bail: return(myErr);}////////////// QTWired_AddCursorChangeOnMouseOver// Add a cursor-change-on-mouse-over action to the sprite having the specified ID// in the specified atom container.//// Here we use the new "sprite behaviors atom" introduced in QuickTime 4.0, which// simplifies adding button-like capabilities to sprites.////////////OSErr QTWired_AddCursorChangeOnMouseOver (QTAtomContainer theContainer, QTAtomID theID){ QTAtom mySpriteAtom = 0; QTAtom myBehaviorAtom = 0; QTSpriteButtonBehaviorStruct myBehaviorRec; OSErr myErr = noErr; // find the sprite atom with the specified ID in the specified container mySpriteAtom = QTFindChildByID(theContainer, kParentAtomIsContainer, kSpriteAtomType, theID, NULL); if (mySpriteAtom == 0) { // if there is none, insert a new sprite atom into the specified container myErr = QTInsertChild(theContainer, kParentAtomIsContainer, kSpriteAtomType, theID, 0, 0, NULL, &mySpriteAtom); if (myErr != noErr) goto bail; } // insert a new sprite behaviors atom into the sprite atom myErr = QTInsertChild(theContainer, mySpriteAtom, kSpriteBehaviorsAtomType, 1, 1, 0, NULL, &myBehaviorAtom); if (myErr != noErr) goto bail; ////////// // // insert three atoms into the sprite behaviors atom; these three atoms specify what to do on each // of the four defined state transitions for the (1) sprite image, (2) cursor, and (3) status string // ////////// // set the sprite image behavior; -1 means: no change associated with this state transition myBehaviorRec.notOverNotPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.overNotPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.overPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.notOverPressedStateID = EndianS32_NtoB(-1); myErr = QTInsertChild(theContainer, myBehaviorAtom, kSpriteImageBehaviorAtomType, 1, 1, sizeof(QTSpriteButtonBehaviorStruct), &myBehaviorRec, NULL); if (myErr != noErr) goto bail; // set the sprite cursor behavior; -1 means: no change associated with this state transition myBehaviorRec.notOverNotPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.overNotPressedStateID = EndianS32_NtoB(kQTCursorOpenHand); myBehaviorRec.overPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.notOverPressedStateID = EndianS32_NtoB(-1); myErr = QTInsertChild(theContainer, myBehaviorAtom, kSpriteCursorBehaviorAtomType, 1, 1, sizeof(QTSpriteButtonBehaviorStruct), &myBehaviorRec, NULL); if (myErr != noErr) goto bail; // set the status string behavior; -1 means: no change associated with this state transition myBehaviorRec.notOverNotPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.overNotPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.overPressedStateID = EndianS32_NtoB(-1); myBehaviorRec.notOverPressedStateID = EndianS32_NtoB(-1); myErr = QTInsertChild(theContainer, myBehaviorAtom, kSpriteStatusStringsBehaviorAtomType, 1, 1, sizeof(QTSpriteButtonBehaviorStruct), &myBehaviorRec, NULL); if (myErr != noErr) goto bail; bail: return(myErr);}</pre>
<!--googleoff: index -->
</td>
</tr>
</table>
<!-- END WIDE COLUMN -->
<!-- END MAIN CONTENT -->
<table width="680" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div style="width: 100%; height: 1px; background-color: #919699; margin-top: 5px; margin-bottom: 15px"></div></td>
</tr>
<tr>
<td align="center"><br/>
<table border="0" cellpadding="0" cellspacing="0" class="graybox">
<tr>
<th>Did this document help you?</th>
</tr>
<tr>
<td>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=1&url=/samplecode/WiredSprites/listing35.html%3Fid%3DDTS10001044-1.0&media=dvd" target=_new>Yes</a>: Tell us what works for you.</div>
<div style="margin-bottom: 8px"><a href="http://developer.apple.com/feedback/?v=2&url=/samplecode/WiredSprites/listing35.html%3Fid%3DDTS10001044-1.0&media=dvd" target=_new>It’s good, but:</a> Report typos, inaccuracies, and so forth.</div>
<div><a href="http://developer.apple.com/feedback/?v=3&url=/samplecode/WiredSprites/listing35.html%3Fid%3DDTS10001044-1.0&media=dvd" target=_new>It wasn’t helpful</a>: Tell us what would have helped.</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- START BOTTOM APPLE NAVIGATION -->
<!--#include virtual="/includes/footer"-->
<!-- END BOTTOM APPLE NAVIGATION -->
<!-- START CENTER CLOSE -->
</center>
<!-- END CENTER CLOSE -->
</body>
</html>