Vielen Dank für Ihren Besuch. Diese Seite ist momentan nur auf Englisch verfügbar. Wir arbeiten an der deutschen Version. Vielen Dank für Ihr Verständnis.
Appstore Blogs Appstore DeveloperBlog /blogs/appstore/feed/entries/atom 2018-02-20T23:33:20+00:00 Apache Roller /blogs/appstore/post/c3bb924b-e93f-4147-8f55-42fd34ad98bf/29-tips-to-make-the-most-out-of-your-next-conference 29 Tips to Make the Most Out of Your Next Conference Emily Esposito Fulkerson 2018-02-20T19:54:32+00:00 2018-02-20T23:33:20+00:00 <p><img alt="Opt1.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Events/Opt1._CB503197530_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> Here are my tips to get the most out of your next conference, broken down into three parts: prep work before you go, what to do while you’re there, and how to follow up effectively.</p> <p><img alt="Opt1.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Events/Opt1._CB503197530_.png?t=true" style="display:block; height:320px; margin-left:auto; margin-right:auto; width:800px" /><br /> Going to a conference isn’t cheap. Even if you get a free pass to a conference, you’ll need to take time off and spend money on room and board while you’re there.</p> <p>The good news? The upside can be potentially transformative. Finding investors or publishers, meeting an individual who ends up being incredibly valuable, learning something you didn’t even know you didn’t know…</p> <p>But, there is a catch. You can’t just show up at a conference and expect to get value. You’ve got to do some homework. In my experience, the value you get from a conference is directly proportional to the work you put into it.</p> <p>Here are my tips to get the most out of your next conference, broken down into three parts: prep work before you go, what to do while you’re there, and how to follow up effectively.</p> <h2>Preparation before the conference&nbsp;</h2> <p><u><strong>Have goals&nbsp;</strong></u></p> <p>What do you want to get out of the conference? If you can’t think of something, don’t go. It’s not enough to say you want to “stay open to possibilities.” I don’t know many developers who have been successful at a conference that way.</p> <p>If you’re looking for a place to start with goals, here are some ideas worth considering:<br /> &nbsp;</p> <ul> <li><strong>Meet a publisher or investor</strong>. Make yourself known and set up a follow up meeting. (Don’t expect to ink a deal at the conference. Typically, that happens later.)<br /> &nbsp;</li> <li><strong>Enter an indie game competition</strong>. It’s a great way to get exposure to influential folks in the industry and maximize exposure for your game. You may even get to showcase your game at the conference!<br /> &nbsp;</li> <li><strong>Get a mentor</strong>. Folks in our industry love to help each other. Meet folks at the mixers and parties. You may hit it off with a fantastic mentor who can help a lot. Make sure to have a clear ask on what you want to be mentored on.<br /> &nbsp;</li> <li><strong>Learn how to</strong>… Increase downloads, conversions, ad revenue, etc. There will typically be talks covering just about anything you want to learn more about. There are also a ton of vendors who would be happy to help, and even other developers will likely share what they’ve learned. Remember to check session attendance against your goals.<br /> &nbsp;</li> <li><strong>See your competition.</strong> It’s possible that the games competing for your potential players'&nbsp;attention are much better than you had thought. Do you need to change project goals to be competitive or are you setting the bar in your category?<br /> &nbsp;</li> </ul> <p><strong><u>Create a meeting strategy</u></strong></p> <p>Based on your goals for the conference, you should have a good idea who you want to meet with. If not, most conferences will have a list of attendees, so you can look through the list to help you find people to meet with. Do this early, as folks’ calendars fill up quickly.</p> <p>Here are some tips for setting meetings:<br /> &nbsp;</p> <ul> <li>When setting a meeting via email or a conference system, be sure to include a concise ask. For example, “I’d like to show you my game in development and discuss if there is a potential publishing arrangement for Q3 2018.”<br /> &nbsp;</li> <li>Avoid scheduling or accepting un-needed meetings. Remember your goals, and be respectful of the time of others.<br /> &nbsp;</li> <li>Be location-aware.&nbsp;Not all meetings are at the conference center.<br /> &nbsp;</li> <li>Confirm meetings two days prior to the conference.<br /> &nbsp;</li> </ul> <p>Give yourself time to process the last meeting before your next meeting. Make sure you finish your notes and leave time to travel to your next meeting. The worst mistake I made was to book meetings back to back. If they ran short, I was okay. But few ran short.</p> <p><strong><u>Prepare for your demo&nbsp;</u></strong></p> <p>Do you plan on doing a demo of your game? If so, here are some things to think about <em>before </em>you arrive at the conference.<br /> &nbsp;</p> <ul> <li><strong>Have a quick reset build available</strong>. It should take seconds to make your game demo ready for the next player.<br /> &nbsp;</li> <li><strong>Know what you want to showcase.</strong> You could choose to highlight amazing art, clever monetization mechanics, engaging game loop, or original game mechanics. <ul> <li>Create your demo build to show off that aspect of the game. Publishers probably want to see a fun loop that can be monetized. Investors may want to see you have an outstanding artist on staff. Prize voters (game judges)&nbsp;may want to see originality and creativity.</li> <li>Don’t forget to check this against your conference goals.<br /> &nbsp;</li> </ul> </li> </ul> <p>If all of this sounds like a lot of work, it’s true. And if you also need to staff a booth where you are showcasing your game, you may want to consider taking someone with you to the conference. Just make sure you have assigned tasks that they can do on their own while you concentrate on your own tasks.</p> <h2>At the conference&nbsp;</h2> <p>Smile! Say hello to strangers. The least productive attendees spend the conference sitting down, staring at their phone just waiting for someone to come up and talk to them. That almost never happens. Instead, stand up, smile, and greet people. Every person you talk to is an opportunity to practice your elevator pitch! You never know who you might meet this way.</p> <p><strong><u>Manage your meetings well</u></strong></p> <p>A well-prepared dev will always impress more than one who is disorganized. Here’s how to give a great first impression while being practical at the same time.<br /> &nbsp;</p> <ul> <li><strong>Print a hard-copy of your schedule</strong>. WiFi at conferences rarely works as well as you like, and never as well as you need.<br /> &nbsp;</li> <li><strong>Come prepared</strong>. Bring cards, pen and paper, but also research on the company you’re meeting with. Little is quite as embarrassing as asking for a meeting, only to learn that you don’t really understand what they do.<br /> &nbsp;</li> <li><strong>Take notes</strong>. You never remember as much as you think you will.<br /> &nbsp;</li> <li><strong>Make sure you get their business cards</strong>. This is critical for spelling and title accuracy when you follow up.<br /> &nbsp;</li> </ul> <p><strong><u>Demo your game</u></strong></p> <p>The first step is optimizing for your typical demo space. Rarely will the space available have bandwidth that makes your game look good. Consider this as you prepare the demo you want to show. If you are showcasing your game in conjunction with a competition, you’ll likely have a table to demo from. Yay! If not, you may need to optimize for two people standing next to each other in the middle of a crowd. In either case, showing off your audio will require headphones (don’t share earbuds. Gross.) So how do you get people to stop and play?<br /> &nbsp;</p> <ul> <li><strong>Ask people if they want to play your game</strong><br /> &nbsp;</li> <li><strong>Be able to describe it in two sentences</strong> <ul> <li>“It’s a match-3 game where you can move the board 90 degrees and cause a big reset!”</li> <li>“It’s a puzzle game set inside a text adventure. You get clues to the puzzles as you go farther through the adventure.”</li> <li>“It’s a first-person shooter where you attack with clever insults and defend with witty comebacks instead of using bullets and shields.”<br /> &nbsp;</li> </ul> </li> </ul> <p>Here is how to make sure players have a good experience once they stop to play your game:<br /> &nbsp;</p> <ul> <li><strong>Have the game ready to go</strong>. No waiting rocks!<br /> &nbsp;</li> <li><strong>Let your guest play the game</strong>. Don’t play it for them.<br /> &nbsp;</li> <li><strong>Offer influencers a copy of your game</strong>. You want to help them play, write, and talk about your game as much as possible.<br /> &nbsp;</li> <li><strong>Ask for their business cards.</strong><br /> &nbsp;</li> </ul> <p><strong><u>Other useful hints</u></strong><br /> &nbsp;</p> <ul> <li><strong>Introduce people to each other</strong>, and include context for the introduction. Both parties will remember the introduction with context favorably.<br /> &nbsp;</li> <li><strong>Check in on your staff occasionally. </strong>Not only to help them stay on-task, but to gather any hot leads or connections that you should act on quickly.<br /> &nbsp;</li> <li><strong>Remember your conference goals!</strong><br /> &nbsp;</li> </ul> <h2>Follow up</h2> <p>Every bit as important as preparation and execution, follow up is where business is conducted. Schedule time in your calendar for follow up. I am typically able to schedule two days to devote to following up, and it’s never enough.</p> <p>Here are some things that people appreciate:<br /> &nbsp;</p> <ul> <li><strong>Provide a lot of context in your follow up mail</strong>. They may not remember you, but don’t be offended. They probably met 100 devs just like you. A detailed follow-up will differentiate you from the rest.<br /> &nbsp;</li> <li><strong>List deliverables (yours and theirs)</strong>. It’s why you need to send the follow-up mail, after all.<br /> &nbsp;</li> <li><strong>Add the people you met on social media.&nbsp;</strong>Use a custom greeting, not the default note. You want your contact to feel special.<br /> &nbsp;</li> <li><strong>Record all your notes in one place. </strong>Make sure all the information you gathered gets recorded in one searchable place (CRM, Excel, whatever).</li> </ul> /blogs/appstore/post/57f6a789-6acc-4c4b-911c-3a11baf42938/webinar-the-case-for-competitive-gaming Webinar: The Case for Competitive Gaming Emily Esposito Fulkerson 2018-02-19T20:31:26+00:00 2018-02-19T20:31:26+00:00 <p><img alt="blog.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Webinars/blog._CB502883862_.jpg?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> When we think of competitive gaming, our minds go immediately to eSports. However, competitive gaming is much more than eSports. In this webinar, we’ll explore the growth behind eSports and what this means for you.</p> <p><img alt="blog.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Webinars/blog._CB502883862_.jpg?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> When we think of competitive gaming, our minds go immediately to eSports. However, competitive gaming is much more than eSports. Any time you play against another person, you are participating in a competitive game. Humans are wired for competition, and this creates a big opportunity for game developers.</p> <p>In this webinar, we’ll explore the growth behind eSports and what this means for you. You’ll learn about:</p> <ul> <li>Who is watching and playing competitive games</li> <li>eSports revenue and where competitive gaming is taking off</li> <li>Best practices to take advantage of competitive gaming</li> </ul> <p>We are offering two sessions of this webinar on Tuesday, February 27, 2018: 7:00 a.m. PST and 1:00 p.m. PST. Sign up today to reserve your spot!<br /> &nbsp;</p> <p><a href="https://goto.webcasts.com/starthere.jsp?ei=1182797&amp;tp_key=54ff7b1ac2" target="_blank"><img alt="" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/7AM_Webinar_Button._CB528958595_.png" style="display:block; height:50px; margin-left:auto; margin-right:auto; width:200px" /></a><a href="https://goto.webcasts.com/starthere.jsp?ei=1182790&amp;tp_key=8a4fa6af85" target="_blank"><img alt="" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/1PM_Webinar_Button._CB528958592_.png" style="display:block; height:50px; margin-left:auto; margin-right:auto; width:200px" /></a></p> /blogs/appstore/post/2b029753-4cf9-4baf-84a5-5494046c1744/case-study-atom-tickets-teams-up-with-amazon-to-fuel-the-fun-at-the-movies Case Study: Atom Tickets Teams Up with Amazon to Fuel the Fun at the Movies Emily Esposito Fulkerson 2018-02-15T22:39:33+00:00 2018-02-15T22:40:13+00:00 <p style="text-align:center"><img alt="lower_banner_width_720.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/CaseStudies/lower_banner_width_720._CB502352411_.jpg?t=true" /></p> <p>Atom Tickets uses Login With Amazon and Amazon Pay services to simplify and streamline use of the app. The services enable Atom Tickets’ web and mobile app users to log in and pay with the trusted source they already use for other online shopping.</p> <p style="text-align:center"><img alt="upper_for-blog-2.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/CaseStudies/upper_for-blog-2._CB502498458_.jpg?t=true" style="height:233px; width:600px" /></p> <p><br /> Atom Tickets’ intuitive service is all about great user experience: easy planning with friends and family; simple payment and cost sharing; the ability to walk right past concession and entry lines. Atom Tickets users get to sit back and enjoy the show.</p> <p>The company’s obsession with creating unsurpassed customer experiences inspired collaboration with Amazon. Atom Tickets uses Login With Amazon and Amazon Pay services to simplify and streamline use of the app. The services enable Atom Tickets’ web and mobile app users to log in and pay with the trusted source they already use for other online shopping.<br /> &nbsp;</p> <p><img alt="middle_for-blog-2.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/CaseStudies/middle_for-blog-2._CB502498456_.jpg?t=true" style="display:block; height:23px; margin-left:auto; margin-right:auto; width:600px" /><br /> <br /> The benefits to users, theaters, and Atom Tickets are clear. Easier login and payment saves time and effort, allowing users to focus on the social experience. Users can also be confident that their personal and payment information is secure.</p> <p>With Amazon services, Atom Tickets has seen a 20% higher average order value and a massive 62% drop in cancellations for orders placed, while its theater chain customers have benefited from an 8% increase in tickets sold per order.<br /> &nbsp;</p> <p style="text-align:center"><a href="http://developer.amazon.com/login-with-amazon" target="_blank"><img alt="new-button-dark.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/CaseStudies/new-button-dark._CB502554361_.png?t=true" style="height:65px; width:260px" /></a><br /> &nbsp;</p> <p style="text-align:center"><img alt="bottom_for-blog-2.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/CaseStudies/bottom_for-blog-2._CB502498463_.jpg?t=true" style="height:233px; width:600px" /></p> /blogs/appstore/post/b6c0a06c-22bb-4b73-979f-18e6860a0248/tips-for-making-a-twitch-friendly-mobile-game-part-2 Tips for Making a Twitch-Friendly Mobile Game (Part 2) Emily Esposito Fulkerson 2018-02-09T17:48:53+00:00 2018-02-19T20:23:45+00:00 <p><img alt="Twitchfriendly-heroimage1.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/SAposts/Twitchfriendly-heroimage1._CB488127431_.jpg?t=true" style="display:block; height:385px; margin-left:auto; margin-right:auto; width:800px" /></p> <p>In this post, I'll talk about making your game technically easy for broadcasters to stream your game and how to enable compelling content.&nbsp;</p> <p><img alt="Twitchfriendly-heroimage1.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/SAposts/Twitchfriendly-heroimage1._CB488127431_.jpg?t=true" style="display:block; height:385px; margin-left:auto; margin-right:auto; width:800px" /></p> <p>Hello again and welcome to the second part of my series on how to make Twitch-friendly mobile games. Click <a href="https://developer.amazon.com/blogs/appstore/post/eb803901-9969-4eb6-9c6b-ae9d2d442e31/tips-for-making-a-twitch-friendly-mobile-game-part-1" target="_blank">here</a> to read my first post on whether or not you need to integrate a streaming SDK.&nbsp;</p> <p>In this post, I'll talk about making your game technically easy for broadcasters to stream your game and how to enable compelling content.&nbsp;</p> <p>While there shouldn’t be a need for a game developer to invest a lot of engineering work to make their mobile game ready to be shown on Twitch, technical decisions <em>can</em> dramatically affect how easy it is for a broadcaster to stream a game. And while Twitch streamers will often go a long way to accommodate content that they think is compelling, reducing the amount of friction needed to add your game can only increase its appeal.</p> <h2>Tip: DO make it technically easy for a broadcaster to stream your game – and for a fan to watch it!</h2> <p>As I mentioned&nbsp;earlier, streaming gameplay is simply one part of the entire experience that a streamer builds. But that doesn’t mean that the gameplay is not central to the stream – it should be – and you need to make it easy for a broadcaster to show your game.</p> <p>What are the common ways for mobile games to be streamed?</p> <ul> <li><strong>Emulators</strong>: An Android emulator is an easy, no-extra-hardware-required way for broadcasters to include a mobile game into their stream. There are now quite a few emulators available for PCs, but the nature of emulators is that they don’t always act exactly like a phone or a tablet. In my experience, there are a surprising number of mobile games that aren’t emulator-compatible, often because of differences with how the emulators handle file storage. To be as Twitch-friendly as possible, you should test your game on the most common emulators just as you do the most common mobile devices.</li> <li><strong>Screen capture software</strong>: In this method, users&nbsp;use&nbsp;software on their mobile device to stream to their streaming machine. The advantage is that this doesn’t require any additional hardware, other than a mobile device, and the game is running natively. The downside is that the screen capture and streaming software require&nbsp;a good chunk of processor speed, which can impact the performance of the game.</li> <li>“<strong>Spectator mode:&quot;&nbsp;</strong>Another way that streamers can get mobile gameplay into their stream is by using Spectator Mode on another device. This approach is more common for productions displaying other people’s displays (such as with eSports broadcasts), but can also be a method for individual streamers.</li> <li><strong>Screen capturing hardware: </strong>Probably the best option for the Twitch streamer, this simply shows what is&nbsp;displayed on the mobile device. The game can run natively, there is no impact on the performance of the game, and there are no compatibility issues on the streamer’s machine.</li> </ul> <p>Certain technical design decisions can also impact how appealing a mobile game is for a broadcaster:</p> <ul> <li><strong>Orientation</strong>: Landscape mode matches the orientation of a Twitch broadcast, while portrait orientation requires an overlay to make different use of the screen.</li> <li><strong>Legible graphics</strong>: Large, distinctive graphic design makes your gameplay easier to see on a small screen (especially important if you need portrait orientation).</li> <li><strong>No audio locks</strong>: Mobile game fans often watch Twitch on their mobile device, and they often will listen to a stream in the background while playing the game. A Twitch-friendly mobile game should allow for this use case by not requiring audio or letting other audio play in the background.</li> </ul> <p>The overall strategy should be to understand what streamers need to do to build a real stream – beyond the simple broadcast of gameplay – and see how the game can enable their success.</p> <p>Of course, technical issues are not the only concern (or even a prime concern!) for a content creator.&nbsp;Content creators are in the business of telling a story and putting on a show, and it’s much easier to do that if they’re highlighting something that is fun to watch.</p> <h2>Tip: DO enable compelling content</h2> <p>For a game to be appealing to Twitch streamers, it must be a game that allows for compelling, or at least interesting, content for a stream. While it’s impossible to define exactly what defines “interesting content” on Twitch (and one of the great parts of Twitch is that there’s something for almost everyone), the mobile games that are popular on Twitch share some similar traits. Here are some of my tips:</p> <ul> <li><strong>Play well with others</strong>. Twitch streams thrive on interactivity, and features that help streamers play with their viewers, like PvP or co-op modes, enable them to interact with their community.&nbsp;</li> <li><strong>Skill matters: </strong>Games that let broadcasters show off their abilities are always popular on Twitch. From speed-running console games to showing off in hardcore “high skill cap” PC games, broadcasters love showing off how good they are. Is there a mode or a design in your game that lets streamers showcase their skill?</li> <li><strong>Be global: </strong>The audience for game content is incredibly global, and the game should match that availability. Streamers won’t want to show a game if it’s not available in large sections of the world that are important to their audience.</li> <li><strong>People love surprises: </strong>Don’t underestimate the appeal of opening a surprise gift! While people may debate what place random boxes, crates, or other “GACHA” mechanics should have in video games, the fact of the matter is that people love watching these random loot items being opened… ESPECIALLY if the audience didn’t have to pay for it!</li> </ul> <p>Content creators are very busy, and as a game developer, you already know that creating something for other people is not easy. Making it easier to use your game and making sure that there are elements that “show well” only increases the chances that your game will become something that other people will want to show off.</p> <p>In part three&nbsp;of this series, I will discuss ways that you can engage and promote your content creating community.</p> <h2>More reading</h2> <ul> <li><a href="https://developer.amazon.com/blogs/appstore/post/eb803901-9969-4eb6-9c6b-ae9d2d442e31/tips-for-making-a-twitch-friendly-mobile-game-part-1" target="_blank">Tips for Making a Twitch-Friendly Mobile Game (Part 1)</a></li> </ul> <p>&nbsp;</p> /blogs/appstore/post/e355260d-ffed-4807-8f62-25dd0c8164f4/gamemaker-basics-parenting-and-inheritance GameMaker Basics: Parenting and Inheritance Emily Esposito Fulkerson 2018-02-07T20:34:17+00:00 2018-02-07T20:34:17+00:00 <p><img alt="Parenting_Nathan_image2.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/Parenting_Nathan_image2._CB490584258_.gif?t=true" style="display:block; height:278px; margin-left:auto; margin-right:auto; width:700px" /></p> <p>It’s me again, back with yet another GameMaker basics tutorial, this time about&nbsp;parenting and inheritance.&nbsp;You can save a lot of time by creating a parent enemy object, which has common variables and code that all of your enemies may need, and passing it down.</p> <p><img alt="Parenting_Nathan_image2.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/Parenting_Nathan_image2._CB490584258_.gif?t=true" style="display:block; height:278px; margin-left:auto; margin-right:auto; width:700px" /></p> <p>Howdy folks! It’s me again, back with yet another GameMaker basics tutorial, this time about&nbsp;parenting and inheritance. A parent object is able to pass its code down to child objects, which then run the parent code as if it were their own. You can save a lot of time by creating a parent enemy object, which has common variables and code that all of your enemies may need, and passing it down. This is exactly what we will be doing in this example.</p> <h1>Parent set up</h1> <p>The first thing we need to do is create the actual parent object. This object will not need to exist in the actual game itself, because it will only be passing its code to objects that will exist in the game. Create a new object and name it <strong>parentEnemy</strong>. This object does not need to have a sprite. Add the <strong>create event</strong> and <strong>step event</strong>, and let's&nbsp;add some code.</p> <p><strong>parentEnemy create event</strong></p> <pre> <code>life = 5; dead = false;</code></pre> <p><strong>parentEnemy step event</strong></p> <pre> <code>if(life &lt;= 0){ dead = true; } if(dead){ instance_destroy(); }</code></pre> <p>In the <strong>create event</strong> we are initializing two variables. <strong>Life</strong> is the amount of health/hp our enemy will have, and <strong>dead</strong> is a boolean that lets us define what happens when the enemy’s life reaches zero. In this case, we are just going to destroy the object.</p> <p>Now we need to create an enemy object to pass this code to. Create a sprite of some kind for your new enemy, it doesn’t matter what it looks like, and then create a new enemy object. Assign a sprite to this new enemy object, and set the parent to <strong>parentEnemy</strong>.</p> <p><img alt="Parenting_Nathan_Image1.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/Parenting_Nathan_Image1._CB490584256_.png?t=true" style="display:block; height:341px; margin-left:auto; margin-right:auto; width:728px" /></p> <p>Finally, add the <strong>create event</strong>, <strong>step event</strong>, and <strong>draw event</strong>.</p> <h1>Child set up</h1> <p>Now we are ready to pass our code from the parent to the new object, which will be referred to as the child object from here on out.</p> <p><strong>Child object create event</strong></p> <pre> <code>event_inherited();</code></pre> <p><strong>Child object step event</strong></p> <pre> <code>event_inherited(); if(mouse_check_button_pressed(mb_left)){ life --; }</code></pre> <p><strong>Child object draw event</strong></p> <pre> <code>draw_self(); draw_text(x,y - sprite_height, life);</code></pre> <p>By calling the <strong>event_inherited</strong> function, the code from the parent object is passed down. It is important to call this function in each event the child object shares with the parent object. So, since we have a create event, and step event in the parent and child, we have to call <strong>event_inherited</strong> in the child <strong>in both events</strong>. If our child object did <strong>not</strong> have one of the same events as the parent, let's&nbsp;say step event for example, the child will automatically inherit the step event code from the parent. Just something to keep in mind.</p> <p>The last bit of code up there for the draw event is mostly for debug purposes. We are drawing the <strong>life</strong> variable to the screen, so we can see it deplete when we click the mouse button. If you run the game now, and click the mouse, your enemy life should deplete to zero and then be deleted.</p> <p><img alt="Parenting_Nathan_image3.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/Parenting_Nathan_image3._CB490584285_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p style="text-align:center">&nbsp;</p> <h1>Overwriting inherited code</h1> <p>There may be times when your child objects do not need to inherit all of the parents code, or you need to make changes to the code that is being inherited. Let's say you want one of your enemies to have ten life, instead of five that it is inheriting. To overwrite the inherited variable, all you need to do is re-initialize that variable after you call <strong>event_inherited</strong>.</p> <p><strong>Child object create event</strong></p> <pre> <code>event_inherited(); life = 10;</code></pre> <p><img alt="Parenting_Nathan_image2.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/Parenting_Nathan_image2._CB490584258_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p>Each enemy has a different life variable, and is still a child of the parentEnemy object.</p> <p>For step events, and code that runs every frame, it can be a little different. For example, if we had this code in both the parent and the child…</p> <pre> <code>if(mouse_check_button_pressed(mb_left)){ life --; }</code></pre> <p>… and the child was inheriting from the parent, then every time we clicked the mouse the <strong>life</strong> variable would be reduced by two, rather than one. It’s best to avoid any duplicate code in the parent and child object. But, what do you do if you don’t want the child to inherit part of the parent code? It's&nbsp;as easy as not calling <strong>event_inherited</strong> in the child event. The best practice here is to try to give the parent code that you are absolutely sure the child will need.</p> <h1>Closing comments</h1> <p>That about wraps it up for parenting and inheritance. As you can see this is a very convenient and powerful tool that will help you manage your objects, and cut down on redundant code. Thank you for taking the time to read over this, and I’ll catch you next time. As always, you can reach me on <a href="https://www.twitter.com/ratcasket" target="_blank">Twitter</a> or visit my <a href="http://www.ratcasket.com/" target="_blank">website</a> for more gamedev stuff.</p> <p>Thank you!</p> <div> &nbsp; </div> <p style="text-align:center"><a href="https://www.twitter.com/ratcasket"><img alt="NathanRBio.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/NathanRBio._CB513300692_.jpg?t=true" /></a></p> <p style="text-align:center"><em>Nathan Ranney is the founder of punk house game dev shop, <a href="http://www.ratcasket.com" target="_blank">RatCasket</a>. He’s best known for the creation and development of Kerfuffle, an online indie fighting game.</em></p> /blogs/appstore/post/8731aea0-68ad-4702-af95-343237a78e7e/advanced-debugging-and-profiling-in-gamemaker-studio-2 Advanced Debugging and Profiling in GameMaker Studio 2 Emily Esposito Fulkerson 2018-02-02T00:04:04+00:00 2018-02-02T00:04:04+00:00 <p><img alt="debuggingarticle2image11.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debuggingarticle2image11._CB486666848_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> In my <a href="https://developer.amazon.com/blogs/appstore/post/e7fba237-aa17-46a5-bcf4-f7228a3107d1/debugging-with-gamemaker-studio-2" target="_blank">last post</a>, I explained my process when debugging games and some tips to find bugs quickly and identify bottlenecks in your game. In this post, I'll cover some more advanced debugging techniques and also talk about profiling your game.</p> <p><img alt="debuggingarticle2image11.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debuggingarticle2image11._CB486666848_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> In my <a href="https://developer.amazon.com/blogs/appstore/post/e7fba237-aa17-46a5-bcf4-f7228a3107d1/debugging-with-gamemaker-studio-2" target="_blank">last post</a>, I explained my process when debugging games and some tips to find bugs quickly and identify bottlenecks in your game. In this post, I'll cover some more advanced debugging techniques and also talk about profiling your game.</p> <h2>Debugging draw events and surfaces</h2> <p>These are probably my favorite set of tools, since I work with surfaces and draw code a lot. I’m talking specifically about the <strong>Render States</strong> and <strong>Surfaces &amp; Textures</strong> windows. In render states, you have all the different variables that determine how each object is changed before being drawn. Each of these variables has a function associated with it to change their values, so I will not cover those, but it’s good to know you can check the current state of all of them if you need to.<br /> &nbsp;</p> <p><img alt="debugging-post2-image1(1).gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debugging-post2-image1(1)._CB486666601_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> We then have the <strong>Surfaces &amp; Textures</strong> window, which is divided in two sections, one for each. When you have a GameMaker project, your sprites are merged and put into what is called Texture Pages. The reason why GameMaker does this is to avoid sending hundreds of images to the GPU, one for each sprite, or even one for each frame of each animation of the sprite.</p> <p>Instead, GM sends the GPU a big texture page and the coordinates of each sprite you want to draw. This makes the process a lot faster if used correctly. What I mean&nbsp;is that it is in your best interest to get into the habit of grouping sprites you know will appear together (such as enemies and tilesets from a specific level or world) into their own texture group. When you do this, GameMaker will do its best to group those sprites together into the same texture page, which makes it so we don’t have to send too many textures to the GPU and the game runs faster.</p> <p>In my example below, I didn’t do this, which is why you can see a mess of sprites that don’t belong together in each page. It also created huge loading times for me, as GameMaker has to create all texture pages in the texture group when you change as single sprite in it, which was default in my case for every single one. Don’t make the same mistakes I did.</p> <p>If you are in the Textures tab, you can see all your texture pages. If they are not showing up, just click on the refresh icon and they should appear. Then, you can hover over any of the images to see an enlarged version and check that the sprites you want grouped together are in the same page.<br /> &nbsp;</p> <p><img alt="debugging-post2-image2.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debugging-post2-image2._CB486667956_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> The second part to this window is the Surface one. It works the same way as the Texture section, but instead it shows all the current surfaces, including the application surface (where everything is drawn to). The refresh button is a lot more important in this section, as surfaces can change between frames, so always to remember to refresh so you know for sure you are looking at the latest version of each surface.</p> <p>Because surfaces are created at run-time, sometimes it’s hard to know if what you think should be drawn is actually what’s being drawn. With this tool, you can easily check that the surfaces created have the correct size and information drawn on it, and even debug it when you are composing multiple surfaces and shaders together to create an effect, like I did with HackyZack’s book menu.</p> <p>Below you can see an example of all the different surfaces that had to be created to draw the book and all the stickers, player, cursor, etc.<br /> &nbsp;</p> <p><img alt="debuggingarticle2image3.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debuggingarticle2image3._CB486666587_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <h2><br /> Miscellaneous debug windows</h2> <p>I’ve covered most of the tools provided by the debugger, but a few don’t fall into any previous category, so I will quickly mention them now. The first is the <strong>Call Stack</strong> window. Previously I talked about the call stack, and this is a visual representation of it. The cool feature is that you can double-click on any entry in the stack and it will take you to the part of the code where this specific script was called from. This is especially useful when trying to figure out which object or event called a script used in multiple places throughout your code.<br /> &nbsp;</p> <p><img alt="debugging-post2-image4(1).gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debugging-post2-image4(1)._CB486666619_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> Another cool little window you can display with the debugger is the <strong>Graph</strong>. This handy tool shows you important performance information about your game, such as the current and average FPS and Memory values. You may also notice a few vertical lines in the graph, the white ones being events called by the user (using the functions <strong>show_debug_message()</strong> and <strong>debug_event</strong>), and the blue ones being system events. If you hover on these lines, you will see more detailed information about what happened at that point, which is useful if you notice that the line aligns perfectly with a memory spike or an FPS drop.<br /> &nbsp;</p> <p><img alt="debugging-post2-image5.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debugging-post2-image5._CB486667953_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> The last window I wanted to mention is for <strong>Buffers</strong>. I will admit that I’ve never used buffers in GameMaker, so I don’t have a good example of what it looks like nor how useful it can be. However, I know it is essentially a hex editor for a buffer, which you select by specifying the id. You can also select the alignment and how the data is displayed by clicking on the burger icon at the bottom right, or by right clicking anywhere on the window.<br /> &nbsp;</p> <p><img alt="debugging-post2-image6.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debugging-post2-image6._CB486666529_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> That is all for the debugger portion of this article! We have one more topic to cover before we are done, which is profiling your game.</p> <h2>Using the profiler</h2> <p>In the <strong>Other</strong> tab, you will find the <strong>Profiler</strong> window. This tiny box has a lot of information and functionality to go through, so let’s get started. To profile your game, all you need to do is start the game with the debugger attached (F6) and get to the section of the game you want to test. It is advised to test sections separately as you will gather a ton of data and it’s easier to understand what’s going on if you approach it a chunk at a time. For example, you may want to test your menus first, then your normal levels, then a specific boss fight. This separates the sets of data, making it easier to digest and analyze. When we are ready, all we have to do is press <strong>Start Profiling</strong> and GameMaker will collect data. Likewise, when you feel you have collected enough data, you can press <strong>Stop Profiling</strong> and the information will stay intact for you to parse through.<br /> &nbsp;</p> <p><img alt="debugging-post2-image7.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debugging-post2-image7._CB486666553_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> As you may notice, there is a ton of information being provided, which is good. With the current settings, the profiler will list each event being run by every instance in the room. Next, it shows three values, which are the average number of times that event is called each frame, the time (in Ms) it takes to execute that event, and the percentage of the frame that event takes. We can also get the total value of these three values instead of the average, by just unchecking the <strong>Average Values</strong> box.<br /> &nbsp;</p> <p><img alt="debuggingarticle2image8.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debuggingarticle2image8._CB486666855_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> You may have noticed that each event also has a plus sign next to it to show more information. If we open it up, it will give us a more detailed look at every function call performed inside of that event, providing the same three values broken down into smaller pieces.<br /> &nbsp;</p> <div> <img alt="debugging-post2-image9.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debugging-post2-image9._CB486666554_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> &nbsp; </div> <div> Now, if this mode is useful to determine if a specific instance or event is taking up too much time in the frame, but what if we want to know how much time is being used up by a script or function? We can then change the view mode from <strong>Top-Down</strong> to <strong>Bottom-Up</strong>. In this mode, we will see each function and script displayed, and the information that can be expanded will be the specific event that is calling that function. <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="debuggingarticle2image10.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debuggingarticle2image10._CB486666854_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> &nbsp; </div> <div> The last dropdown we can interact with determines if we want to profile only calls made in our code, the engine calls, or both at the same time. If we select engine, we will see how long it takes to do a step, how long we spending drawing the room, and information of the sort. In the combined view, we see similar information, and to access our calls, we can expand the individual events (HandleStep, HandleAlarm, DrawTheRoom, for example) to see it. <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="debuggingarticle2image11.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/debuggingarticle2image11._CB486666848_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> <br /> <br /> Finally, a note I wanted to add is that GameMaker, by default, uses a framerate controller that automatically stops the execution of the game when it finished doing all its operations, capping the framerate to what we set the room speed to be. Typically, games run at 30 FPS or 60 FPS, so if we do some math, we conclude that a game running at 30 FPS needs to finish every frame in <strong>one&nbsp;second / 30 frames</strong>, which is <strong>0.0333</strong> <strong>seconds</strong>, or <strong>33 Ms</strong>. For a 60 FPS game, every frame has to finish in <strong>16 Ms</strong> or less. If your game is running at a high framerate in the background, the <strong>Finish_Frame</strong> event in the Engine/Combined section will usually be a big chunk of each of your frames (32.5 Ms in my example). </div> <div> &nbsp; </div> <div> <h2>Conclusion</h2> <p>The topic of debugging and profiling is extensive and can be confusing if you are new to it. I hope you try it and take advantage of this tool moving forward when debugging and optimizing your game as it is invaluable. And,&nbsp;I can’t stress enough how useful and well written the official GameMaker documentation is. I definitely recommend that you open it (F1 while in GameMaker), or by going to this link: <a href="https://docs2.yoyogames.com/index.html?page=source%2F_build%2Findex.html" target="_blank">GameMaker 2 Documentation</a> and then clicking on <strong>Extras → Debugging</strong> (or clicking <a href="https://docs2.yoyogames.com/source/_build/2_interface/2_extras/debugging.html" target="_blank">HERE</a> to get there directly).</p> I am always willing to help if you run into any issues with the material covered in the article, or something else related to GMS2. You can contact me on <a href="http://twitter.com/AleHitti" target="_blank">Twitter</a>. </div> <div> &nbsp; </div> <div> &nbsp; </div> <p style="text-align:center"><img alt="AlejandroBio.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/AlejandroBio._CB512098171_.jpg?t=true" style="height:145px; width:583px" /></p> <p style="text-align:center"><em>Alejandro Hitti is a videogame Programmer and Designer from Venezuela. Although his background is in C++ and working using custom-made game engines, his two commercial games, INK and HackyZack, were made using GameMaker Studio 1.4. With the release of GameMaker Studio 2, that became his engine of choice. The novelty of GMS2, paired with his knowledge of the previous version, ignited his interest to create tutorials that focus on this new engine.</em></p> /blogs/appstore/post/eb803901-9969-4eb6-9c6b-ae9d2d442e31/tips-for-making-a-twitch-friendly-mobile-game-part-1 Tips for Making a Twitch-Friendly Mobile Game (Part 1) Emily Esposito Fulkerson 2018-01-30T20:20:51+00:00 2018-02-19T20:24:29+00:00 <p><img alt="Twitchfriendly-heroimage1.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/SAposts/Twitchfriendly-heroimage1._CB488127431_.jpg?t=true" style="display:block; height:385px; margin-left:auto; margin-right:auto; width:1000px" /></p> <p>This three-part series will&nbsp;describe the ways that mobile game developers can make their games more attractive to the&nbsp;broadcaster community. I will touch on technical and design elements, as well as external communications and marketing.</p> <p><img alt="Twitchfriendly-heroimage1.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/SAposts/Twitchfriendly-heroimage1._CB488127431_.jpg?t=true" style="display:block; height:385px; margin-left:auto; margin-right:auto; width:800px" /><br /> I'm a solutions architect at the Amazon Appstore, where I help developers bring their games to Amazon. One of the most common conversations I have with game developers is about how they can optimize their game to make the best use of Twitch. As a former game developer, Twitch enthusiast, and also as someone who helped build a sizeable Twitch stream featuring mobile games, I wanted to share my insights into what game developers can do to make their games more appealing to influencers and streamers.</p> <p>Many game developers today understand that streamers (broadcasters on Twitch) and other content creators can be an important outlet. But finding streamers on Twitch (or other content creators) to highlight a game isn’t like buying ad placements. While some streamers showcase sponsored games, the vast majority of game streamers are choosing games organically, based not just on their own personal preferences, but on the requirements they have as a broadcaster.</p> <p>This three-part series is intended to describe ways that mobile game developers can make their games more attractive to that broadcaster community. I will touch on technical and design elements, as well as external communications and marketing.</p> <h2>Tip: DON’T integrate a special streaming SDK for your game</h2> <p>This is the most common question I get about streaming mobile games: “Do we need to integrate a streaming SDK?” And the answer is, simply, no. There should be no need to integrate a mobile streaming SDK, and doing so will likely not impact the appeal that your game has for&nbsp;broadcasters.</p> <p>For why this is, let’s think about how and what the typical Twitch broadcaster includes in his or her stream. While broadcasting a stream naturally implies showing gameplay, broadcasters usually include a variety of other information and features into their video stream. Streaming SDKs let someone stream the game directly from inside the application, which is great for showing the gameplay, but neglects those other important features that streamers also use for their streams: donation notifications, chat integration, multiple inputs, space for ads and sponsorships, and so on.</p> <p>Here’s a simple example of how the promise of a built-in SDK fails in the real world: Twitch broadcasting is often about showcasing a broadcaster’s personality, and a camera showing the person playing the game is almost a requirement. Meanwhile, mobile devices all include cameras, so why not use the camera on the phone in the broadcast?</p> <p>Let me illustrate why someone doesn’t want to use their phone’s camera while they play:<br /> &nbsp;</p> <p><img alt="chrisfoley-image-1_v2.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/SAposts/chrisfoley-image-1_v2._CB488121679_.png?t=true" style="display:block; height:447px; margin-left:auto; margin-right:auto; width:600px" /></p> <p style="text-align:center"><em>Webcam&nbsp;pose</em><br /> &nbsp;</p> <p style="text-align:center"><img alt="chrisfoley-image-2_V3.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/SAposts/chrisfoley-image-2_V3._CB488121793_.png?t=true" style="height:500px; width:380px" /></p> <p style="text-align:center"><em>Camera phone angle</em></p> <p><br /> Needless to say, most content creators don’t want to treat their audience to a view up their nose! So while a camera <em>could</em> be used in a mobile game broadcast, the fact is that all broadcasters showing mobile games today use external cameras of different types for their stream.</p> <p>The point is that content creators, like game developers, demand a lot of control over the content that they create, and a phone doesn’t allow this control, despite the convenient availability of a camera, microphone, etc.</p> <p>So while an integrated streaming SDK seems, on the surface, to make a lot of sense, it just doesn’t provide value to a broadcaster. Remember that content creators - not just the big names with high production values, but also hobbyists and fans -&nbsp;are building an experience that is more than just the gameplay.</p> <p>Don’t worry about integrating an SDK. As a game developer you should focus on building a great game and let the content creator focus on putting together the elements to produce a great piece of content.</p> <p>In the next part of this series, I will discuss some things that you should do to make more streaming-friendly mobile games. Stay tuned!</p> <h2>More reading</h2> <ul> <li><a href="https://developer.amazon.com/blogs/appstore/post/b6c0a06c-22bb-4b73-979f-18e6860a0248/tips-for-making-a-twitch-friendly-mobile-game-part-2" target="_blank">Tips for Making a Twitch-Friendly Mobile Game (Part 2)</a></li> </ul> /blogs/appstore/post/7f26c155-741e-4d40-8c81-25d4118860c2/appstore-survey-share-your-experience-and-have-the-opportunity-to-influence-our-roadmap Appstore Survey: Share Your Experience and Influence Our Roadmap Emily Esposito Fulkerson 2018-01-26T20:43:52+00:00 2018-01-26T20:43:52+00:00 <p><img alt="NPS-survey-heroimage.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/NPS-survey-heroimage._CB488115663_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> Do you currently have apps or games published on the Amazon Appstore? If so, we want to hear from you!</p> <p><img alt="NPS-survey-heroimage.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/NPS-survey-heroimage._CB488115663_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> Do you currently have apps or games published on the Amazon Appstore? If so, we want to hear from you!</p> <p>As part of our ongoing effort to provide better services and support for our app developers and content creators, we’d like to request your feedback via <a href="https://edcresearch.limequery.com/628213?lang=en&amp;njp=1" target="_blank">a short online survey</a>. By completing&nbsp;this survey, you have the opportunity to help us improve and&nbsp;influence our roadmap, with all your feedback going directly to our product and marketing teams.</p> <p>Our goal is to understand your experience publishing on the Amazon Appstore, including your thoughts on Amazon Fire TV, the Amazon Developer Portal, Live App Testing, the Amazon Developer Forum, and more.</p> <p>We also want to learn about how you prefer to communicate and interact with us, like how you’d like to hear about new functionality, how we can help you troubleshoot an issue, and which topics you’d like to see added to our technical documentation. &nbsp;</p> <p>These survey responses will help us better serve you going forward.<br /> &nbsp;</p> <p><a href="https://edcresearch.limequery.com/628213?lang=en&amp;njp=1" target="_blank"><img alt="take-survey-button.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/take-survey-button._CB488115688_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /></a></p> /blogs/appstore/post/464806a8-944b-4695-a12f-53cd5c327a8a/game-jamming-in-unity-three-ways-to-work-faster Game Jamming in Unity: Three Ways to Work Faster Emily Esposito Fulkerson 2018-01-26T17:38:08+00:00 2018-01-26T17:42:18+00:00 <p><img alt="game-jamming-blog-hero.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Unity/game-jamming-blog-hero._CB487978680_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> As you begin, remember that preparation and planning are key. During the iterative phase of game development, when your mock-up is still very malleable and subject to radical change, look for techniques that will help speed up your development time.</p> <p><img alt="game-jamming-blog-hero.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Unity/game-jamming-blog-hero._CB487978680_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p>Game jams have become a popular way for game developers to try out ideas over a few days or weeks. They are fun, often themed game development events designed to stretch your creativity by imposing an extreme time limit. They call for rapid prototyping, often resulting in a throw-away proof-of-concept for a game mechanic or interesting idea.</p> <p>Unity is perfectly suited to this kind of rapid game development. It is a game engine that comes with tools, example code, and art assets to jump-start a working prototype, helping beginners and experts alike to skip months of low-level programming.</p> <p>As you begin, remember that preparation and planning are key. During the iterative phase of game development, when your mock-up is still very malleable and subject to radical change, look for techniques that will help speed up your development time and allow you to try out new ideas with the least amount of effort.</p> <p>Here are three ways to work faster:</p> <h2>1. Start on paper</h2> <p>When you first fire up Unity and create a new project, you immediately face that most familiar of scenes—the lovely blue sky gradient. Where do you take it from there? The possibilities are endless, of course, and this can sometimes be a real problem.</p> <p>For this reason, one of the best first steps when beginning a game jam or rapid prototype is to avoid sitting in front of your computer. Instead, grab a piece of paper and a pencil, and draw a comic book version of your game.</p> <p>Think of it like a storyboard. You only need stick figures, no artistic ability required.</p> <p><img alt="workfaster-image1.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Unity/workfaster-image1._CB487968074_.png?t=true" style="display:block; height:184px; margin-left:auto; margin-right:auto; width:780px" /><br /> Scribble small thumbnails for each scene when first running the game. Perhaps it begins with a splash screen, followed by a main menu. Draw them without regard for art quality but instead from a mile-high view, like making thumbnails, until you have arrived at what feels like a fun introduction to a game.</p> <h2>2. Skip square one with &quot;basecode&quot;</h2> <p>What kind of camera is in use? What kind of movement will the player have? What does the world look like, and what will the moment-to-moment actions of the players be? Once you have these questions answered, you can forge ahead with the creation of your first prototype.</p> <p>It is often handy to have your own personal base code project to start from, which is more than just the empty default new Unity project template, but also has a few of your favorite goodies (camera scripts, your favorite save game system, or a handy scene all set up to be a main menu).</p> <p>A template project, which is often referred to in game jam circles as your “basecode,” or personal game template project, is an asset well worth developing in advance before proceeding with any new game project you create. After participating in several game jams, you'll begin to notice that many of the same things need solving no matter what game genre you are developing. If you don't have to start from scratch, don't!</p> <h2>3. Customize the Unity editor</h2> <p>Unity empowers developers to completely redesign the entire program to suit their needs; code can be set to run in-editor, as opposed to code that runs during the game. This is the perfect way to run custom “randomization” scripts, do tests, calculate statistics, or mass-rename groups of objects while editing. Think of all the ways you can save time during the design phase!</p> <p>If you place a C# source file in any folder named <strong>Editor</strong>, it will not be part of the game build at all and can be used for developer-only functionality. For code in other folders, you need only wrap it in a define: “#if UNITY_EDITOR … #endif” to ensure it is never run during normal gameplay. This is super handy to add debug information to the game, or for custom editor functionality.</p> <p>Imagine making your own tools for editing only, such as a Perlin noise terrain generator or something that rotates all selected objects to a particular orientation. To create your own menu items in the Unity editor, put the following meta tag immediately above a function: “[MenuItem (“Tools/My Custom Function”)]”.</p> <p>Now, your editor enhancement can access, for example, “Selection.gameObjects,” an array of whichever game objects are currently selected, ready to modify as required. From there you could change “Selection.gameObjects[0].transform.position” or any other value.<br /> &nbsp;</p> <p><img alt="workfaster-image2.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Unity/workfaster-image2._CB487968068_.png?t=true" style="display:block; height:551px; margin-left:auto; margin-right:auto; width:780px" /></p> <p><br /> Coding your own custom edit-mode tools is very fulfilling. You will reap great rewards, not merely in terms of time saved, but as a way to extend Unity to do anything you wish it could do.</p> <h2>Read more tips: download the free eBook</h2> <p>To read all my tips on how to work faster, code faster, and make art faster, download this free eBook I wrote - Game Jamming in Unity: Tips and Tricks to Work Faster.&nbsp;<br /> &nbsp;</p> <p><a href="http://m.amazonappservices.com/game-jamming-ebook?cmp=US_2018-00_CON_eBooks&amp;ch=web&amp;chlast=web&amp;pub=blg&amp;publast=blg&amp;type=org&amp;typelast=org" target="_blank"><img alt="eBook_Button.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Unity/eBook_Button._CB489599759_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /></a><br /> <br /> &nbsp;</p> <p style="text-align:center"><a href="https://twitter.com/McFunkypants"><img alt="Christer_Bio.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Unity/Christer_author_bio_blog._CB487968184_.png?t=true" /></a></p> <p style="text-align:center"><em>Christer Kaitila has been a freelance game dev since 1993. He has shipped dozens of games, and mentors at a game development club. He created <a href="http://www.onegameamonth.com/" target="_blank">One Game a Month</a> and has published two other gamedev books.</em></p> /blogs/appstore/post/e7fba237-aa17-46a5-bcf4-f7228a3107d1/debugging-with-gamemaker-studio-2 Debugging with GameMaker Studio 2 Emily Esposito Fulkerson 2018-01-25T17:21:34+00:00 2018-02-02T00:02:57+00:00 <p><img alt="0125_Debugging_image6.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image6._CB487876929_.gif?t=true" style="display:block; height:366px; margin-left:auto; margin-right:auto; width:750px" /><br /> In this post, I will explain my process when debugging my games, and some tips to find bugs quickly and identify bottlenecks in your game.&nbsp;It’s a good idea for you to experiment with all these tools yourself and figure out ways to make your debugging experience easier and better.</p> <p><img alt="0125_Debugging_image6.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image6._CB487876929_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> As software developers, we spend just as much time, if not more, debugging and profiling our programs. Having good tools to make these processes easier is important. Luckily, YoYoGames overhauled its debugger and profiler, making it more robust and easier to use.</p> <p>In this post, I will explain my process when debugging my games, and some tips to find bugs quickly and identify bottlenecks in your game. I will try to cover as much as possible on these tools, but I will most likely miss a few points, given it is such an extensive topic. It’s a good idea for you to experiment with all these tools yourself and figure out ways to make your debugging experience easier and better. Reading the official documentation is also a great way to learn more about it after you’ve read this article.</p> <h2>What exactly is debugging and profiling?</h2> <p>We’ve all been in that situation where we write code, run the game, and nothing works like expected. Then we go back to the code and look at it for 20 minutes thinking it should work. The first solution that comes to mind is to check the values of variables, or the results of conditional statements, by using debug messages or drawing text to the screen.</p> <p>This is fine for quickly debugging a small feature, but when you have many moving parts working together, generating these messages can quickly get out of hand. This is when a debugger becomes useful. GameMaker’s debugger allows you to run your code line by line, checking the values of every variable and their changes along the way. It can also show you more advanced information, such as the state of your textures and surfaces, current graphics options, values of buffers, etc.</p> <p>Profiling is often more useful in the second half of the project when you experience slowdowns in your game due to the amount of objects interacting with each other. Programmers are decent at spotting obvious bottlenecks, but on any application that isn’t trivial, it’s hard to find them. This is where the profiler comes in handy, giving you detailed information about what functions are being called at every stage of the game run-time and compiling the data in a way easy to analyze. Once you pinpoint the function/section that is running slowly, then you can optimize it.</p> <h2>Entering debug mode</h2> <p>Let’s start with the basics. You may be used to launching your game by pressing the <strong>Play</strong> symbol at the top bar, or by pressing <strong>F5</strong>. However, to launch the game with the debugger attached, you will need to press the <strong>Bug</strong> icon instead, or you can also use <strong>F6</strong>.<br /> &nbsp;</p> <p><img alt="0125_Debugging_image1.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image1._CB487876988_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p>Once the game launches, you will see a new tab show up at the top of your code editor, and a multitude of other windows opening. You can customize the layout of every one of these windows, but here’s what mine looks like:<br /> &nbsp;</p> <p><img alt="0125_Debugging_image2.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image2._CB487876990_.png?t=true" style="display:block; height:449px; margin-left:auto; margin-right:auto; width:780px" /></p> <p><br /> If a window isn’t showing up, or you closed it by accident, go to <strong>Debugger → Windows</strong> and there will be a full list of available windows that can be displayed.<br /> &nbsp;</p> <div> <img alt="0125_Debugging_image3.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image3._CB487876985_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /> <br /> &nbsp; </div> <h2>The debug toolbar</h2> <p>Once you are in the <strong>Debugger</strong> tab, you will see a set of buttons at the top. Let’s go over each one of these, and we will go into more detail as we go along in the article. This is what the toolbar looks like:<br /> &nbsp;</p> <p><img alt="0125_Debugging_image4.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image4._CB487876987_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> From left to right, we have these sections:</p> <ul> <li> <p><em>Continue, Break, and Restart Game</em>: These buttons let us pause (break) the program, continue to the next breakpoint (or continue execution if no other breakpoints are set), and restart the program.</p> </li> <li> <p><em>Close the game</em>: This one acts similarly to the one above&nbsp;to stop the execution of the game.</p> </li> <li> <p><em>Step into, Step over, and Step out</em>: These buttons&nbsp;advance our code line by line when the application is paused. You will use these a lot.</p> </li> <li> <p><em>Real-time debugging</em>: This is a toggle to control whether we want variables to be updated in the debugger while the application is running, or only when it is paused.</p> </li> <li> <p><em>Discard collected data</em>: While debugging, the debugger will keep the data it collected on its last run, so you can reference it after you’ve closed the application. This button will discard all that data.</p> </li> <li> <p><em>Memory, FPS and Colored Circle</em>: Displays the current memory usage, current frames-per-second (FPS), and the circle will be green when the debugger is attached and the application is running, or red otherwise.</p> </li> </ul> <h2>Breakpoints</h2> <p>Now that you have run your game with the debugger attached, you may have noticed that not much has changed. You still can’t see the values of variables and the only thing that seems to be working is the graph. The reason is that debuggers need to pause your application to inspect the values of variables and buffers (there is a way to do this in real time, but we’ll get to that later). One way to pause your game is through the debug toolbar, by pressing the <strong>Break (Pause)</strong> icon. However, this will pause the game at whichever point it was at when you clicked the button, so it is essentially pausing at a random location you can’t control. A better way to stop the application is by using breakpoints.</p> <p>There are three ways to set a breakpoint on a specific line:</p> <ol> <li> <p>Left-click on the line number gutter, on the line you want the breakpoint on.</p> </li> <li> <p>Right-click on a line, then click <strong>Toggle Breakpoint</strong>.</p> </li> <li> <p>Select a line, then press <strong>F9</strong>.<br /> &nbsp;</p> </li> </ol> <p><img alt="0125_Debugging_image5.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image5._CB487876981_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> Remember that if you set a breakpoint on an empty line, or a line with a comment, the game will pause at the next valid line.</p> <p>Now that we have a breakpoint set up, if we run the game using the debugger, the application will automatically stop right <em>before</em> that line of code is executed. So, for example, if you stop at a line where we assign a value to a variable, the variable itself won’t have that value yet, but it will change as soon as we step into the next line. Breakpoints can be set or removed at any point, even while the game is running.</p> <h2>The game is paused in the section I want. Now what?</h2> <p>While the game is paused, you can inspect the values of variables in a few different ways. The easiest one is to hover over the variable name in code. Know that the values of variables above the current line have already been updated for this frame while the ones below haven't. This also means that if you have a local variable, they won’t be initialized yet.<br /> &nbsp;</p> <p><img alt="0125_Debugging_image6.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image6._CB487876929_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> Checking values this way is useful for variable types such as integers or strings, but the information you get from data structures or objects isn’t too useful. In those cases, it’s better to use the <strong>Variables</strong> and <strong>Instances</strong> debug windows to get more information.<br /> &nbsp;</p> <div> <img alt="0125_Debugging_image7.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image7._CB487876928_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> <br /> <br /> By default, there are three sections in the Variables tab. In the <strong>Locals</strong> window, you will see the values of all local variables, which includes <strong>self</strong>. If you click the plus sign on the <strong>self</strong> object, you will see all instance variables associated with the object you are inspecting. Then we have the <strong>Globals</strong> section, showing us all the defined global variables and their values. Last, we have the <strong>Watch</strong> window, where we can specify variables to keep track of at all times. To add variables in the Watch window, we can either click on “Add new Watch…” and then type the name of the variable, or we can right-click any variable in other windows (Locals, Globals, Instance, All Instances) and then select “Add Watch.&quot; Note that if you try to watch a variable that is currently out of scope, the debugger won’t be able to reference it (it will show <strong>&lt;unable to evaluate&gt;</strong>). <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="0125_Debugging_image8.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image8._CB487876930_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> <br /> <br /> Sometimes you will notice that a variable is not displaying the information you want, such as the instance or data structure ID, when you really want to see its value. In those situations, all you have to do is right-click the variable, hover on “View As,&quot;&nbsp;and select the way you want the variable to be displayed as. <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="0125_Debugging_image9.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image9._CB487876959_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> <br /> <br /> Here is where things get interesting though since you can do more than just look at the value in variables. In fact, you can change any value you want by double-clicking on the value cell and then typing in a new value. This change will affect the variable instantly, letting you test stuff on the fly without having to re-compile the game. If you change a value this way, it won’t happen again the next time you run the game, so you will need to remember the value you set the variable to that worked, and then replace it in code so it happens every time. <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="0125_Debugging_image10.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image10._CB487876958_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> <br /> <br /> Now we can take a look at the <strong>Instances</strong> tab, which includes three sections as well by default. The first one, labeled <strong>Instance</strong>, contains all the variables and information about the instance that is running the code. You will see the values of variables you created, and all the built-in variables objects in GameMaker are created with, such as ID, position, physics variables, alarms, etc. <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="0125_Debugging_image11.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image11._CB487876901_.png?t=true" style="display:block; height:224px; margin-left:auto; margin-right:auto; width:780px" /> </div> <div> &nbsp; </div> <div> <br /> You can also search through every instance created in the <strong>All Instances</strong> tab. Last, if you click on an instance in your game window, it will show up in the <strong>Selected Instance</strong> section, but only if the object in question has a collision mask that GameMaker can reference. This is a very useful feature in case you have multiple instances of the same object in your room and need to select a specific one, which would be difficult using the All Instances section, seeing as they all have the same name. </div> <h2>Navigating your code while paused</h2> <div> <p>I have mentioned that you can run through your code line by line after the game is paused, either manually or by a breakpoint, but haven’t explained how to do it yet. If you look at the debug bar, you will notice these icons:</p> <p><img alt="0125_Debugging_image12.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image12._CB487876900_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> These are your helpers while navigating code. From left to right, these buttons are: Step into, Step over, and Step out.</p> <p><strong>Step into</strong></p> <div> When you press this button, the code will perform the next logical step. If your line has a variable assignment, it will perform it and then move to the next line. However, if the line you are hovering has a script call, then it will jump into that script and stop at the first line. You can the keep stepping through the code of the script until you reach the end which will then return you back to the initial call. Remember that this will only happen for user defined scripts, not GameMaker functions, as their implementation is hidden from the user. </div> <div> &nbsp; </div> <div> <img alt="0125_Debugging_image13.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image13._CB487876902_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> &nbsp; </div> <div> <br /> <strong>Step over</strong> </div> <div> &nbsp; </div> <div> This one works similarly to the previous one where we step through the code line by line, but this time if you are on a line with a function call, you will not be taken to it. Instead, it will perform all the operations inside that script, come out, and then step to the next line. Unless I’m doing some deep debugging section, where I need to check what happens every step of the way, this is the button I use the most. </div> <div> &nbsp; </div> <div> <img alt="0125_Debugging_image14.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image14._CB487876896_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> &nbsp; </div> <div> <br /> <strong>Step out</strong> </div> </div> <div> <p>Lastly, this button will bring you one step above in the call stack. If you are not sure what the call stack, it is the list of function calls that were performed to reach the part of the code you are in. So, for example, if you are inside of your object create event, and then you call a script that calls another script inside of itself, then you will be three&nbsp;functions deep. If you press the Step Out button now, you will be taken to the previous step in the stack (the first script call). If you press it once more, you will end up back at the object create event. Useful when you are inside of a script that you know is working as expected and want to get back to debugging the section you started on.</p> <p><img alt="0125_Debugging_image15.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image15._CB487876899_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> <br /> Another good way to navigate your code if you want to skip large sections of it, is to place another breakpoint where you want to reach and then press the <strong>Play</strong> button. This will make the game continue executing until it reaches the next breakpoint which should be the one you just placed.<br /> &nbsp;</p> <p><img alt="0125_Debugging_image16.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image16._CB487876912_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> As explained before, you can also press the <strong>Pause</strong> button to stop the execution of the game, but this will stop wherever the game was currently executing, so it may be a random location. You can also restart the game by pressing the circular arrow next to the Play/Pause buttons.</p> <h2>Real-time debugging</h2> <div> Most debuggers only let you inspect variables while the application is paused. In the newest iteration of the tool provided by GameMaker, it is possible to watch the state of variables while the game is running. If you press the button next to the code step icons, you will activate it. The variables will update as fast as they can while running the game, which isn’t always once per frame, but it is often enough to be usable. Not all windows will work with this feature, and its use is mostly to watch instances being created/destroyed and variable values real time. <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="0125_Debugging_image17.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/GameMakerStudio2/0125_Debugging_image17._CB487876914_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> &nbsp; </div> <div> <br /> Congrats! You now have all the tools to debug your game efficiently in 90% of situations. </div> <div> &nbsp; </div> <h2>More resources&nbsp;</h2> <div> In my next post, we'll move onto some tools that are helpful when debugging surfaces, shaders, and custom draw code. </div> <div> <br /> In the meantime,&nbsp;I can’t stress enough how useful and well-written the official GameMaker documentation is. I definitely recommend that you open it (F1 while in GameMaker), or by going to this link: <a href="https://docs2.yoyogames.com/index.html?page=source%2F_build%2Findex.html" target="_blank">GameMaker 2 Documentation</a> and then clicking on Extras → Debugging (Or clicking <a href="https://docs2.yoyogames.com/source/_build/2_interface/2_extras/debugging.html" target="_blank">HERE</a> to get there directly). <br /> &nbsp; </div> <div> &nbsp; </div> </div> <p style="text-align:center"><img alt="AlejandroBio.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/AlejandroBio._CB512098171_.jpg?t=true" style="height:145px; width:583px" /></p> <p style="text-align:center"><em>Alejandro Hitti is a videogame Programmer and Designer from Venezuela. Although his background is in C++ and working using custom-made game engines, his two commercial games, INK and HackyZack, were made using GameMaker Studio 1.4. With the release of GameMaker Studio 2, that became his engine of choice. The novelty of GMS2, paired with his knowledge of the previous version, ignited his interest to create tutorials that focus on this new engine.</em></p>