Appstore Blogs Appstore DeveloperBlog /blogs/appstore/feed/entries/atom 2018-10-18T21:58:43+00:00 Apache Roller /blogs/appstore/post/6c3a82b1-e177-43a0-b428-6015121ed5e8/new-look-for-amazon-developer-portal New Look for Amazon Developer Portal Serena McIntire 2018-10-18T19:23:25+00:00 2018-10-18T21:58:43+00:00 <p style="text-align:center"><img alt="lifestyle-laptop-NewUI_728x280.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Announcements/lifestyle-laptop-NewUI_728x280.png._CB481984723_.png?t=true" /></p> <p style="text-align:center">&nbsp;</p> <p><a href="https://developer.amazon.com/home.html">The Amazon Developer Portal console</a> features a new user interface (UI), including a new header and footer, consistent with the pre-login site, allowing easy access to the services you access most, as well as quick links to technical documentation, support, and search.</p> <p style="text-align:center"><img alt="lifestyle-laptop-NewUI_728x280.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Announcements/lifestyle-laptop-NewUI_728x280.png._CB481984723_.png?t=true" style="height:280px; width:729px" /></p> <p>Starting today, <a href="https://developer.amazon.com/home.html">the post-login console for the Amazon Developer Portal</a> has a fresh new look. The new user interface (UI) includes a new header and footer, consistent with the pre-login site, allowing easy access to the services you access most, as well as quick links to technical documentation, support, and search.</p> <h2>Amazon services featured in the top navigation</h2> <p>Amazon services, such as Login with Amazon and Dash Replenishment Services, are now available on the top level navigation. Developers can now access both Alexa Skills and Alexa Voice from a single Alexa tab.</p> <p style="text-align:center"><img alt="UI_Screenshot1.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Announcements/UI_Screenshot1.png._CB481985212_.png?t=true" style="height:45px; width:725px" /></p> <h2 style="text-align:justify">New Support Center and account options</h2> <p>Developers can now access Tech Docs, Forums, Support and Contact Us in the Support Center (displayed as “?” at the top of the screen). The options for toggling between accounts and logging out are now displayed under the user dropdown menu (which displays as your first and last initial).</p> <p style="text-align:center"><img alt="UI_Screenshot2.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Announcements/UI_Screenshot2.png._CB481985215_.png?t=true" style="height:147px; width:725px" /></p> <h2 style="text-align:justify">New search functionality</h2> <p style="text-align:justify">You can also now quickly access search without having to leave the post-login console, allowing for easy discovery of app and game development topics within developer console.</p> <h2 style="text-align:center"><img alt="UI_Screenshot3.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Announcements/UI_Screenshot3.png._CB481985209_.png?t=true" /></h2> <h2 style="text-align:justify">Modern footer with language switcher</h2> <p style="text-align:justify">The new slim footer within the developer console is modern and consistent with other areas of the website and now includes language switching options.</p> <p style="text-align:center"><img alt="UI_Screenshot4.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Announcements/UI_Screenshot4.png._CB481985208_.png?t=true" /></p> <h2 style="text-align:justify">Amazon Developer Portal</h2> <p style="text-align:justify">Amazon Developer Portal hosts services and technologies that make it easy to build for and monetize on Amazon devices. Build natural voice experiences that offer customers a more intuitive way to interact with technology with <a href="https://developer.amazon.com/alexa">Alexa</a>. Develop Android apps and games for <a href="https://developer.amazon.com/fire-tv">Amazon Fire TV</a>, <a href="https://developer.amazon.com/fire-tablet">Fire tablet</a>, and mobile operating systems with <a href="https://developer.amazon.com/apps-and-games">Amazon Appstore</a>. Engage your players with cross-platform competitions with <a href="https://developer.amazon.com/gameon">Amazon GameOn</a>. Construct Amazon reordering experiences into your devices with <a href="https://developer.amazon.com/dash-services">Amazon Dash Services</a>.</p> /blogs/appstore/post/9d2094ed-53cb-4a3a-a5cf-c7f34bca6cd3/coding-imprecise-controls-to-make-them-feel-more-precise Coding Imprecise Controls to Make Them Feel More Precise Emily Esposito Fulkerson 2018-10-18T18:20:22+00:00 2018-10-18T18:20:22+00:00 <p><img alt="image8-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image8-imprecisecontrols-alejandro.gif._CB482012535_.gif?t=true" style="display:block; height:394px; margin-left:auto; margin-right:auto; width:700px" /><br /> I will talk about three examples in this article related to that genre, namely: Coyote Time, Jump Buffering, and Sticky Walls. Let’s get started.</p> <p><img alt="image8-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image8-imprecisecontrols-alejandro.gif._CB482012535_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> When discussing games, people often refer to controls that feel responsive as “tight.&quot;&nbsp;But, what makes controls feel good? The obvious answer is that controls should always do what the player is thinking of doing. They need to be predictable to the user depending on their inputs. The issue is that players are human, and as such, we can make slight timing mistakes that produce an unexpected result. From a programming point of view the action displayed on screen made sense (since code is consistent), but in the player’s mind, the game “cheated” them. This is a terrible feeling to have as a player and as designers, we must find ways to mitigate the instances where controls don’t react the way they were intended to.</p> <p>This is where adding some leeway to your controls in the form of timers (or extra frames to perform actions) helps your controls feel tighter. These concepts can be used in many situations and in any game genre&nbsp;to perform actions such as jumping, attacking, interacting with menus, or even queuing actions. Thanks&nbsp;to my experience creating platforming games, I will talk about three examples in this article related to that genre, namely: Coyote time, jump buffering, and sticky walls. Let’s get started.</p> <h2>Coyote time</h2> <p>Players like to maximize their jumps in platforming games, leading them to wait until the very last moment (usually at the edge of the ground) to jump. When done right, the player will perform a jump that will cover a nice distance. However, when done wrong, their character will simply fall without jumping, usually killing them with strategically placed spikes below (because every platformer NEEDS spikes). To fix this issue, we can implement something called coyote time, also referred to as “ledge tolerance.&quot;&nbsp;This feature adds&nbsp;the ability for the player to jump even after their character is no longer touching the ground, for a few extra frames.</p> <p>Here’s an example of how the demo looks like when coyote time is zero (meaning it’s off).<br /> &nbsp;</p> <p><img alt="image1-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image1-imprecisecontrols-alejandro.gif._CB482009744_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> The yellow dot represent the moment when I press the <strong>jump</strong> button. As you can see, unless the player is touching the platform, the jump won’t happen, but in a couple of those cases it was so close&nbsp;that it looks wrong, and the player would be frustrated by that. Let’s implement a timer to fix it.</p> <p><em>Disclaimer: All the code shown in this article will be as engine/language agnostic as possible. As such, it may look a bit like pseudo-code, but the implementation on your engine/language of choice should be pretty trivial.</em></p> <pre> <code>// Character’s Create Event var coyoteTimer = 0; ... // Character’s Update Event if (cBelow) coyoteTimer = 0; var numCoyoteFrames = 4; if (kJump &amp;&amp; (coyoteTimer &lt; numCoyoteFrames)) { Jump(); coyoteTimer = numCoyoteFrames; } ++coyoteTimer;</code></pre> <p>First, we create a variable in our character’s create event called <strong>coyoteTimer</strong> and we initialize it to zero. Then in our update event, we check if the character is on the floor (represented by the <strong>cBelow</strong> variable, but should be replaced by however you are checking for ground collisions), and if it is, then we reset our timer back to zero. In the next section, we create a variable with the number of extra frames that your character can be off the ground and still be able to jump. We then check if the jump key was pressed (<strong>kJump</strong>) and if the timer is less than the number of extra frames. If both of these conditions apply, we execute our jump logic and then we set the timer to be the number of extra frames so that we can’t jump twice. Last, we increase our timer by one every frame. That is all!</p> <p>When we test the game now, this is what it looks like:<br /> &nbsp;</p> <div> &nbsp; </div> <div> <img alt="image2-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image2-imprecisecontrols-alejandro.gif._CB482009747_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> &nbsp; </div> <div> <br /> A more exaggerated example is this one, where I used 10 frames instead of four: <br /> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="image3imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image3imprecisecontrols-alejandro.gif._CB482012525_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /> </div> <div> &nbsp; </div> <div> <br /> To find the perfect number of frames, you will need to test it on your own game, as it’s very specific to each case depending on your physics and framerate (30 vs 60 FPS). If your game is running with unlocked FPS, then using time instead of frames is the way to go. You’d need to modify the code I showed above, but the basic idea is the same. This is what it would look like: </div> <pre> <code>if (cBelow) coyoteTimer = current_time; var maxCoyoteTime = 200; // In milliseconds if (kJump &amp;&amp; ((current_time - coyoteTimer) &lt; maxCoyoteTime)) { Jump(); coyoteTimer = 0; }</code></pre> <p>The code is similar to the previous one, but this time, we are resetting our timer using the current game time, and then we are checking for the jump key as well as the difference between the current time and the time at which we left the ground. If that difference is lower than our maximum coyote air time, then we execute our jump code and set the timer back to zero so as not to jump twice. In this example, we don’t need to increase the timer since it’s being handled automatically by the game time.</p> <h2>Jump buffering</h2> <p>The next feature we’ll cover is called jump buffering (also referred to as input buffering). The idea is that if the player performs an action a few frames before it’s allowed, by some other condition (such as being on the ground to be able to jump), the action will still happen. To achieve that effect, we start a timer when the button is pressed and if the number of frames between the moment in which the input was sent and the moment the condition is reached (touching the ground) is less that the number of frames defined by our tolerance, the action still happens (we jump). The code looks somewhat similar to the previous section:</p> <pre> <code>// Character’s Create Event var jumpBufferTimer = max_int; // Or any number higher than your tolerance variable ... // Character’s Update Event var numJumpBufferFrames = 4; if (cBelow &amp;&amp; (jumpBufferTimer &lt; numJumpBufferFrames)) { Jump(); jumpBufferTimer = numJumpBufferFrames; } ++jumpBufferTimer; if (kJump) jumpBufferTimer = 0;</code></pre> <p>We begin by creating our timer variable <strong>jumpBufferTimer</strong> in our character’s create event (or you set it as a member variable in your object) and we initialize it to a high number (max_int in my case). It needs to be higher than the tolerance frames variable that we will create later to prevent the character from jumping once when a room loads. Next, we go to our update section and create our tolerance variable called <strong>numJumpBufferFrames</strong> and I’m setting it to four initially as a test. The first conditional checks if the character is colliding with the ground using the <strong>cBelow </strong>variable and it checks if the timer is less than our tolerance. If these conditions are met, we will perform our jump code and then we will set our timer to be <strong>numJumpBufferFrames</strong> to prevent jumping twice. Last, we increase our timer by one each frame and we check if the jump button <strong>kJump</strong> is pressed, resetting the timer to zero if it is. With these simple lines, the jump buffer is already working, and should look like this.<br /> &nbsp;</p> <p><img alt="image4-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image4-imprecisecontrols-alejandro.gif._CB482012524_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> If you look carefully, you’ll notice that even when I press the jump button slightly above the ground (indicated by the yellow dots) the character still jumps as soon as it lands on the ground. An example with a larger tolerance (say, eight frames) can make this more obvious to spot:<br /> &nbsp;</p> <p><img alt="image5-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image5-imprecisecontrols-alejandro.gif._CB482012526_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> Just like with coyote time, finding the perfect tolerance for this feature will require you to implement it in your game and test many values out until one feels right to you. Also, just like before, we can modify the code a bit to make it work with time instead of frames, using the following:</p> <pre> <code>// Character’s Create Event var jumpBufferTimer = -max_int; // Or any really large negative number ... // Character’s Update Event var maxJumpBufferTime = 200; // In milliseconds if (cBelow &amp;&amp; ((current_time - jumpBufferTimer) &lt; maxJumpBufferTime)) { Jump(); jumpBufferTimer = 0; } if (kJump) jumpBufferTimer = current_time;</code></pre> <p>We first need to set the initial timer value to a negative number higher than your tolerance time (I’m using negative max int to be safe). In the update, we change the number of frames to <strong>maxJumpBufferTime</strong> and we set it to 200 milliseconds. Later, we check whether the character is on the ground and if the difference in time between the current time and the timer is less than the tolerance. If true, we make the character jump and we set the timer to zero to prevent jumping multiple times. We skip increasing the timer by one, since that’s done automatically as time goes on, and we end it by checking the jump key and setting the timer to the current time if it was pressed this frame.</p> <p>To combine both of these features, you can place them one under another, but a cleaner way of doing it to avoid duplicate checks is:</p> <pre> <code>var numJumpBufferFrames = 4; var numCoyoteFrames = 4; if (cBelow)) { coyoteTimer = 0; if (!hasJumped &amp;&amp; jumpBufferTimer &lt; numJumpBufferFrames) { Jump(); jumpBufferTimer = numJumpBufferFrames; hasJumped = true; } } ++jumpBufferTimer; if (kJump) { jumpBufferTimer = 0; if (!hasJumped &amp;&amp; coyoteTimer &lt; numCoyoteFrames) { Jump(); coyoteTimer = numCoyoteFrames; hasJumped = true; } } ++coyoteTimer; if (kJumpReleased) { VariableJumpLogic(); hasJumped = false; }</code></pre> <p>Notice that I also added a <strong>hasJumped</strong> flag. This is to prevent a bug where the player would double jump when hitting the corner of a block going upwards. It should be easy to extrapolate how to join both features using the millisecond timers by looking at the code above and their separate implementations. This example shows both features implemented at the same time (with slightly bloated frame tolerances to show it better):<br /> &nbsp;</p> <p><img alt="image6-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image6-imprecisecontrols-alejandro.gif._CB482012539_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <h2>Sticky walls</h2> <p>The last feature I want to talk about I refer to as <strong>Sticky Walls</strong>. The concept is to have the character stick to the wall for a few frames when the player points in the opposite direction of the wall. We do this to prevent the character from falling down if the player gives a directional input before pressing the jump button off a wall. I will try to explain the code below as best as I can, but this section will look very differently in every game, so adjustments are necessary to make it work.</p> <pre> <code>// Character’s Create Event stickyWallTimer = 0; ... // Character’s Update Event var stickyWallFrames = 4; --stickyWallTimer; if (!onWall || cBelow) stickyWallTimer = 0; else if ((((kRightPressed &amp;&amp; cLeft) || (kLeftPressed &amp;&amp; cRight))) stickyWallTimer = stickyWallFrames; // Some gravity code ApplyGravity(); if (stickyWallTimer &lt;= 0) CharacterMovement(); if (onWall) Walljump();</code></pre> <p>Just like in the previous cases, we will create a variable in the create event of the character: called <strong>stickyWallTimer</strong>, initializing it to zero. Next, in the update event we can define our tolerance value <strong>stickyWallFrames</strong> which I’ve set to four. We will be decreasing this value every frame by one to act as our timer. Here comes the fun part. We reset our timer if we are not on a wall or if we are on the ground. However, if one of those conditions is false, we check if we are giving a directional input that is opposite to the side of the wall we are touching (<strong>kRightPressed</strong>/<strong>kLeftPressed</strong> being the directional inputs and <strong>cLeft</strong>/<strong>cRight</strong> being the side we are colliding with). For these inputs, make sure to be checking for the first frame it was triggered, not if the player is holding it. This is where it can differ from game to game, but I apply my gravity code to the character next. Then, I wrap my movement code in a conditional checking if the timer is less than or equal to zero. This is what will make the character stay stuck to the wall for a few frames until the timer runs out, at which point movement will resume as normal. Finally, I write my wall jumping code if the player is colliding with a wall.</p> <p>The outcome should look like this (notice the player turns green when the player is sticking to the wall).<br /> &nbsp;</p> <p><img alt="image7-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image7-imprecisecontrols-alejandro.gif._CB482012538_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> And again, an example with an exaggerated tolerance, such as 14 frames:<br /> &nbsp;</p> <p><img alt="image8-imprecisecontrols-alejandro.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/AlejandroHitti/image8-imprecisecontrols-alejandro.gif._CB482012535_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> If you want to implement the version using the time, this is what you need to change:</p> <pre> <code>// Character’s Update Event var maxStickyWallTime = 200; // In milliseconds if (!onWall || cBelow) stickyWallTimer = 0; else if ((((kRightPressed &amp;&amp; cLeft) || (kLeftPressed &amp;&amp; cRight))) stickyWallTimer = current_time; // Some gravity code ApplyGravity(); if ((current_time - stickyWallTimer) &gt; maxStickyWallTime) CharacterMovement(); if (onWall) Walljump();</code></pre> <h2>Demo download</h2> <p>You can download the demo I used to create the GIFs in this article. The demo allows you to customize the tolerances so you can play around with it and test how it affects the feeling of the character.</p> <p><a href="https://www.dropbox.com/s/omwtgj324dy1f3p/TighterInput.zip?dl=0" target="_blank">DOWNLOAD</a></p> <p><strong>Controls</strong></p> <ul> <li>Left/right arrows or A/D - Move left/right</li> <li>Spacebar - Jump</li> <li>1/2 - Increase/cecrease the number of coyote time frames</li> <li>3/4 - Increase/cecrease the number of jump buffer frames</li> </ul> <h2>Reference Links</h2> <ul> <li><a href="https://www.caseportman.com/single-post/2018/08/16/Input-Buffering-2D-Platforming" target="_blank">Input Buffering (2D Platforming)</a> - Case Portman</li> <li><a href="http://kpulv.com/123/Platforming_Ledge_Forgiveness/" target="_blank">Platforming Ledge Forgiveness</a> - Kyle Pulver</li> <li><a href="http://kpulv.com/106/Jump_Input_Buffering/" target="_blank">Jump Input Buffering</a> - Kyle Pulver</li> <li><a href="https://www.youtube.com/watch?v=fUPyU4qkCOo" target="_blank">Complete Platformer Tutorial (Part 18: Jump Buffer)</a> - Shaun Spalding</li> </ul> <h2>Conclusion</h2> <p>I hope you take these ideas and implement them in your project to make your players feel more in control of their characters and not cheated by the game. Remember that the application of these ideas is endless and can include other stuff, such as menu navigation. If you have any suggestions or questions, you can contact me on Twitter (<a href="http://twitter.com/AleHitti" target="_blank">@AleHitti</a>). Thank you for reading. Cheers!</p> <p>&nbsp;</p> <div> &nbsp; </div> <div> &nbsp; </div> <div> <img alt="AlejandroBio.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/AlejandroBio._CB512098171_.jpg?t=true" style="display:block; height:145px; margin-left:auto; margin-right:auto; width:583px" /> </div> <div> <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> </div> /blogs/appstore/post/03417670-bab1-4de0-a8ed-9588a2c3232f/new-enhancements-to-the-appstore-reporting-dashboard New Enhancements to the Appstore Reporting Dashboard Becky Young 2018-10-15T17:12:59+00:00 2018-10-15T17:16:37+00:00 <p>Today, we are excited to launch the new and improved reporting dashboard in the Appstore Developer Console.<br /> <br /> We had two primary goals in mind when we built these new enhancements: provide more transparency in our data and ease of use. Keep reading for a closer look at some of the changes.</p> <p>We are committed to delivering a great developer experience. So when you asked for improvements to the Appstore Reporting Dashboard, we listened. Today, we are excited to launch the new and improved reporting dashboard in the Appstore Developer Console.<br /> <br /> We had two primary goals in mind when we built these new enhancements: provide more transparency in our data and increase ease of use. Here's a closer look at some of the changes:<br /> <br /> <strong>A new overview page</strong></p> <p>An at-a-glance view of your<strong> </strong>Sales, Earnings, and Subscription data across your entire catalog/portfolio of apps and games on the Amazon Appstore. Use filters to zero-in on individual or groups of apps and games, as well as individual IAP items.<br /> &nbsp;</p> <p><img alt="101518_Overview.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/101518_Overview.jpg._CB481729560_.jpg?t=true" style="display:block; height:923px; margin-left:auto; margin-right:auto; width:492px" /><br /> <br /> <strong>Earnings &amp; Payments combined into a single view: </strong>See all of your Earnings &amp; Payment details including invoice IDs, invoice status, and issue date. You can sort by marketplace or month.<br /> &nbsp;</p> <p><img alt="Earnings.JPG" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/Earnings.JPG._CB481727356_.jpg?t=true" style="display:block; height:201px; margin-left:auto; margin-right:auto; width:472px" /><br /> <br /> <br /> <strong>A new Download Center: </strong>Download monthly reports for every single transaction from 2018 onwards. The reports include the SKU, when the transaction occurred, the invoice ID for the transaction, how much the transaction was for, and what the earnings were.<br /> &nbsp;</p> <p><img alt="download.JPG" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/download.JPG._CB481727330_.jpg?t=true" style="display:block; height:212px; margin-left:auto; margin-right:auto; width:388px" /><br /> <br /> For a more in-depth look at the the types of reports available and the browsers on which these new pages are supported, <a href="https://developer.amazon.com/docs/reports-promo/UI-reports-dashboard.html" target="_blank">visit our tech docs</a>. To understand how these reports differ from the old experience, please refer to <a href="https://developer.amazon.com/docs/reports-promo/release-notes.html" target="_blank">release notes</a>.</p> /blogs/appstore/post/f6a83522-27e3-4366-9e14-c858ccce0043/pseudo-random-number-generation-basics Pseudo-Random Number Generation Basics Emily Esposito Fulkerson 2018-10-11T18:25:37+00:00 2018-10-11T18:25:37+00:00 <p><img alt="Image2-PRNGbasics-1010.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/NathanRanneyblogposts/Image2-PRNGbasics-1010.gif._CB483158141_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p>Today, I want to talk to you about random number generation (RNG). Or, more accurately, pseudo-random number generation (PRNG).</p> <p><img alt="Image2-PRNGbasics-1010.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/NathanRanneyblogposts/Image2-PRNGbasics-1010.gif._CB483158141_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p>Today, I want to talk to you about random number generation (RNG). Or, more accurately, pseudo-random number generation (PRNG). Technically speaking, computer software is really only capable of PRNG, as computers are mostly incapable of generating a truly random number. This is because computers are deterministic. So, when generating random numbers, the computer is following the same algorithm to generate the numbers. Generally, this means that the computer is using a “seed” and generating numbers based on that seed. If the seed never changes, the result of generation never changes. Considering that the data required to generate the random numbers is predefined, this means the generation is “pseudo random.&quot;<br /> <br /> Pseudo random is extremely useful because it can be controlled. You can use the same seed every time to help track down bugs, and to easily replicate generation outcomes over and over for testing.</p> <p>In this blog, we will go over a couple of different examples of how to use PRNG, and how to control the seed. As usual, I will be using GameMaker Studio as my dev environment, but pretty much every programming language has similar functions built in. Rarely would you ever need to write your own random generation functions. However, if you are interested in doing so, I will link to some documentation at the end of the blog.</p> <h2>Generating some random numbers</h2> <p>We are going to start simple by generating a series of numbers that range from 0 - 9, and printing them to the screen. Since I am using GameMaker Studio as my dev environment, it is important to note that by default, GameMaker Studio will always use the same seed unless specifically told otherwise. So if you are using Game Maker Studio as well, and you do NOT want to use the same seed (which for this section we don’t), you will need to make sure you call the <strong>randomize()</strong> function before you do your RNG code.<br /> <br /> The <strong>randomize()</strong> function in GameMaker Studio randomizes the seed every time you run your game. If you didn’t call this function, everyone who plays your game could end up with the same seed and as such, have the same outcomes for all randomly generated content! This actually happened fairly recently with a port of a very famous AAA RPG series. When the game was originally released on the PS2, the seed used for RNG was based on the system's&nbsp;internal clock. So, when the game was ported to other platforms, there was no PS2 system clock to check! This resulted in every player having the same exact seed.<br /> <br /> The first thing you should do is familiarize yourself with the random functions provided in your language of choice. For me the big ones are <strong>random(), irandom(), random_range(), </strong>and <strong>irandom_range()</strong>. These functions are nearly identical except irandom only returns whole numbers. Most of the time, I use irandom over random for that exact reason, but it really depends on what you are trying to accomplish.</p> <p>In the example code below, I am generating a list of 10 random numbers that range from 0-9. After that, I simply draw the numbers to the screen that are in the list. A note about <strong>irandom</strong> is that it returns a random value between 0 and the number in the brackets. So this this case, it returns any number between and including 0-9.</p> <p><strong>Create event</strong></p> <pre> <code>number_list = ds_list_create(); for(i = 0; i &lt; 10; i++){ n = irandom(9); ds_list_add(number_list,n); }</code></pre> <p>In the draw event, we read the numbers from the list using another for loop, and draw them to the center of the screen.</p> <p><strong>Draw event</strong></p> <pre> <code>for(i = 0; i &lt; ds_list_size(number_list); i ++){ n = ds_list_find_value(number_list,i); draw_text(room_width / 2 + (i - 5)* 32, room_height / 2, n); }</code></pre> <p><img alt="Image-PRNGbasics-1011.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/NathanRanneyblogposts/Image-PRNGbasics-1011.gif._CB483158115_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> I know this isn’t terribly exciting, but understanding the basics is key. I often create a handful of RNG functions for things like dice rolls, determining a percent chance, or a coin flip. Here are some examples of those.<br /> <br /> <strong>Dice roll function</strong></p> <pre> <code>i = irandom_range(1,6); return i</code></pre> <p>This is about as basic as a dice roll gets. We simply return a random number between 1 and 6. You can use this function for all kinds of things. Consider a tabletop game like Warhammer, where you may need to roll a die and get a value that is equal to or greater than a certain value to damage your opponent.</p> <p>Here is what that might look like using the above function.</p> <pre> <code>n = number to beat if (dice() &gt;= n ) { //deal some damage }{</code></pre> <p>A similar check based on percentage is very very similar. Say you have an RPG and your character has a 45% chance to hit the target. Your check may look something like this.</p> <pre> <code>//my percentChance function if (irandom_range(1, 100) &lt;= argument[0]) { return true; } else { return false; } //when you are checking to see if your character hits if(percentChance(45)){ hit = true; }else{ hit = false; }{</code></pre> <p>When doing a coin flip, you are essentially doing the same thing as a percent chance check, except its always going to be 50/50.</p> <pre> <code>//my coin function if(irandom_range(1,100) &lt;= 50){ return true; }else{ return false; } //calling the coin function in code if(coin()){ //do something if true }{</code></pre> <h2>Closing comments</h2> <p>You can use this to randomly generate pretty much anything in your game. In the example below, I am using RNG to set a random horizontal speed, vertical speed, spawn position, random ranges for each RGB value, sprite, the number of little guys that are spawned, and sprite direction!<br /> &nbsp;</p> <p><img alt="Image2-PRNGbasics-1010.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/NathanRanneyblogposts/Image2-PRNGbasics-1010.gif._CB483158141_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> And here I am using RNG to generate caves for a top down game. I will show you all how to do this in the next blog entry by using Cellular Automata (it's not as complicated as it sounds).<br /> &nbsp;</p> <p><img alt="Image3-PRNBbasics-1010.gif" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/NathanRanneyblogposts/Image3-PRNBbasics-1010.gif._CB483158143_.gif?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> I hope this blog entry helped open your eyes a bit to how RNG can be used&nbsp;and that it's&nbsp;not quite as intimidating as it sounds. I mean, most of the work is done for you with built in random functions!</p> <p>Next time, we will learn to wrangle RNG a little more and create some cool environments.&nbsp;</p> <h2>Additional reading</h2> <ul> <li><a href="https://www.geeksforgeeks.org/pseudo-random-number-generator-prng/" target="_blank">PRNG formula</a></li> <li><a href="https://docs.yoyogames.com/source/dadiospice/002_reference/maths/real%20valued%20functions/index.html" target="_blank">Game Maker Studio real number functions (includes random functions)</a></li> <li><a href="http://mathworld.wolfram.com/ElementaryCellularAutomaton.html" target="_blank">Cellular Automata</a></li> </ul> <p style="text-align:center">&nbsp;</p> <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 game development studio <a href="http://www.gutterarcade.com" target="_blank">Gutter Arcade</a>. He's best known for the creation and development of Knight Club, an online indie fighting game.&nbsp;</em></p> /blogs/appstore/post/a4874533-a4e4-4730-bed8-8be019d3a3f7/game-audio-part-2-applying-mixing-concepts-into-a-game Game Audio Part 2: Applying Mixing Concepts into a Game Emily Esposito Fulkerson 2018-10-09T16:40:17+00:00 2018-10-09T16:41:58+00:00 <p><img alt="Sound_mix_Opt2_a.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/DannyB/Sound_mix_Opt2_a._CB483927873_.jpg?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> In my <a href="https://developer.amazon.com/blogs/appstore/post/6dfaf872-474e-444a-bc77-73cadb710d49/game-audio-making-room-in-a-mix" target="_blank">previous blog post</a>, we went over some basic tools and terminology for audio engineering. Now that we have an appreciation of the basic sculpting tools available to us, let’s talk about a holistic approach to the soundscape.</p> <p><img alt="Sound_mix_Opt2_a.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/DannyB/Sound_mix_Opt2_a._CB483927873_.jpg?t=true" style="display:block; margin-left:auto; margin-right:auto" /><br /> In my <a href="https://developer.amazon.com/blogs/appstore/post/6dfaf872-474e-444a-bc77-73cadb710d49/game-audio-making-room-in-a-mix" target="_blank">previous blog post</a>, we went over some basic tools and terminology for audio engineering. Now that we have an appreciation of the basic sculpting tools available to us, let’s talk about a holistic approach to the soundscape. In order to understand how to approach sound effect selection, application, and balance, it helps to visualize the balance of a finished (or interactive!) piece of audio like a pyramid, with the width corresponding to presence in the mix.<br /> <br /> &nbsp;</p> <p><img alt="image1-gameaudiopart2-sept2018.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/DannyB/image1-gameaudiopart2-sept2018._CB483927875_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p style="text-align:center"><em>The wider parts of the pyramid have more room for sound, especially since the higher frequency stuff fatigues the ear super fast.</em><br /> &nbsp;</p> <p>The human ear gets tired of higher frequencies much more easily than lower ones. Think of the sound of a heartbeat - a muffled, low frequency sound, opposed to a baby crying&nbsp;or a piccolo playing in a marching band. A heartbeat is primarily low frequency&nbsp;and doesn’t “pierce” in the same way a baby’s squeal or piccolo does.&nbsp;Use this understanding to help shape your game’s sound mix. If sound effects with frequencies in the “baby crying” zone are constantly playing, then no sound effects will seem more important than the others, you will irritate the player, and you will forfeit&nbsp;an entire avenue of gameplay state communication.</p> <p>Let’s start with a straightforward example: a&nbsp;platformer game with a driving soundtrack and loud, bombastic sound effects like explosions, gunshots, electricity zaps, etc. The balance of the audio is approximately 60% music, 40% SFX.</p> <p>You’ve got the base music track looping in the background. Since the music is intended to fill space and provide continuity in the experience, it’s mixed loudly and evenly. The low end is saturated with a kick drum and bass instrument that fill out the low end. The first thing you can do is ensure that low frequency content in the SFX doesn’t interfere with the music’s low end.</p> <p>Think back to our tools, now. How do we do this? With EQ! You can generally take out lots of low frequency content from a sound without affecting the way it sounds.&nbsp;It’s pretty wild, actually - the human ear is SO GOOD at deriving pertinent information from an audio signal&nbsp;that it automatically filters a lot of it out anyway.&nbsp;And, in general, the more inaudible content you cut, the more headroom you’ve got overall.</p> <p><a href="https://drive.google.com/open?id=1N7zSHRMpHgGKxOx9bFwsyv8-uP4PVIMy" target="_blank">Here’s an example</a>: I wrote a quick synth dittie in Sylenth1 and directly exported it with no processing (good speakers or headphones recommended!).&nbsp;</p> <p>Now, <a href="https://drive.google.com/open?id=1g4gplijNPgulYeO_qnSjkmPnD9Zaeoip" target="_blank">here’s the same exact sample, but with a low cut filter applied</a>.</p> <p><img alt="image2-gameaudio-sept2018.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/DannyB/image2-gameaudio-sept2018._CB483927901_.png?t=true" style="display:block; height:423px; margin-left:auto; margin-right:auto; width:500px" /></p> <p>You should be able to hear that the boomy, bassy, low end is drastically reduced, but the character of the sound is retained. This is super useful! In music, if you want a kick drum to be the fundamental low end of your track, this helps make room for it, and if you mix properly, you won’t even miss the low end of the synth. It can actually sound bigger! Remember, if EVERYTHING sounds big, then NOTHING sounds big.</p> <p>You might approach this entirely differently in a different game, but for this example, the music is a driving force to the experience and should be considered the “base” layer. That’s not to say certain SFX shouldn’t overcome the mix at some point and take over! We’ve got room in the upper levels of the pyramid, check it out:<br /> &nbsp;</p> <p><img alt="image3-gameaudio-sept2018.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/DannyB/image3-gameaudio-sept2018._CB483927903_.png?t=true" style="display:block; margin-left:auto; margin-right:auto" /></p> <p><br /> The pyramid generally applies to a longer timescale - it can be upset and flipped-turned-upside-down at will for effect. Horror movies, for example, often crank up the high frequencies in the score to make the listener irritated or anxious. Listen for that next time you watch a horror movie.</p> <p>You can also ensure that the music and SFX are not too “spiky” by making sure they’re compressed when necessary. Remember that compression smooths out the average volume of a sound, so it’s much easier to layer on other audio without causing problematic imbalances.</p> <h2>That’s cool I guess, but what does it sound like?</h2> <div> I’m glad you asked. Let’s expand on our masterpiece from earlier. I added some basic drums, bass guitar, and organ to the synth dittie from earlier. <a href="https://drive.google.com/open?id=1N7zSHRMpHgGKxOx9bFwsyv8-uP4PVIMy" target="_blank">Here’s what it sounds like</a> when you just plop the tracks right in, with no processing.&nbsp; </div> <div> <p>Here’s the problematic stuff I hear:</p> <ul> <li> <p>The synth from the first example kind of taking over - it’s stepping all over the bass guitar, kick, everything.</p> </li> <li> <p>The kick drum is having a lot of trouble coming through, there are so many bass frequencies all over that it can’t find a home!</p> </li> <li> <p>The organ has very little definition or character, it’s just…. sitting there.</p> </li> <li> <p>The bass guitar is also having trouble getting through.</p> </li> </ul> <p>So <a href="https://drive.google.com/open?id=1fvERHVkPQJYbqOqdeTqnA1JBJ0kFkSUU" target="_blank">here’s what it sounds like</a> after some basic EQ and compression.&nbsp;</p> <p>Here’s what I did:</p> <ul> <li> <p>Low-cut the synth, so that the low end that isn’t really the focus of the sound isn’t interfering with other low end instrument. I also put some moderate compression on it to even out the dynamics. It’s a very “jumpy” sound, and I wanted to retain some of that, but tame it enough to let other elements of the mix have a turn.</p> </li> <li> <p>Increased volume of the kick&nbsp;and added a bit of bass around 80Hz to give it some low end&nbsp;to make up for the loss of low end in the synth.</p> </li> <li> <p>Compressed the drum kit (with a type of compression called parallel compression, where I blend part of the original signal in with the compressed signal to even out the volume, but retain some of that pop! bang! bap! feeling).</p> </li> <li> <p>Compressed the bass guitar&nbsp;just enough to allow the tone of it to come out more, without sacrificing the sound of the strings being plucked.</p> </li> <li> <p>Put a compressor on the master. A very mild and slight compression on the whole mix can serve to even out levels and “glue” the elements together. This is a very hazardous art, however! Be careful with <em>any </em>effects on the master - especially compression. A little goes a long way, but too much can absolutely demolish the mix you’ve spent hours/days/years/lifetimes perfecting.</p> </li> </ul> <p>Once you understand the fundamentals here of a music mix, game sound effects will be much easier. Fitting the ever-so-slightly random hits of a drum kit into a mix is not that different from mixing punches, shots, and explosions on top of a music track in-game. The most important takeaway here is that digital audio tools are <strong>immensely powerful</strong>, even just&nbsp;a basic EQ and compression pass can make something sound way more polished and professional.&nbsp;It also serves to even out volumes and to make stacking elements much easier and less fatiguing for the listener.</p> <p>Audio processing goes <em>much</em> deeper, but hopefully with these basics you can get a better grip on your game’s mix and get it sounding great.</p> <p>&nbsp;</p> </div> <p style="text-align:center"><img alt="DannyBheadshot.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Influencerblogs/DannyBheadshot._CB500305160_.png?t=true" /></p> <p style="text-align:center"><em>Danny Baranowsky is a composer, musician and larger-than-life personality living in Seattle, Washington by way of Mesa, Arizona.&nbsp;Over the past decade, Danny has risen to the top of his field, composing the music for best-selling games Canabalt, Super Meat Boy, The Binding of Isaac, Desktop Dungeons, Crypt of the Necrodancer, and more.&nbsp;This year, Danny looks to expand his musical misadventures - working on solo material, game prototypes, chicken dinners, and even a live set! No task is too tall for Danny (he is 6’4”). Keep on the lookout for <a href="https://dbsoundworks.bandcamp.com/" target="_blank">more music</a> and <a href="https://twitter.com/dannyBstyle" target="_blank">tweets</a> regarding the refresh rates and input latency of OLED monitors in the future.</em></p> /blogs/appstore/post/139b0361-095f-44ec-b884-fbb1636091e1/case-study-how-chinese-developers-in-japan-launch-timely-exclusive-titles-on-the-amazon-appstore Case Study: How Chinese Developers in Japan Launched Timely, Exclusive Titles on the Amazon Appstore Nanaho Nishiyama 2018-10-04T23:27:29+00:00 2018-10-04T23:29:37+00:00 <p><img alt="top.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/top._CB470197186_.jpg?t=true" /></p> <p>The Amazon Appstore Japan team sat down with FightSong Inc., the company who developed and operate &quot;Abandoned Girls.” We heard the story of Abandoned Girls’ development in China to the release in Japan, and their unique perspective on the Amazon Appstore.<br /> &nbsp;</p> <p><img alt="top.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/top._CB470197186_.jpg?t=true" /></p> <p>In Japan, there are many games based on historical events and well-known figures. One such game is &nbsp;“Abandoned Girls” (Houchi Shojo in Japanese), a smartphone RPG game inspired by the Three Kingdoms era* of Chinese history, using female protagonists instead of the well-known male figures. The game is fully automated, allowing users to up-level their characters without needing to open their app.<br /> &nbsp;<br /> The growing popularity of this smartphone app reached new heights in 2018, with a 13x increase in sales on Amazon Appstore compared to 2017.&nbsp;<br /> &nbsp;<br /> The Amazon Appstore Japan team sat down with FightSong Inc., the company who developed and operate &quot;Abandoned Girls.” We heard the story of Abandoned Girls’ development in China to the release in Japan, and their unique perspective on the Amazon Appstore.<br /> &nbsp;<br /> We spoke with Yo Rei, who was one of the people who brought Abandoned Girls to life, and Nanami Ota, who is currently handling marketing.</p> <p><em>*Three Kingdoms era of Chinese history: The warring states period that followed the dissolution of the Han dynasty in the third century. It is popular in both Japan and China.</em></p> <p>&nbsp;</p> <table border="0" cellpadding="1" cellspacing="1"> <tbody> <tr> <td><img alt="rei-sama-150.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/rei-sama-150._CB470197208_.png?t=true" /></td> <td> <p><strong><strong>Yo Rei</strong></strong><br /> Operation manager at FightSong Inc.<br /> <br /> Joined the FightSong Inc. team upon graduating from university.<br /> Has been overseeing game and social media operations for Abandoned Girls since its earliest stages of development.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p> </td> </tr> </tbody> </table> <table border="0" cellpadding="1" cellspacing="1"> <tbody> <tr> <td><img alt="ohta-sama-150.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/ohta-sama-150._CB470197214_.png?t=true" /></td> <td> <p><strong><strong>Nanami Ota</strong></strong><br /> Marketing representative at FightSong Inc<br /> <br /> Joined FightSong Inc. in January of 2018 after working in the fashion industry.&nbsp;<br /> Worked on the one-year anniversary campaign for Abandoned Girls and is currently in charge of smartphone game marketing.</p> </td> </tr> </tbody> </table> <p>&nbsp;</p> <h2>Introducing the smartphone app: Abandoned Girls</h2> <p><strong>- Please tell us a little bit about your app.</strong><br /> &nbsp;<br /> Ota: <a href="http://amzn.asia/d/c9X37jF">Abandoned Girls</a>&nbsp;is a game app inspired by the Three Kingdoms era of Chinese history. It is a fully automated RPG game with female leads who can up-level on their own.<br /> &nbsp;<br /> As your character grows stronger, you are able to join forces with other users. As these unions gain ranks, they are able to participate in Courtesan Wars and the stronger unions are able to participate in Conquests.</p> <p>We had over 200,000 pre-registrations when we released the app in March 2017 in Japan. Seeing as we currently have about 130,000 daily active users, our repeat rate is over 45%. &quot;</p> <p>&nbsp;</p> <p><img alt="houchi-app-collage.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/houchi-app-collage._CB470197210_.jpg?t=true" /></p> <p><em><em>*The female protagonists of Abandoned Girls<em> </em>will continue to level up regardless of whether or not the app is open. This is one element that has contributed to its wide fan base, which includes gamers who either dislike or do not have the time for the “grinding” typically associated with RPGs.</em></em></p> <p>&nbsp;</p> <p><strong><strong>- There was a lot of buzz about Abandoned Girls’ one-year anniversary campaign.</strong></strong><br /> <br /> Rei: “Right. We ran TV commercials for the one-year anniversary this past March. The commercial starred idol Nana Asakawa. We also did a 24-hour live program on the popular Japanese live streaming service Niconico, featuring five guest actors.<br /> <br /> During our Niconico Live event, we broadcasted our commercial over one of the world's largest pedestrian intersections in Shibuya. As a result, we had over 130,000 viewers online contributing over 60,000 comments. The campaign proved to be a great opportunity to attract new users. &quot;<br /> &nbsp;</p> <p>&nbsp;</p> <p style="text-align:center"><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/waTHUXUWMzc" width="560"></iframe><br /> * The commercial for Abandoned Girls’ one-year anniversary.<br /> It has attracted over one million views on YouTube.</p> <p>&nbsp;</p> <p>&nbsp;</p> <h2>App release in Japan</h2> <p><strong><strong>- So Rei, I suppose you have been a witness to <strong><strong>Abandoned Girls</strong></strong>’ development since the very beginning.</strong></strong><br /> <br /> Rei: “I have. Our first title in Japan was “Abandoned Empire” (Houchi Teikoku). After that, we came out with Abandoned Girls, which had a development period of about three months. &quot;</p> <p>&nbsp;</p> <p><strong><strong>- That’s very fast. Did you expect it to be so popular with Japanese gamers?</strong></strong><br /> <br /> Rei: &quot;We pulled a lot of all-nighters. We wanted it to be a hit. But you know, when we initially released Abandoned Girls, we were just a three-person team, the president of the company included. So, as you can imagine, it was pretty rough. We’ve grown our ranks since, but we really started out with nothing. &quot;<br /> <br /> Ota: &quot;I make sure to consult with Rei when working on promotions. Abandoned Girls is her baby after all. &quot;<br /> <br /> Rei: &quot;I was there from the very beginning, so it has a special place in my heart. It’s by no means perfect, however. There’s still room to grow. &quot;<br /> &nbsp;</p> <p><img alt="DSC_3776.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/DSC_3776._CB470200204_.jpg?t=true" /></p> <p>&nbsp;</p> <h2>Reasons behind releasing on the Amazon Appstore before wide release</h2> <p><strong><strong>- FightSong has made a point of debuting titles like Abandoned Girls and Light vs Shadow: FightSong on Amazon Appstore a week ahead of your wide releases. We are both very thankful for your support, and also curious what helped you make that decision.</strong></strong><br /> <br /> Ota: &quot;In all honesty, we prefer to debut on Amazon as a means to “test the water,” so to speak. We think of it as a trial run, a closed beta testing. Our core users frequent the Amazon Appstore, so we want to get their reactions first, and then proceed with any necessary adjustments. &quot;</p> <p><br /> <br /> <strong><strong>- How has this strategy worked out?</strong></strong></p> <p>Ota: &quot;It’s more cost- and time-effective than closed beta testing and since our core users are mostly on Amazon, there’s a great opportunity for collecting feedback.<br /> <br /> Also, in terms of sales, about 5% has been driven by Amazon. And as of July 2018, it was more like 8%. The average revenue per paid user is high, and there is a solid daily return rate and return on advertising. &quot;<br /> &nbsp;</p> <p><strong><strong>- Has this made more work for your development team?</strong></strong></p> <p>Ota: &quot;Our developers had to implement in-app purchases and a login page specifically for Amazon, but these apparently didn’t take much time to implement. Releasing on Amazon hasn’t particularly affected our workload. &quot;<br /> &nbsp;</p> <p><strong><strong>- Are you sure you are not holding anything back? Have you really not encountered any trouble?</strong></strong></p> <p>Ota: &quot;Really, I’m not lying (laughs). We haven’t encountered any trouble, and our developers agree. I hear that the whole process went smoothly, from testing to the release. It all went as planned. &quot;<br /> &nbsp;</p> <p><img alt="3.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/3._CB470057786_.jpg?t=true" /></p> <p>&nbsp;</p> <p>&nbsp;</p> <h2>The future</h2> <p><strong><strong>-What is FightSong currently turning its attention towards?</strong></strong><br /> <br /> Ota: &quot;Recently, there’s been a number of Abandoned Girls copycats popping up, both in China and Japan, so we need to get serious about taking actions on that. Games featuring beautiful female protagonists are popular, and Abandoned Girls offers a very convenient system. This has led to a surge in “inspired” games as well as downright knock-offs.&quot;</p> <p>&nbsp;</p> <p><strong><strong>- And lastly, what's next for FightSong?</strong></strong><br /> <br /> Ota: &quot;We would like to establish Abandoned Girls as a famous IP!&quot;<br /> <br /> Rei: &quot;I hope we can build a brand and get people from all over the world to enjoy it. &quot;<br /> &nbsp;</p> <p><strong><strong>- What plans does FightSong have to build its brand?</strong></strong></p> <p>Ota: &quot;We’re working on creating a manga as well as some other merchandising goods and soundtracks etc. It would be great if we could sell all of them on Amazon. &quot;<br /> &nbsp;</p> <p><img alt="1.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/1._CB470057791_.jpg?t=true" /></p> <p>&nbsp;</p> <p><em>* This article was translated from Japanese. You can read the original post <a href="https://developer.amazon.com/ja/blogs/appstore/post/4f7d07ba-f99a-4fee-9eef-ed34ee5b7681/japan-voice-of-developers-houchi-shojo">here</a>.</em></p> <p>&nbsp;</p> <hr /> <p>&nbsp;</p> <ul> <li><u><a href="https://www.amazon.co.jp/dp/B06WW7MK6N/ref=cm_sw_r_cp_ep_dp_mN7ABb4N1V4FA">Click here to download “Abandoned Girls (Houchi Shojo)” from the Amazon Appstore</a> (Transfer to Amazon.co.jp page)</u><br /> &nbsp;</li> <li><u><a href="https://developer.amazon.com/ja/apps-and-games">Attention app developers: Click here to learn more about publishing Android apps on the Amazon Appstore</a></u><br /> &nbsp;</li> <li>Related articles: <ul> <li><u><a href="https://developer.amazon.com/ja/blogs/appstore/post/502737fb-1bc1-4374-b5eb-a473bb59ff18/case-study-a-success-story-of-japanese-developers-using-ip-content">Case Study: How Japanese Developers Are Successfully Using IP Content</a></u></li> </ul> </li> </ul> <p>&nbsp;</p> <hr /> <p>&nbsp;</p> <p><img alt="2.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/JPAppstore/2._CB470057785_.jpg?t=true" /></p> <p>&nbsp;</p> <hr /> <p>&nbsp;</p> <ul> <li>Interviewer: Tomoharu Yamada</li> <li>Article writer &amp; photographer: Nanaho Nishiyama</li> <li>Editors: Cathleen Jia, Emily Esposito Fulkerson</li> </ul> <p>&nbsp;</p> /blogs/appstore/post/0a0768a8-90d4-4bcc-b1e1-e83b1fac2ac2/fire-tv-edition-smart-tvs-now-available-in-canada-with-french-canadian-option Fire TV Edition Smart TVs Now Available in Canada, with French Canadian Option Emily Esposito Fulkerson 2018-10-03T17:12:21+00:00 2018-10-03T18:33:17+00:00 <p><img alt="Toshiba-FTVE-header-900x400.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/Toshiba-FTVE-header-900x400._CB482785883_.png?t=true" /></p> <p>Today, we are excited to announce two TVs, <a href="https://www.amazon.ca/dp/B07HCXBB2Q/ref=twister_B07HR1Y4S9" target="_blank">Fire TV Edition - Toshiba 4K (2018)</a> and <a href="https://www.amazon.ca/dp/B07GSFYVX9/ref=twister_B07HR2HPS3" target="_blank">Fire TV Edition - Toshiba HD (2018)</a>, will be available for pre-order in Canada, exclusively at Best Buy retail locations and online at BestBuy.com.</p> <p style="margin-left:40px"><img alt="Toshiba-FTVE-header-900x400.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/Toshiba-FTVE-header-900x400._CB482785883_.png?t=true" /></p> <p>Last month,<a href="http://phx.corporate-ir.net/phoenix.zhtml?c=176060&amp;p=irol-newsArticle&amp;ID=2343141"> </a><a href="https://developer.amazon.com/blogs/appstore/post/8b07fd3d-dcb2-4642-bffb-a082f13db3b2/amazon-and-best-buy-announce-exclusive-partnership-to-offer-new-fire-tv-smart-edition-tvs" target="_blank">we announced a multi-year collaboration with Best Buy</a> to bring the next generation of Fire TV Edition smart TVs to customers in the United States and Canada. Today, we are excited to announce two TVs, <a href="https://www.amazon.ca/dp/B07HCXBB2Q/ref=twister_B07HR1Y4S9" target="_blank">Fire TV Edition - Toshiba 4K (2018)</a> and <a href="https://www.amazon.ca/dp/B07GSFYVX9/ref=twister_B07HR2HPS3" target="_blank">Fire TV Edition - Toshiba HD (2018)</a>, will be available for pre-order in Canada, exclusively at Best Buy retail locations and online at BestBuy.com.<br /> <br /> Combining true-to-life picture quality with the Fire TV experience built in, the smart TVs seamlessly integrate your favorite content on the home screen, including live over-the-air TV broadcasts, and streaming apps and channels. The <a href="https://www.amazon.ca/dp/B07HCXBB2Q/ref=twister_B07HR1Y4S9" target="_blank">Fire TV Edition - Toshiba 4K (2018)</a> supports up to 4K resolutions at 60 fps and HDR10, and is available in 43”, 50”, and 55” sizes. The <a href="https://www.amazon.ca/dp/B07GSFYVX9/ref=twister_B07HR2HPS3" target="_blank">Fire TV Edition - Toshiba HD (2018)</a> provides high-quality 2K streaming and is available in 32”, 43”, and 49” sizes.<br /> <br /> For developers, these two new smart TVs add yet another way to reach potential customers, expanding your audience to Canadian customers. You also have the option to publish your media streaming app with French Canadian support, creating a better experience for your French Canadian users.</p> <h2>Bring your apps to life with voice control</h2> <p>With the included Alexa Voice Remote, your customers can use speech to interact with their living room environment. Want to create a voice-forward experience for your customers? Here are two options to enable voice control in your apps:</p> <ol> <li>Integrate your English and/or French Canadian media catalog with Amazon Fire TV so your content can be included in universal browse and search results. And, regardless of where users find your content in the Fire TV interface, they can play it directly without needing to open your app first. <a href="https://developer.amazon.com/docs/catalog/integrating-your-catalog-with-fire-tv.html" target="_blank">Click here to learn more</a>.</li> <li>Check to see if you have already implemented the Media Sessions API. If you have, all you need to do is add the permission to the manifest file and implement voice commands for transport controls like play, pause, resume, rewind, fast-forward, and skip content. If you haven't, <a href="https://developer.amazon.com/blogs/appstore/post/623addd5-6184-4e7f-a969-123a653cfb1a/implementing-voice-control-with-the-media-session-api-on-amazon-fire-tv" target="_blank">click here</a> to get started with Media Session and <a href="https://developer.amazon.com/docs/fire-tv/mediasession-api-integration.html" target="_blank">click here</a> to view the Media Session tech docs.</li> </ol> <h2>Get your Fire TV app ready</h2> <p>If you currently have apps or games on Fire TV, be sure to upgrade them to Fire OS 6 so that they are compatible with the new smart TVs. Notable changes from Fire OS 5 to Fire OS 6 include checking permissions at runtime and linking to private libraries. To learn more about upgrading to Fire OS 6, <a href="https://developer.amazon.com/docs/fire-tv/fire-os-6.html" target="_blank">click here</a>.<br /> <br /> If you’ve never released an app or game for Fire TV, head over to <a href="https://developer.amazon.com/docs/fire-tv/getting-started-developing-apps-and-games.html" target="_blank">Getting Started Developing Apps (Amazon Fire TV)</a> for a quick intro. You’ll learn about development options (for example, native versus web apps), device and media specifications, and APIs that are available to you.</p> /blogs/appstore/post/0b87755f-d37e-411b-96ba-66c774c2c6bc/introducing-amazon-fire-tv-stick-4k-and-the-all-new-alexa-voice-remote-with-device-control Introducing Amazon Fire TV Stick 4K and the All-New Alexa Voice Remote with Device Control Emily Esposito Fulkerson 2018-10-03T16:15:56+00:00 2018-10-03T16:18:33+00:00 <p><img alt="FireTVStick-hero-1003.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/FireTVStick-hero-1003._CB482787215_.png?t=true" /></p> <p>Today, we're excited to announce the Fire TV Stick 4K, the most powerful streaming media stick available, plus an all-new Alexa Voice Remote, are available together for customers in the United States, Canada, United Kingdom, Germany, India, and Japan.</p> <p><img alt="FireTVStick-hero-1003.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/FireTVStick-hero-1003._CB482787215_.png?t=true" /></p> <p>Today, we're excited to announce the <a href="https://www.amazon.com/dp/B079QHML21/" target="_blank">Fire TV Stick 4K</a>, the most powerful streaming media stick available, plus an all-new Alexa Voice Remote, are available together for customers in the United States, Canada, United Kingdom, Germany, India, and Japan.<br /> <br /> Over 80% more powerful than the best-selling Fire TV Stick, Fire TV Stick 4K features a new quad core, 1.7GHz processor, delivering a fast streaming experience, quicker load times, and brilliant picture quality. Plus, Fire TV Stick 4K gives you access<strong> </strong>to the vast catalog of content currently available on Fire TV including thousands of 4K Ultra HD, Dolby Vision, and HDR10+ titles.<br /> <br /> For developers, the Fire TV Stick 4K adds another way to reach potential customers from around the world. When you publish on the Amazon Appstore and target Amazon Fire TV, your media streaming apps will be available on the Fire TV Stick 4K.</p> <h2>Enjoy brilliant 4K picture and immersive sound<em> </em></h2> <p>Fire TV Stick 4K is the first streaming media stick available with Dolby Vision. Finding 4K content has never been easier on Fire TV—just say “Alexa, find 4K TV shows” or “Alexa, watch <em>Tom Clancy’s Jack Ryan</em>.” With a growing catalog of Dolby Atmos content, customers can also enjoy 3D surround sound when connected to compatible home audio systems.</p> <h2>Experience far-field voice recognition</h2> <p>Pair Fire TV Stick 4K with your favorite Echo device and Alexa will control your content hands-free using far-field voice recognition. Getting started is easy: if you have only one Fire TV, your Echo device will pair as soon as you ask Alexa a question that includes Fire TV, for example, “Alexa, show me comedies on Fire TV.”<br /> <br /> Developers can use the <a href="https://developer.amazon.com/alexa-skills-kit" target="_blank">Alexa Skills Kit</a> to add capabilities, or skills, to Alexa. Skills enable customers to play music, get the latest news, sports scores, and more. Visit <a href="https://developer.amazon.com/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html" target="_blank">our developer portal</a> to start building skills for Alexa.</p> <h2>Do more with the all-new Alexa Voice Remote</h2> <p>Combining Bluetooth, multidirectional infrared technology, and powered by our proprietary cloud based service, the all-new Alexa Voice Remote allows you to power on your compatible TV and AV equipment, switch inputs, or tune to a channel on your cable box—all with a single remote. It also gives you even more control with dedicated power, volume, and mute buttons, along with the ability to use voice commands to find and control content.</p> <h2>Availability</h2> <p><a href="https://www.amazon.com/firetvstick4k" target="_blank">Fire TV Stick 4K</a> is available for pre-order on Amazon for $49.99 and will start shipping on October 31 in the United States and Canada, and in the United Kingdom, Germany, and India on November 14. Fire TV Stick 4K is also available for pre-order in Japan and will ship before the end of this year.<br /> <br /> The all-new <a href="https://www.amazon.com/alexavoiceremote" target="_blank">Alexa Voice Remote</a> is available for pre-order as a standalone remote for $29.99 and will start shipping on October 31 in the United States and Canada and in the United Kingdom, Germany, and India on November 14. It is also available for pre-order in Japan and will ship before the end of this year.</p> <p>Eligible customers who purchase a Fire TV streaming media player in the United States, United Kingdom, Germany, and Japan will receive three months free of Amazon Music Unlimited, Amazon's premium music streaming tier with access to tens of millions of songs and thousands of playlists and personalized stations, combined with the magic of voice controls powered by Alexa.</p> <h2>Get started with media streaming apps</h2> <p>Amazon offers several tools to help you accelerate development for streaming media apps. <a href="https://developer.amazon.com/public/solutions/platforms/webapps/docs/the-web-app-starter-kit-for-fire-tv" target="_blank">Web App Starter Kit for Fire TV (WASK)</a> is a full-featured customizable HTML5 web app template designed for quickly creating dynamic media apps suited for the 10-foot experience. <a href="https://developer.amazon.com/public/solutions/devices/fire-tv/docs/fire-app-builder-overview" target="_blank">Fire App Builder</a> provides a Java-based framework that you can use to easily and quickly build streaming media Android apps for Amazon Fire TV. Finally, <a href="https://creator.amazon.com/" target="_blank">Amazon Creator</a> is a simple-to-use web tool that allows you to create a Fire TV app in minutes, with no coding required.<br /> <br /> For more information on Amazon's dedicated tools and templates, download our free eBook, “<a href="http://m.amazonappservices.com/fire-tv-ebook" target="_blank">How to Develop Media Streaming Apps for Amazon Fire TV</a>.&quot;</p> <p>To view the tech docs for Fire TV Stick 4K, <a href="https://developer.amazon.com/docs/fire-tv/device-specifications.html?v=ftvstick4kgen1" target="_blank">click here</a>.</p> /blogs/appstore/post/1974d6f6-d00d-4a23-8b96-635b2610ab97/how-to-improve-the-user-experience-with-edittext-on-amazon-fire-tv How to Improve the User Experience with EditText on Amazon Fire TV Emily Esposito Fulkerson 2018-10-02T17:35:08+00:00 2018-10-02T17:35:08+00:00 <p><img alt="Image1-EditText-Francesco.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/Image1-EditText-Francesco._CB482475886_.jpg?t=true" style="display:block; height:394px; margin-left:auto; margin-right:auto; width:800px" /><br /> The experience on Fire TV requires you to think about designing for the 10-foot experience as well as taking into account different control interfaces, like a remote and voice capabilities.</p> <p>When creating an app for TV, it is a common misconception to assume that the same UX will work for both mobile platforms and Fire TV. The experience on Fire TV requires you to think about designing for the 10-foot experience as well as taking into account different control interfaces, like a remote and voice capabilities.<br /> <br /> From a customer perspective, one of the most frustrating TV experiences is being forced to input text using a remote, like when entering a username or password.<br /> <br /> Amazon provides features, like <a href="https://login.amazon.com/" target="_blank">Login with Amazon</a>, to improve the experience in a scenario like this, yet there are times when customers still need to input text.<br /> <br /> In the example below, which replicates a common app login interface, the customer needs to go through two EditText controls and then click on the sign up button to complete the process.</p> <p>&nbsp;</p> <p><img alt="Image1-EditText-Francesco.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/Image1-EditText-Francesco._CB482475886_.jpg?t=true" style="display:block; height:394px; margin-left:auto; margin-right:auto; width:700px" /></p> <p>&nbsp;</p> <p>Below is an example of the EditText to set up WiFi networks in the Fire TV settings. As you can see, above the text field is a label that reminds users what text they should enter.</p> <p>&nbsp;</p> <div> <img alt="Image2-EditText-Francesco.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/Image2-EditText-Francesco._CB482475880_.jpg?t=true" style="display:block; height:394px; margin-left:auto; margin-right:auto; width:700px" /> </div> <div> &nbsp; </div> <div> &nbsp; </div> <div> As a developer, you can make this UX more pleasant for your customers by using some extra parameters to the EditText control, which come in handy on Fire TV devices. <br /> <br /> Let’s explore the additional parameters in detail. In the picture below, the configurable elements have been highlighted. </div> <div> &nbsp; </div> <div> <p><img alt="Image3-EditText-Francesco.jpg" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/default/Image3-EditText-Francesco._CB482475882_.jpg?t=true" style="display:block; height:394px; margin-left:auto; margin-right:auto; width:700px" /></p> <p>&nbsp;</p> <p>The description labels (1) and (5) offer a way to describe the purpose or the context of the input. In the example of a username field, a label like “Enter your username” or “Username” would work well. For a login email, “Enter your login email” or “Email” would be better suited.<br /> <br /> The placeholder label can also display a practical example to help customers understand what kind of information needs to be added, separate from the description label, and it would disappear as soon as the user starts typing. For an email field, it could be “john.doe@xyz.com” or for a username field “john.doe.”<br /> <br /> Label (2) is useful to indicate the current step in a process of entering multiple inputs, like email and password, for example. By indicating the current step and the total number of steps in the process, the customer gets a better idea of how long it will take to complete the whole process.<br /> <br /> Finally, button labels (3) and (4) give the opportunity to customize the Back and Play/Pause button labels. Unless there are good reasons to do so, it is best to leave them with the default labels.<br /> <br /> Setting these parameters is simple, as outlined in the code below:</p> <div> <pre> <code>EditText userNameEditText = findViewById(R.id.usernameEditText); // gets the view Bundle extras = userNameEditText.getInputExtras(true); // set params through bundle extras.putString(&quot;label&quot;, &quot;This is a description label&quot;); // 1 - top of the input dialog extras.putString(&quot;description&quot;, &quot;This is the main description&quot;); // 5 - bottom of the input dialog extras.putString(&quot;backLabel&quot;, &quot;Example of Back Label&quot;); // 3 - back button label extras.putString(&quot;nextLabel&quot;, &quot;Example of Next Label&quot;); // 4 - next button label extras.putInt(&quot;fieldNumber&quot;, 3); // 2 - current step extras.putInt(&quot;fieldCount&quot;, 5); // 2 - total number of steps</code></pre> <p>Besides labeling the input fields, make sure the layout on which the EditText is displayed seamlessly transitions from one input field to the next using the Play/Pause and Back button. This makes the interface easy to navigate, improving the chances that the customer will go through all the input fields. In the example of the login interface, the EditText objects are children of a LinearLayout.<br /> <br /> This implementation is straightforward and can act as a quick win for apps that require user inputs with a keyboard.<br /> &nbsp;</p> </div> </div> <p>&nbsp;</p> /blogs/appstore/post/718c9a5a-c138-42c7-bec2-9cf156fcaaef/amazon-gameon-adds-support-for-team-based-competitions Amazon GameOn Adds Support for Team-Based Competitions Laura Pezdek 2018-09-28T17:40:38+00:00 2018-09-28T17:40:38+00:00 <p><img alt="team_blog_banner_r1t1_sk.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Laura/team_blog_banner_r1t1_sk._CB484439160_.png?t=true" style="display:block; height:400px; margin-left:auto; margin-right:auto; width:1000px" /></p> <p>Developers can now integrate competitions with leaderboards and prizes into team-based, multiplayer games using GameOn services and the new Team API methods.</p> <p><img alt="team_blog_banner_r1t1_sk.png" src="https://m.media-amazon.com/images/G/01/DeveloperBlogs/AppstoreBlogs/Laura/team_blog_banner_r1t1_sk._CB484439160_.png?t=true" style="display:block; height:400px; margin-left:auto; margin-right:auto; width:1000px" /></p> <p>Developers can now integrate competitions with leaderboards and prizes into team-based, multiplayer games using GameOn services and the new Team API methods. Multiplayer games are rising in popularity as it allows gamers to spend time playing with their friends and family. Players can form teams, clans, guilds, and more with others from all over the world and play together or battle others, all without boundaries. By bringing players together, developers can seed a community around their titles as players form teams and relationships globally.</p> <p>Integrating GameOn competitions into team-based games is just as simple as with single player games. Similar to single player games, developers with team competitions will submit individual player scores to GameOn. The main difference is that developers will also provide a player-to-team mapping (via the new Team API methods) so that GameOn can aggregate the scores to a team level. GameOn will then enable a leaderboard with team names and scores.<br /> <br /> Developers can still create the same type of competitions: single round, multi-round, and leagues, set number of attempts, allow ranking by a defined metric, and set entry requirements by location or custom-defined criteria. And, for the winners, developers can also offer in-game items as prizes to the members of the victorious team.</p> <h2><strong>Getting started</strong></h2> <p>To get started using the new Teams workflow, you'll need to create a new team via the <strong>POST /teams</strong> method. This call requires a maximum team size which is used by GameOn to limit the number of players that can be added. Next, you can add players to a team by calling <strong>PUT /teams/{teamId}/players </strong>or remove them with <strong>DELETE /teams/{teamId}/player</strong>. To get details about a team, including the team members, call the <strong>GET /teams/{teamId}</strong> method.<br /> <br /> After the teams are set up and players are assigned, you can enter the entire team into a tournament. From there, you'll enter a player as you would for a single-player tournament by calling <strong>POST /tournaments/{tournamentId}/enter. </strong>You'll need to provide the Team ID in the body of the request.<br /> <br /> Once a player is part of a team, you can call <strong>GET /matches/{matchId}/leaderboard</strong> to get the team leaderboard for the tournament. This allows you to get the leaderboard for any tournament and returns a team leaderboard. Finally, when you are ready to submit scores for that player, you can call <strong>PUT /matches/{matchId}/score.</strong> For team-based tournaments, the player's score will automatically contribute to the team that the player is representing.</p> <h2><strong>Redeeming team in-app prizes</strong></h2> <p>In team tournaments, the in-app prizes are awarded to each team member who submits a score in the tournament. Because of this, you want to ensure that the digital prize(s) used when creating the tournament can be claimed by multiple players in your game (i.e. you should avoid one-use codes). At the end of the tournament, every player in the winning team will redeem the same prize.<br /> <br /> It's important to note that only team members who submit a score will receive prizes. Any&nbsp;players on the team who do not submit at least one score before the tournament closes will not receive a prize.</p> <h2><strong>Get started with GameOn</strong></h2> <p>You can learn more about the new API methods for teams by checking out the teams documentation <a href="https://developer.amazon.com/docs/gameon/teams.html" target="_blank">here</a>.<br /> <br /> To learn more about GameOn, watch this video of a few developers who share their experience integrating it into their games.</p> <p><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/mJgosBMlf9Q" width="560"></iframe></p>