Learn Implement to Games Code with John M. Quick Boca Raton London New York CRC Press is an imprint of the Taylor & Francis Group, an informa business CRC Press Taylor & Francis Group 6000 Broken Sound Parkway NW, Suite 300 Boca Raton, FL 33487-2742 © 2017 by Taylor & Francis Group, LLC CRC Press is an imprint of Taylor & Francis Group, an Informa business No claim to original U.S. Government works Printed on acid-free paper Version Date: 20160414 International Standard Book Number-13: 978-1-4987-5338-8 (Paperback) This book contains information obtained from authentic and highly regarded sources. Reasonable efforts have been made to publish reliable data and information, but the author and publisher cannot assume responsibility for the validity of all materials or the consequences of their use. The authors and publishers have attempted to trace the copyright holders of all material reproduced in this publication and apologize to copyright holders if permission to publish in this form has not been obtained. If any copyright material has not been acknowledged please write and let us know so we may rectify in any future reprint. Except as permitted under U.S. Copyright Law, no part of this book may be reprinted, reproduced, transmit- ted, or utilized in any form by any electronic, mechanical, or other means, now known or hereafter invented, including photocopying, microfilming, and recording, or in any information storage or retrieval system, without written permission from the publishers. For permission to photocopy or use material electronically from this work, please access www.copyright. com (http://www.copyright.com/) or contact the Copyright Clearance Center, Inc. (CCC), 222 Rosewood Drive, Danvers, MA 01923, 978-750-8400. CCC is a not-for-profit organization that provides licenses and registration for a variety of users. For organizations that have been granted a photocopy license by the CCC, a separate system of payment has been arranged. Trademark Notice: Product or corporate names may be trademarks or registered trademarks, and are used only for identification and explanation without intent to infringe. Library of Congress Cataloging‑in‑Publication Data Names: Quick, John M., author. Title: Learn to implement games with code / John M. Quick. Description: Boca Raton : Taylor & Francis Group, LLC, CRC Press is an imprint of Taylor & Francis Group, [2017] | Includes bibliographical references and index. Identifiers: LCCN 2016007414 | ISBN 9781498753388 Subjects: LCSH: Computer games--Programming. Classification: LCC QA76.76.C672 Q53 2017 | DDC 794.8/1536--dc23 LC record available at https://lccn.loc.gov/2016007414 Visit the Taylor & Francis Web site at http://www.taylorandfrancis.com and the CRC Press Web site at http://www.crcpress.com This book is dedicated to the future game developers of the world. Contents Preface xiii Acknowledgment xvii Author xix 1. The World Beyond the Screen 1 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Unity Game Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Test the Example Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Build Your Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Put Logic before Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Process Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Challenge Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Prefabs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Scenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 Sprites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 v Challenge: Move the Camera with Luna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 Hint: Create a New Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Hint: Attach the Script to an Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Hint: Pin the Camera to Luna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 Hint: Access Unity Objects and Components . . . . . . . . . . . . . . . . . . . . . .12 Hint: Apply Unity Control Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13 Example Solution: Move the Camera with Luna . . . . . . . . . . . . . . . . . . . .14 Challenge: Stop the Camera at the Boundaries . . . . . . . . . . . . . . . . . . . . . . . .16 Hint: Find the Map Boundaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17 Hint: Apply the Boundary Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 Example Solution: Stop the Camera at the Boundaries . . . . . . . . . . . . . .19 Challenge: Give the Camera Smooth Movement . . . . . . . . . . . . . . . . . . . . . .24 Hint: Determine the Camera Properties . . . . . . . . . . . . . . . . . . . . . . . . . . .24 Hint: Apply Smoothing to the Camera Movement . . . . . . . . . . . . . . . . . .25 Hint: Account for the Distance Threshold . . . . . . . . . . . . . . . . . . . . . . . . .25 Example Solution: Give the Camera Smooth Movement . . . . . . . . . . . . .26 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31 2. A Dialogue with the Red Knight 33 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Challenge Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Dialogue Box Panel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Unity User Interface System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34 Challenge: Notify the Player Using a Dismissible Dialogue Box . . . . . . . . .37 Hint: Update the Dialogue Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37 Hint: Change the Visibility of the Dialogue Box . . . . . . . . . . . . . . . . . . . .38 Hint: Dismiss the Dialogue Box Based on User Input . . . . . . . . . . . . . . .39 Unity Input Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39 Hint: Detect the Collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41 Unity Console Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41 Unity Trigger Collisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42 Example Solution: Notify the Player Using a Dismissible Dialogue Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44 Challenge: Notify the Player Using a Timed Dialogue Box . . . . . . . . . . . . .47 Hint: Introduce a Timed Delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 Hint: Use the WaitForSeconds() Function . . . . . . . . . . . . . . . . . . . . .48 Example Solution: Notify the Player Using a Timed Dialogue Box . . . .48 Challenge: Update the Dialogue Box with a Scrolling Text Effect . . . . . . . .49 Hint: Store Each Line of Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50 Hint: Update the Lines of Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51 Example Solution: Update the Dialogue Box with a Scrolling Text Effect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52 vi Contents Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60 3. A Daring Decision 61 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62 Challenge: Present a Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62 Hint: Leverage Your Codebase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63 Hint: Set and Reset the Selection Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63 Hint: Position the Selection Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64 Hint: Detect the Collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66 Example Solution: Present a Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67 Challenge: Make a Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71 Hint: Manage Information Flow with Delegates and Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72 Delegates for Asynchronous Callback . . . . . . . . . . . . . . . . . . . . . . . . . .72 Lambda Expressions for Asynchronous Callback . . . . . . . . . . . . . . . .73 Asynchronous Callback Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74 Hint: Implement the Selection Process . . . . . . . . . . . . . . . . . . . . . . . . . . . .77 Hint: Execute the Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Example Solution: Make a Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89 4. Face the Dragon 91 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92 Challenge: Prepare the Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92 Hint: Manage All Interactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94 Hint: Keep Track of the Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95 Hint: Start an Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97 Hint: Generate an Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98 Example Solution: Prepare the Interaction . . . . . . . . . . . . . . . . . . . . . . . . .98 Challenge: Implement Turns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 Hint: Choose an Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105 Hint: Choose a Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105 Hint: Focus on a Single Turn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .106 Hint: Focus on the Entire Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . .107 Hint: Generate Opponent Turns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107 Example Solution: Implement Turns . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107 Challenge: Determine the Interaction Result . . . . . . . . . . . . . . . . . . . . . . . .118 Hint: Determine Outcomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118 Hint: Apply Outcomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118 Hint: Manage the Interaction State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119 Example Solution: Determine the Interaction Result . . . . . . . . . . . . . . .119 Contents vii Challenge: Visualize the Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .126 Hint: Position the Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .126 Hint: Show the Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .127 Hint: Indicate the Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .127 Hint: Log the Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .128 Example Solution: Visualize the Interaction . . . . . . . . . . . . . . . . . . . . . .128 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .147 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .147 5. A Group of Heroes 149 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150 Challenge: Swap the Leader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150 Hint: Detect Collisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152 Hint: Store Group Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152 Hint: Toggle the Leader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152 Example Solution: Swap the Leader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153 Challenge: Follow the Leader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157 Hint: Revise Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .158 Hint: Design the Movement Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .158 Example Solution: Follow the Leader . . . . . . . . . . . . . . . . . . . . . . . . . . . .159 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170 6. Save the Day 171 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172 Challenge: Save and Load Game Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172 Hint: Create the Save Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173 Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174 MonoBehaviour and Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 Custom Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175 Hint: Manage the Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176 Hint: Update the Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181 Example Solution: Save and Load Game Data . . . . . . . . . . . . . . . . . . . . .181 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .188 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189 7. Design Your World 191 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192 Challenge: Implement Your Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192 Hint: Think about Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192 Dragons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .193 Drakes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194 viii Contents Knights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194 Heroes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194 Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195 Hint: Think about Scenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195 Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195 Dungeon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195 Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197 Hint: Think about Win Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198 Example Solution: Implement Your Design . . . . . . . . . . . . . . . . . . . .198 Game Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198 Game Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .199 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .217 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .217 8. A Proper Introduction 219 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .219 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .220 Challenge: Create a Loading Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .220 Hint: Preload Critical Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .220 Hint: Design the Loading Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .221 Example Solution: Create a Loading Screen . . . . . . . . . . . . . . . . . . . . . . .222 Challenge: Create a Main Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225 Hint: Listen for User Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225 Hint: Design the Main Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .226 Example Solution: Create a Main Menu . . . . . . . . . . . . . . . . . . . . . . . . . .226 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228 Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228 9. A Proper Transition 229 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .230 Challenge: Fade the Screen In and Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . .230 Hint: Apply the Texture Technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .231 Hint: Manage the Texture’s Alpha Transparency . . . . . . . . . . . . . . . . . .232 Example Solution: Fade the Screen In and Out . . . . . . . . . . . . . . . . . . . .233 Challenge: Ease the Fade Transition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .242 Hint: Select an Easing Equation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .243 Hint: Apply an Easing Equation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .243 Example Solution: Ease the Fade Transition . . . . . . . . . . . . . . . . . . . . . 244 Challenge: Coordinate the Timing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .250 Hint: Use Time-Based Scene Transitions . . . . . . . . . . . . . . . . . . . . . . . . .250 Hint: Be Aware of Unexpected Gameplay Events . . . . . . . . . . . . . . . . . .251 Example Solution: Coordinate the Timing . . . . . . . . . . . . . . . . . . . . . . . .252 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .257 Contents ix 10. The World Is in Motion 259 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260 Challenge: Slice the Sprite Sheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260 Hint: Slice the Sprite Sheet into Frames . . . . . . . . . . . . . . . . . . . . . . . . . .260 Hint: Integrate the Sprite Slicer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261 Example Solution: Slice the Sprite Sheet . . . . . . . . . . . . . . . . . . . . . . . . . .261 Challenge: Create a Frame Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267 Hint: Use Frame Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267 Hint: Provide Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268 Hint: Execute the Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268 Example Solution: Create a Frame Animation . . . . . . . . . . . . . . . . . . . .268 Challenge: Manage Multiple Animations . . . . . . . . . . . . . . . . . . . . . . . . . . .276 Hint: Manage Characters’ Animations . . . . . . . . . . . . . . . . . . . . . . . . . . .277 Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .277 Hint: Implement the Character Animator . . . . . . . . . . . . . . . . . . . . . . . .278 Hint: Integrate the Character Animator . . . . . . . . . . . . . . . . . . . . . . . . . .279 Example Solution: Manage Multiple Animations . . . . . . . . . . . . . . . . . .279 Challenge: Apply the Animations . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288 Hint: Think about Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288 Hint: Think about Interactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289 Example Solution: Apply the Animations . . . . . . . . . . . . . . . . . . . . . . . .289 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .297 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .297 11. The World Can Be Heard 299 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .299 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 Challenge: Manage Music and Sound Effects . . . . . . . . . . . . . . . . . . . . . . . 300 Hint: Use Sources and Clips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 Hint: Implement the Audio Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . .302 Example Solution: Manage Music and Sound Effects . . . . . . . . . . . . . . .303 Challenge: Apply Music and Sound Effects . . . . . . . . . . . . . . . . . . . . . . . . . .314 Hint: Think about Scenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .315 Hint: Think about Interactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .316 Example Solution: Apply Music and Sound Effects . . . . . . . . . . . . . . . .316 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .325 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .325 12. Celebrate Victory 327 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .327 Required Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328 Challenge: Create a Win Scene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328 Hint: Create the Win Scene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328 x Contents