From 2e58ccec1f80cbdd5c9ea2997f529d626c5e2456 Mon Sep 17 00:00:00 2001 From: Kiki Prottsman Date: Mon, 22 Apr 2024 19:40:00 -0700 Subject: [PATCH] Adding Bubble Game Tutorial (#6400) --- docs/courses/summer-training.md | 4 +- docs/static/tutorials/bubbles/game.png | Bin 0 -> 21272 bytes docs/static/tutorials/bubbles/io2_title.png | Bin 0 -> 87630 bytes docs/test/tutorials/bubbles.md | 940 +++++--------------- docs/test/tutorials/spy/chase-the-pizza.md | 306 +++++++ docs/tutorials/bubbles.md | 218 +++++ 6 files changed, 749 insertions(+), 719 deletions(-) create mode 100644 docs/static/tutorials/bubbles/game.png create mode 100644 docs/static/tutorials/bubbles/io2_title.png create mode 100644 docs/test/tutorials/spy/chase-the-pizza.md create mode 100644 docs/tutorials/bubbles.md diff --git a/docs/courses/summer-training.md b/docs/courses/summer-training.md index 4b7d5817191..68e37a481ee 100644 --- a/docs/courses/summer-training.md +++ b/docs/courses/summer-training.md @@ -34,10 +34,10 @@ We will be hosting three **free** online trainings, leading up to a special in-p "labelClass": "orange ribbon large" },{ "name": "Micro:bit at CSTA", - "description": "Join us in Vegas on 6/16/24 for an introduction to using micro:bit in the classroom", + "description": "Join us in Vegas on 7/16/24 for an introduction to using micro:bit in the classroom", "url":"https://aka.ms/CSTA24reg", "imageUrl": "https://pxt.azureedge.net/blob/ce157b871e8d7330375d8dc8ade57d7426259ef4/static/electron-icons.icns", - "label": "In Person on 6/16/24", + "label": "In Person on 7/16/24", "labelClass": "black ribbon large" } ] diff --git a/docs/static/tutorials/bubbles/game.png b/docs/static/tutorials/bubbles/game.png new file mode 100644 index 0000000000000000000000000000000000000000..6218770f1d8f7a5017921e68a648a30351424c62 GIT binary patch literal 21272 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 Uu*oj@^8f$<07*qoM6N<$f@TP)DF6Tf literal 0 HcmV?d00001 diff --git a/docs/static/tutorials/bubbles/io2_title.png b/docs/static/tutorials/bubbles/io2_title.png new file mode 100644 index 0000000000000000000000000000000000000000..c88fa1b14614301950006d5b61ad34688efadd1e GIT binary patch literal 87630 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 j$>z;9pa +``||bubble:create board||``
+then snap it inside the empty
+``||loops(noclick): on start||``
+block already in the workspace. --- -In computer science, an **ARRAY** is an ordered list of items. -We give this list a name, so that we can ask for items from this list later. +~hint What does that mean? ๐Ÿคท๐Ÿฝ + +--- -For example, the list in our program is called **characters**. -If we want to flip the first image from this list, we can add a block -like this to our program: +When giving instructions, we'll color some text to give you a better idea of what you are looking for. +For example, when we suggest the
+``||bubble:create board||``
+block, we are pointing you toward
```block -let characters: Image[] = [] -characters[0].flipX() +bubble.createBoard() ``` hint~ -```blocks -let characters: Image[] = [] - -characters = [ -pizzaassets.P1, -pizzaassets.P2, -pizzaassets.P3, -pizzaassets.P4 -] -``` - #### ~ tutorialhint ```blocks -let characters: Image[] = [] - -characters = [ -pizzaassets.P1, -pizzaassets.P2, -pizzaassets.P3, -pizzaassets.P4 -] +//@highlight +bubble.createBoard() ``` -## {3. Set the Scene} - -**Let's decide where the action happens.** - -- :tree: Open the ``||scene:Scene||`` category and drag
-``||scene:set background image to [ ]||``
-into **the end** of the
-``||loops(noclick): on start||``
-container already in the workspace. - -- :paint brush: Click the empty square in the background block and flip to the **Gallery** tab. -![Switch to the Gallery tab](/static/skillmap/assets/gallery.png " ") -then choose the first background image called **City**. - - +## {3. Check Your Screen!} -#### ~ tutorialhint +- :binoculars: Look at your project in the game window to see what your code has done. -```blocks -let characters: Image[] = [] +You should see two rows of memory bubbles lining the top of the game window. -characters = [ -pizzaassets.P1, -pizzaassets.P2, -pizzaassets.P3, -pizzaassets.P4 -] +![The game window is in the lower left corner](/static/tutorials/bubbles/game.png "Your game will automatically load in this window after every step.") -//@highlight -scene.setBackgroundImage(pizzaassets.City) -``` +## {4. Add Bubble} +**Let's add a memory bubble to aim.** -## {4. Set players} +--- -**Add Player 1** -- :suitcase: Open the ``||pizza:Pizza||`` category and drag
-``||pizza:set game for [1] player(s) with [characters]||``
-into **the end** of the
+- :dot circle: Open the ``||bubble: Bubble||`` category **in the toolbox** and grab
+``||bubble:load new bubble||``
+then snap it inside at **the end of** the
``||loops(noclick): on start||``
-container already in the workspace. +block already in the workspace. +--- -~hint Pizza category? ๐Ÿ• +~hint โ‰๏ธ No bubbles showing? --- -Within special tutorials, you'll sometimes see custom categories that we don't offer in our normal interface. These categories are **Extensions**. +This game relies on setting the scene before you add your main bubble. If you don't see anything loaded in your game window, you may have instructions in the wrong order. -When creating custom projects or tutorials, people can craft their own blocks that others can add into their toolbox as an extension. Since we can't get to the **Extensions** gallery from a tutorial, the categories you need have been provided in the toolbox by default. +Check to see that your code looks like this: -If you want to use the ``||pizza:Pizza||`` category in another tutorial someday, make sure to grab the share link for this finished project and you'll be able to import the blocks from this tutorial into another project! +```blocks +bubble.createBoard() +//@highlight +bubble.load_bubble() +``` hint~ - - - #### ~ tutorialhint ```blocks -let characters: Image[] = [] - -characters = [ -pizzaassets.P1, -pizzaassets.P2, -pizzaassets.P3, -pizzaassets.P4 -] -scene.setBackgroundImage(pizzaassets.City) +bubble.createBoard() //@highlight -pizza.setPlayersWith (characters, 1) +bubble.load_bubble() ``` -## {5. Check Your Game!} - - -- :binoculars: Look at your project in the game window to see what your code has done. - -You should see a single sprite in the game window that looks like the first image in your array. +## {5. Gaming with Joy} -**Click on the game window and try moving your _sprite_ using the arrow keys or joypad.** +**Add your emotion!** +To do this, we'll need to add a **sprite** to the bottom of the screen. ~hint What's a sprite? ๐Ÿ’ก @@ -174,599 +128,272 @@ In Arcade, each character or image that does something is called a **SPRITE**. Sprites have properties that you can use and change -- things like scale, position, and lifespan are all properties of sprites. -Our players will be sprites, too. +Our characters will be sprites, too. hint~ +- :paper plane: Open the ``||sprites:Sprites||`` category and drag
+``||variables(sprites):set [mySprite] to sprite [ ] of kind [Player]||``
+into the **end of** the
+``||loops(noclick): on start||``
+container already in the workspace. - - -## {6. Add more} - -**Add more players.** - -- :game: From the ``||mp:Multiplayer||`` category, drag the
-``||mp:on [thisPlayer][connected]||``
-bundle into **an empty** area of the workspace.
- -Now, when other players join, more sprites will appear in the game window. - -**Test it out by clicking the player icons to the left of the game window.** - -![Test with the player buttons to the left of the game window](/static/tutorials/pizza-party/players1.png "An image highlighting the player icons") - -๐Ÿ“ _Note: In actual game play, each player will join in order. To simulate this, make sure to test with **Player 1** first, then **Player 2**, then **Player 3**, etc._ - - - -#### ~ tutorialhint - -```blocks -//@highlight -mp.onControllerEvent(ControllerEvent.Connected, function (thisPlayer) { - pizza.setPlayersWith(characters, mp.getPlayerProperty(thisPlayer, mp.PlayerProperty.Number)) -}) -``` - - - -## {7. Add Pizza} - -**Let the Pizza Fly!** - -- :circle: Open the ``||game:Game||`` category and drag the
-``||game: on game update every [500] ms||``
-bundle into **an empty** area of the workspace. - - -- :mouse pointer: Click the empty grey square inside the bundle to select an image for the projectile. -
Switch to the **Gallery** tab to choose the **pizza**. - +๐Ÿ’ก _To change sprites, click the character in the box and look under the **Gallery** tab._ #### ~ tutorialhint ```blocks +bubble.createBoard() +bubble.load_bubble() //@highlight -game.onUpdateInterval(500, function () { - projectile = sprites.createProjectileFromSide(img` - . . . . . . b b b b . . . . . . - . . . . . . b 4 4 4 b . . . . . - . . . . . . b b 4 4 4 b . . . . - . . . . . b 4 b b b 4 4 b . . . - . . . . b d 5 5 5 4 b 4 4 b . . - . . . . b 3 2 3 5 5 4 e 4 4 b . - . . . b d 2 2 2 5 7 5 4 e 4 4 e - . . . b 5 3 2 3 5 5 5 5 e e e e - . . b d 7 5 5 5 3 2 3 5 5 e e e - . . b 5 5 5 5 5 2 2 2 5 5 d e e - . b 3 2 3 5 7 5 3 2 3 5 d d e 4 - . b 2 2 2 5 5 5 5 5 5 d d e 4 . - b d 3 2 d 5 5 5 d d d 4 4 . . . - b 5 5 5 5 d d 4 4 4 4 . . . . . - 4 d d d 4 4 4 . . . . . . . . . - 4 4 4 4 . . . . . . . . . . . . - `, randint(-100, 100), randint(-100, 100)) -}) +let mySprite = sprites.create(io2_images.joy, SpriteKind.Player) ``` +## {6. Check Your Game!} -## {8. Take a look} - - -- :binoculars: Take another look at your project. - -You should see pizza flying every which way! - -~hint Why is this happening? ๐Ÿคท๐Ÿฝโ€โ™‚๏ธ ---- - -Let's take a look at the blocks you just added. - ---- - -
-This **event** block triggers an action every 500 milliseconds. (That means, every half second, the code inside of this container will run.) +- :binoculars: Take a look at the game window again. +Your sprite should be in the middle of the screen. -```block -game.onUpdateInterval(500, function () { }) -``` +In the next step, we'll move it to a location that makes it look like it's aiming the bubble. ---- -
-This block launches the ** projectile** of your choosing from the side of the screen with a **velocity** that's randomly assigned each time the code runs. -```block - projectile = sprites.createProjectileFromSide(img` - . . . . . . b b b b . . . . . . - . . . . . . b 4 4 4 b . . . . . - . . . . . . b b 4 4 4 b . . . . - . . . . . b 4 b b b 4 4 b . . . - . . . . b d 5 5 5 4 b 4 4 b . . - . . . . b 3 2 3 5 5 4 e 4 4 b . - . . . b d 2 2 2 5 7 5 4 e 4 4 e - . . . b 5 3 2 3 5 5 5 5 e e e e - . . b d 7 5 5 5 3 2 3 5 5 e e e - . . b 5 5 5 5 5 2 2 2 5 5 d e e - . b 3 2 3 5 7 5 3 2 3 5 d d e 4 - . b 2 2 2 5 5 5 5 5 5 d d e 4 . - b d 3 2 d 5 5 5 d d d 4 4 . . . - b 5 5 5 5 d d 4 4 4 4 . . . . . - 4 d d d 4 4 4 . . . . . . . . . - 4 4 4 4 . . . . . . . . . . . . - `, randint(-100, 100), randint(-100, 100)) -``` +## {7. Gaming with Joy} +**Move your sprite.** -hint~ - - -~hint Tell me about events! ๐Ÿ•ต๐Ÿฟโ€โ™‚๏ธ - ---- - -**EVENTS** are things that might or might not happen while the code is running. -A player might press a button, a timer might run out, or one sprite might overlap with another. - -Each of those things is an event that you can assign a special action to in Arcade. - -hint~ +Let's add a block to make sure that the top of the sprite is right below the memory bubble. -~hint What are projectiles? ๐Ÿ•ต๏ธ +- :paper plane: Open the ``||sprites:Sprites||`` category and drag
+``||sprites:set [mySprite] [top] to [102]||``
+into the **end of** the
+``||loops(noclick): on start||``
+container already in the workspace. --- -In MakeCode Arcade, **PROJECTILES** are sprites that move on their own, -often in large quantities. - -Projectiles have extra properties that normal sprites don't have. -For example, they destroy themselves once they leave the screen so -the user's computer doesn't get overwhelmed. - -hint~ - - -~hint What is velocity? ๐Ÿ•ต๐Ÿปโ€โ™€๏ธ +~hint Why 102? ๐Ÿคท๐Ÿฝโ€โ™€๏ธ --- -**VELOCITY** is the speed that something is moving in a certain direction. - -In MakeCode, we have velocity in two directions, **vx** and **vy**. - -The field **vx** is for the velocity going side to side.
- -_Velocity in the x (horizontal) direction_ +The coordinates of our screen go from **0** at the top to **120** at the very bottom. -- A **vx** greater than 0 will send something moving right. -- A **vx** less than 0 will send something moving left. -- A **vx** of 0 will not change its position. +Since we want just a little bit of our character peeking up from below, we'll set the top of our character to **102** so it rests just below the bubble that we will be aiming. -The field **vy** is for the velocity going up and down.
- -_Velocity in the y (vertical) direction_ - -- A **vy** greater than 0 will send something moving down. -- A **vy** less than 0 will send something moving up. -- A **vy** of 0 will not change its position. - hint~ +#### ~ tutorialhint -## {9. Add points} - -**Add points when a player overlaps with a projectile.** - -- :paper plane: Open the ``||sprites:Sprites||`` category and drag the
-``||sprites:on [sprite] of kind [Player] overlaps...||`` -
bundle into **an empty** area of the workspace. - - -~hint What does this bundle do? ๐Ÿคท๐Ÿฝโ€โ™‚๏ธ - ---- - -Let's take a look at the blocks you just added. - ---- - -
-This **event** block triggers an action every time one of your Player sprites overlaps one of the projectile sprites. (Whenever a character overlaps the pizza.) +```blocks +bubble.createBoard() +bubble.load_bubble() +let mySprite = sprites.create(io2_images.joy, SpriteKind.Player) +//@highlight +mySprite.top = 102 -```block -sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { }) ``` ---- -
-This block deletes the pizza sprite (otherSprite) which was overlapped. It also -adds a special disintigrate effect to the image while it's happening. - -```block - sprites.destroy(otherSprite, effects.disintegrate, 100) -``` ---- +## {8. Aim the Bubble Right} -
-This block adds one point to the score of the Player that overlapped the pizza. +**Now that everything is on screen, it's time to aim your shot.** -```block - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, 1) -``` +- :game: Open the ``||controller:Controller||`` category and drag the
+``||controller:on [right] button [repeat]||``
+bundle into **an empty area** of the workspace.
+--- -hint~ +You should be able to aim your bubble further to the right. #### ~ tutorialhint ```blocks +bubble.createBoard() +bubble.load_bubble() +let mySprite = sprites.create(io2_images.joy, SpriteKind.Player) +mySprite.top = 102 //@highlight -sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { - sprites.destroy(otherSprite, effects.disintegrate, 100) - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, 1) +controller.right.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle(bubble.Choice.Right) }) ``` +## {9. Aim the Bubble Left} -## {10. Test!} - - -- :binoculars: Test your project! - -Use the multiplayer icons to test your game with each player. - -Each character should get a point when they overlap pizza. - - - - - -## {11. First to 20 Wins!} - -**First to 20 wins!** - -- :users: Open the ``||mp:Multiplayer||`` category and drag the
-``||mp:on score [20] for [thisPlayer]||`` -
bundle into **an empty** area of the workspace. - - -~hint What does this bundle do? ๐Ÿคท๐Ÿฝโ€โ™‚๏ธ - ---- - -Let's take a look at the blocks you just added. - ---- - -
-This **event** block triggers an action when a player's score reaches 20. (It even has the potential to tell which player reached that score, though we won't use that feature.) - -```block -mp.onScore(20, function (thisPlayer) { }) -``` +- :mouse pointer: Right-click to **Duplicate** your
+``||controller:on [right] button [repeat]||``
+bundle, then change both **right** options to **left**.
--- -
-This block signals that the game should immediatedly end in a win. - -```block - game.gameOver(true) -``` - - -hint~ +You should now be able to aim your bubble further to the left. #### ~ tutorialhint ```blocks +bubble.createBoard() +bubble.load_bubble() +let mySprite = sprites.create(io2_images.joy, SpriteKind.Player) +mySprite.top = 102 +controller.right.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle(bubble.Choice.Right) +}) //@highlight -mp.onScore(20, function (thisPlayer) { - game.gameOver(true) +controller.left.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle(bubble.Choice.Left) }) ``` +## {10. Time to Toss} +**Time to toss!** -## {12. Shake it up!} - -**Let's shake things up!** - -Let's make things a little more competitive by allowing sprites to bump one another out of the way. - -- :paper plane: Open the ``||sprites:Sprites||`` category and drag the
-``||sprites:on sprite of kind [Player] overlaps...||`` -
bundle into **an empty** area of the workspace. - - -~hint What does this bundle do? ๐Ÿคท๐Ÿฝโ€โ™‚๏ธ - ---- - -Let's take a look at the blocks you just added. - ---- - -
-This **event** block triggers an action whenever two Players (characters) overlap. - -```block -sprites.onOverlap(SpriteKind.Player, SpriteKind.Player, function (sprite, otherSprite) { }) -``` - ---- - -
-This block checks to see **if** the first player is holding down their (A) button. If so, the code inside will run. - -```block - if (mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A)) {} -``` - ---- - -
-This code makes it look like the camera is shaking around by 4 pixels for half a second. +- :game: Open the ``||controller:Controller||`` category and drag the
+``||controller:on [A] button [pressed]||``
+bundle into **an empty area** of the workspace.
-```block - scene.cameraShake(4, 500) -``` ---- - -
-This is a custom block made for this tutorial. It bumps the other sprite to the opposite side of the screen from where the first sprite is located. - -```block - pizza.bumpSprite(sprite, otherSprite) -``` - ---- - -
-This block takes a point away from the other sprite. - -```block - mp.changePlayerStateBy(mp.getPlayerBySprite(otherSprite), MultiplayerState.score, -1) +```blockconfig.local +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + bubble.tossBubble() +}) ``` - -hint~ - - #### ~ tutorialhint ```blocks -sprites.onOverlap(SpriteKind.Player, SpriteKind.Player, function (sprite, otherSprite) { - if (mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A)) { - scene.cameraShake(4, 500) - pizza.bumpSprite(sprite, otherSprite) - mp.changePlayerStateBy(mp.getPlayerBySprite(otherSprite), MultiplayerState.score, -1) - } -}) -``` -```blockconfig.local -sprites.onOverlap(SpriteKind.Player, SpriteKind.Player, function (sprite, otherSprite) { - if (mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A)) { - scene.cameraShake(4, 500) - pizza.bumpSprite(sprite, otherSprite) - mp.changePlayerStateBy(mp.getPlayerBySprite(otherSprite), MultiplayerState.score, -1) - } +//@highlight +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + bubble.tossBubble() }) ``` +## {11. Test!} +- :binoculars: Test your game. -## {13. Test!} - - -- :binoculars: Test your project with two or more players. - -As **Player 1**, try holding down the (A) button (or space bar) and running into another player. What happens? +You should be able to toss a bubble in the direction it's aimed when you press either the (A) button or the **space bar**. +Give it a try! -๐Ÿ“ _Note: At the moment, a player can only bump someone with a higher number. We'll fix that in the next step._ +๐Ÿ’ก _ Notice that your bubble doesn't properly stick where it hits, yet. There's also no option to throw another bubble. We'll fix both of those things in the steps that follow._ +## {12. Need a Refill?} +**Let's load a new bubble every time we toss the old one.** +--- +- :dot circle: Open the ``||bubble: Bubble||`` category **in the toolbox** and grab
+``||bubble:load new bubble||``
+then snap it inside at **the end of** the
+``||controller(noclick):on [A] button [pressed]||``
+block already in the workspace. -## {14. Again} - -What if the other player is holding down _their_ (A) button? Let's add code that reverses the whammy. - -- :mouse pointer: Right click on the ``||logic(noclick):if||`` statement and when the dropdown menu appears, select **Duplicate**. - -- :mouse pointer: Grab the deactivated ``||logic(noclick):if||`` statement and snap it in beneath the original. - -- :mouse pointer: Swap all of the ``||variables(noclick):sprite||`` and ``||variables(noclick):otherSprite||`` variables within the second ``||logic(noclick):if||`` statement. - - -![Duplicated the if-statement and swap sprite variables](/static/tutorials/pizza-party/duplicate.gif "Duplicate the if-statement and swap the sprite variables.") - - -#### ~ tutorialhint -```blocks -sprites.onOverlap(SpriteKind.Player, SpriteKind.Player, function (sprite, otherSprite) { - if (mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A)) { - scene.cameraShake(4, 500) - pizza.bumpSprite(sprite, otherSprite) - mp.changePlayerStateBy(mp.getPlayerBySprite(otherSprite), MultiplayerState.score, -1) - } - if (mp.isButtonPressed(mp.getPlayerBySprite(otherSprite), mp.MultiplayerButton.A)) { - scene.cameraShake(4, 500) - pizza.bumpSprite(otherSprite, sprite) - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, -1) - } -}) -``` ```blockconfig.local -sprites.onOverlap(SpriteKind.Player, SpriteKind.Player, function (sprite, otherSprite) { - if (mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A)) { - scene.cameraShake(4, 500) - pizza.bumpSprite(sprite, otherSprite) - mp.changePlayerStateBy(mp.getPlayerBySprite(otherSprite), MultiplayerState.score, -1) - } - if (mp.isButtonPressed(mp.getPlayerBySprite(otherSprite), mp.MultiplayerButton.A)) { - scene.cameraShake(4, 500) - pizza.bumpSprite(otherSprite, sprite) - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, -1) - } +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + bubble.tossBubble() + bubble.load_bubble() }) ``` - -## {15. NOOP} - -The game won't be fun if everyone holds (A) the whole time! Let's make it so players only get a point if they're **not** holding the (A) button. - -- :binoculars: Find the **Player/Projectile** ``||sprites(noclick):on overlap||`` event that's **already in your workspace.** +#### ~ tutorialhint ```blocks -sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { - sprites.destroy(otherSprite, effects.disintegrate, 100) - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, 1) + +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + bubble.tossBubble() + //@highlight + bubble.load_bubble() }) ``` -- :random: from the``||logic:Logic||`` category, grab an empty
-``||logic:if then||`` statement and snap it in **above** the
-``||sprites(noclick):destroy [otherSprite]...||`` block in your workspace. -- :random: from the``||logic:Logic||`` category, grab
-``||logic:not < >||`` and snap it into the
-``||logic(noclick):if then||`` statement to replace ``||logic(noclick):||`` +## {13. Connecting Bubbles} +**Time to make the memories stick!** +We want the bubbles to stick whenever they connect to the top wall or to another bubble. -#### ~ tutorialhint +--- -```blocks -sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { - if (!(mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A))) { } - sprites.destroy(otherSprite, effects.disintegrate, 100) - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, 1) -}) -``` +- :tree: Open the ``||scene: Scene||`` category and grab the
+``||scene:on [sprite] of kind [Bubble] ...||``
+bundle and drop it into **an empty** area of the workspace.
```blockconfig.local -sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { }) -``` - - - - -## {16. NOOP Cont.} - +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + bubble.tossBubble() + bubble.load_bubble() +}) -- :mouse pointer: Right click on the -```block -let sprite: Sprite = null -mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A ``` -block already in the workspace and choose **Duplicate**. -Drag the copy into the empty area inside
``||logic(noclick):not < > ||``. - - -- :mouse pointer: Drag both of the blocks that were connected below the empty
-``||logic(noclick):if||`` statement and move them inside. #### ~ tutorialhint ```blocks -sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { - if (!(mp.isButtonPressed(mp.getPlayerBySprite(sprite), mp.MultiplayerButton.A))) { - sprites.destroy(otherSprite, effects.disintegrate, 100) - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, 1) - } +//@highlight +scene.onHitWall(SpriteKind.Bubble, function (sprite, location) { + bubble.stick_to_wall(sprite, location) }) ``` -## {17. Ready, Set, Go} - -Make sure everyone is prepared to play by adding a holding screen with sound effects at the beginning of the game. - -- :circle: From the ``||game:Game||`` category, drag
-``||game:splash ["Press (A) when everyone is"]...||`` into the end of the
-``||loops(noclick): on start||``
-container already in the workspace. - - -- :headphones: From the ``||music:Music||`` category, drag
-``||music:play [song ] [until done]||`` into the end of the
-``||loops(noclick): on start||``
-container already in the workspace. - -- :mouse pointer: Click the empty rectagle in the
-``||music(noclick):play song...||`` block and switch to **My Assets** to choose the **countdown**. - - - -#### ~ tutorialhint - -```blocks -let characters = [ -pizzaassets.P1, -pizzaassets.P2, -pizzaassets.P3, -pizzaassets.P4 -] -scene.setBackgroundImage(assets.image`cityscape`) -pizza.setPlayersWith (characters, 1) -game.splash("Press (A) when everyone is", "ready to start the game") - -music.play(music.createSong(assets.song`countdown`), music.PlaybackMode.UntilDone) - - -``` +## {18. Test It} +- :binoculars: **Time to play your finished game!** +Aim your bubble using the arrow keys, then toss with the (A) button or **space bar**. +Can you clear the board fast enough to get a bonus? -## {18. Test It} +~hint Want to add more? ๐Ÿซง +--- -- :binoculars: Test your final experience. +Feel like going above and beyond? There are enough blocks in the toolbox to make these customizations: -You should be able to rack up points as you grab pizza until you press the (A) button, then the pizza should fly right by you. +- Add music in the background +- Add a background color to the board +- Win the game by reaching a score instead of clearing the board +- Change your character with each new ball -**For extra fun, login so you can play online with friends!** +hint~ @@ -775,74 +402,33 @@ You should be able to rack up points as you grab pizza until you press the (A) b ## {Finale} -**๐Ÿ• Cowabunga ๐Ÿ•** +**๐Ÿฅณ Great Job ๐Ÿฅณ** -You have finished your multiplayer experience! +You have finished the tutorial! -When you're ready, sign-in, then select **Done** to start an online multiplayer session with up to three friends. +When you're ready, click **Done** to share your game with family and friends! -**Who will be the first to score 20 points?** ```blockconfig.global -game.onUpdateInterval(500, function () { - projectile = sprites.createProjectileFromSide(img` - . . . . . . b b b b . . . . . . - . . . . . . b 4 4 4 b . . . . . - . . . . . . b b 4 4 4 b . . . . - . . . . . b 4 b b b 4 4 b . . . - . . . . b d 5 5 5 4 b 4 4 b . . - . . . . b 3 2 3 5 5 4 e 4 4 b . - . . . b d 2 2 2 5 7 5 4 e 4 4 e - . . . b 5 3 2 3 5 5 5 5 e e e e - . . b d 7 5 5 5 3 2 3 5 5 e e e - . . b 5 5 5 5 5 2 2 2 5 5 d e e - . b 3 2 3 5 7 5 3 2 3 5 d d e 4 - . b 2 2 2 5 5 5 5 5 5 d d e 4 . - b d 3 2 d 5 5 5 d d d 4 4 . . . - b 5 5 5 5 d d 4 4 4 4 . . . . . - 4 d d d 4 4 4 . . . . . . . . . - 4 4 4 4 . . . . . . . . . . . . - `, randint(-100, 100), randint(-100, 100)) -}) let characters: Image[] = [] -pizza.setPlayersWith(characters, 1) - -mp.onControllerEvent(ControllerEvent.Connected, function (thisPlayer) { - pizza.setPlayersWith(characters, mp.getPlayerProperty(thisPlayer, mp.PlayerProperty.Number)) -}) - -sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { - sprites.destroy(otherSprite, effects.disintegrate, 100) - mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, 1) +let mySprite = sprites.create(io2_images.joy, SpriteKind.Player) +mySprite.top = 102 +controller.right.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle(bubble.Choice.Right) }) +scene.setBackgroundColor(14) -mp.changePlayerStateBy(mp.getPlayerBySprite(sprite), MultiplayerState.score, 1) - -mp.onScore(20, function (thisPlayer) { - game.gameOver(true) +music.play(music.createSong(hex`0096000408080106001c00010a006400f401640000040000000000000000000000000000000002d80000000200011608000a00011110001200011618001a00011120002200011628002a00011130003200011638003a00011140004200011848004a00011150005200011858005a00011160006200011868006a00011170007200011878007a00011180008200011288008a00010d90009200011298009a00010da000a2000112a800aa00010db000b2000112b800ba00010dc000c2000118c400c6000118cc00ce000118d000d2000118d800da00011ddc00de00011de400e600011de800ea00011df000f2000120f400f6000120f800fa000120fc00fe000120`), music.PlaybackMode.LoopingInBackground) +scene.onHitWall(SpriteKind.Bubble, function (sprite, location) { + bubble.stick_to_wall(sprite, location) }) - -game.splash("Press (A) when everyone is", "ready to start the game") - -``` - - - - -```template -let characters: Image[] = [] - -characters = [ -pizzaassets.P1, -pizzaassets.P2, -pizzaassets.P3, -pizzaassets.P4 -] - +mySprite.setImage(io2_images.fear) +characters = [io2_images.joy, io2_images.anger, io2_images.envy, io2_images.fear] +mySprite.setImage(characters[randint(0, characters.length - 1)]) ``` @@ -850,7 +436,36 @@ pizzaassets.P4 ```ghost -scene.setBackgroundColor(1) +let characters: Image[] = [] +scene.onHitWall(SpriteKind.Bubble, function (sprite, location) { + bubble.stick_to_wall(sprite, location) + music.play(music.melodyPlayable(music.baDing), music.PlaybackMode.UntilDone) +}) +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + bubble.tossBubble() + bubble.load_bubble() +}) +controller.right.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle(bubble.Choice.Right) +}) +info.onScore(100, function () { + game.setGameOverEffect(true, effects.confetti) + game.setGameOverPlayable(true, music.melodyPlayable(music.powerUp), false) + game.setGameOverMessage(true, "GAME OVER!") +}) +controller.left.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle(bubble.Choice.Left) +}) +scene.setBackgroundColor(14) +music.play(music.createSong(hex`0096000408080106001c00010a006400f401640000040000000000000000000000000000000002d80000000200011608000a00011110001200011618001a00011120002200011628002a00011130003200011638003a00011140004200011848004a00011150005200011858005a00011160006200011868006a00011170007200011878007a00011180008200011288008a00010d90009200011298009a00010da000a2000112a800aa00010db000b2000112b800ba00010dc000c2000118c400c6000118cc00ce000118d000d2000118d800da00011ddc00de00011de400e600011de800ea00011df000f2000120f400f6000120f800fa000120fc00fe000120`), music.PlaybackMode.LoopingInBackground) +let mySprite = sprites.create(io2_images.joy, SpriteKind.Player) +mySprite.top = 102 +mySprite.startEffect(effects.fountain) +bubble.createBoard() +bubble.load_bubble() +mySprite.setImage(io2_images.fear) +characters = [io2_images.joy, io2_images.anger, io2_images.envy, io2_images.fear] +mySprite.setImage(characters[randint(0, characters.length - 1)]) ``` @@ -858,140 +473,31 @@ scene.setBackgroundColor(1) ```package multiplayer -pizza-assets=github:kiki-lee/pizza-assets#v0.0.4 +io2_images=github:kiki-lee/io2_images#v0.0.1 +bubble=github:kiki-lee/bubble_ext#v0.1.0 ``` -```customts - -//% color=#b79900 icon="\uf1ce" -namespace pizza { - - // Make sure not to remove later player when earlier player tested - export let playersConnected=0; - - //% blockId=set_players - //% block="set game for $num player(s) with $list" - //% num.defl=1 - //% list.shadow=variables_get - //% list.defl=characters - - export function setPlayersWith(list: Image[], num: number) { - if(num >= pizza.playersConnected){ - pizza.playersConnected = num; - sprites.destroyAllSpritesOfKind(SpriteKind.Player) - let xloc = [ - 40, - 120, - 40, - 120 - ] - let yloc = [ - 30, - 30, - 90, - 90 - ] - for (let index = 0; index <= num - 1; index++) { - mp.setPlayerSprite(mp.getPlayerByIndex(index), sprites.create(list[index], SpriteKind.Player)) - mp.getPlayerSprite(mp.getPlayerByIndex(index)).setStayInScreen(true) - mp.getPlayerSprite(mp.getPlayerByIndex(index)).setPosition(xloc.shift(), yloc.shift()) - mp.getPlayerSprite(mp.getPlayerByIndex(index)).z = 1000 - mp.moveWithButtons(mp.getPlayerByIndex(index)) - } - } - } - - //% blockId=bump_sprite - //% block="$thisSprite bump $thatSprite" - //% thisSprite.shadow=variables_get - //% thisSprite.defl=sprite - //% thatSprite.shadow=variables_get - //% thatSprite.defl=otherSprite - export function bumpSprite(thisSprite: Sprite, thatSprite: Sprite) { - thatSprite.setPosition((thisSprite.x + 80) % 160, thisSprite.y) - } - -} - -namespace logic{ - /** - * this just holds code - */ - //% block="check if A button pressed" weight=300 - //% handlerStatement=1 - export function wrap1(handler: () => void) { - handler(); - } -} - - -//% color=#6d5ba4 icon="\uf0f2" -namespace bundles{ - /** - * this just holds code - */ - //% block="check if A button pressed" weight=300 - //% handlerStatement=1 - export function wrap1(handler: () => void) { - handler(); - } - - /** - * this just holds code - */ - //% block="create finish line" weight=300 - //% handlerStatement=1 - export function wrap2(handler: () => void) { - handler(); - } - - /** - * this just holds code - */ - //% block="create players" weight=300 - //% handlerStatement=1 - export function wrap3(handler: () => void) { - handler(); - } - -} - -``` - ```simtheme { "palette": [ "#000000", "#FFFFFF", - "#FF2121", - "#DFDDDE", - "#FF8135", - "#FFF609", - "#8E2EC4", - "#408325", - "#003FAD", - "#87F2FF", - "#EBF8F9", + "#E40C0C", + "#FF8FDB", + "#FFF700", + "#3AF2B5", + "#0B9EF9", + "#56E3F5", + "#C4C3F4", + "#E0E6E6", + "#729280", "#A4839F", - "#F9F6E1", + "#5C406c", "#E5CDC4", - "#91463d", + "#8A0A0A", "#000000" ] } ``` - -```assetjson -{ - "assets.json": "", - "images.g.jres": "{\n \"EM~exxT809P9NBm_MJip\": {\n \"data\": \"003c000408010204001c00100500640000041e000004000000000000000000000000000a000004120000000400012408000c00012410001400012407001c00020a006400f401640000040000000000000000000000000000000003060018001c000124\",\n \"mimeType\": \"application/mkcd-song\",\n \"displayName\": \"countdown\",\n \"namespace\": \"mySongs.\"\n },\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myImages\"\n }\n}", - "images.g.ts": "// Auto-generated code. Do not edit.\nnamespace myImages {\n\n helpers._registerFactory(\"image\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n helpers._registerFactory(\"animation\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n helpers._registerFactory(\"song\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"EM~exxT809P9NBm_MJip\":\n case \"countdown\":return hex`003c000408010204001c00100500640000041e000004000000000000000000000000000a000004120000000400012408000c00012410001400012407001c00020a006400f401640000040000000000000000000000000000000003060018001c000124`;\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n", - "main.blocks": "PlayerProjectileFoodEnemyTextStatusBarBallBoothMouseCrosshairMoonscorelifelocationsprojectilecharactersindexmySpritemyBallx-locy-loclistnumber", - "main.ts": "\n", - "pxt.json": "{\n \"name\": \"TMNT_Music\",\n \"description\": \"\",\n \"dependencies\": {\n \"device\": \"*\"\n },\n \"files\": [\n \"main.blocks\",\n \"main.ts\",\n \"assets.json\",\n \"images.g.jres\",\n \"images.g.ts\",\n \"tilemap.g.jres\",\n \"tilemap.g.ts\"\n ],\n \"targetVersions\": {\n \"branch\": \"v1.12.30\",\n \"tag\": \"v1.12.30\",\n \"commits\": \"https://github.com/microsoft/pxt-arcade/commits/33228b1cc7e1bea3f728c26a6047bdef35fd2c09\",\n \"target\": \"1.12.30\",\n \"pxt\": \"8.5.41\"\n },\n \"preferredEditor\": \"tsprj\",\n \"palette\": [\n \"#000000\",\n \"#FFFFFF\",\n \"#FF2121\",\n \"#DFDDDE\",\n \"#FF8135\",\n \"#FFF609\",\n \"#8E2EC4\",\n \"#408325\",\n \"#003FAD\",\n \"#87F2FF\",\n \"#EBF8F9\",\n \"#A4839F\",\n \"#F9F6E1\",\n \"#E5CDC4\",\n \"#91463d\",\n \"#000000\"\n ]\n}\n", - "tilemap.g.jres": "{\n \"transparency16\": {\n \"data\": \"hwQQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true\n },\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myTiles\"\n }\n}", - "tilemap.g.ts": "// Auto-generated code. Do not edit.\nnamespace myTiles {\n //% fixedInstance jres blockIdentity=images._tile\n export const transparency16 = image.ofBuffer(hex``);\n\n helpers._registerFactory(\"tile\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"transparency16\":return transparency16;\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n" -} -``` diff --git a/docs/test/tutorials/spy/chase-the-pizza.md b/docs/test/tutorials/spy/chase-the-pizza.md new file mode 100644 index 00000000000..3fd1363edd7 --- /dev/null +++ b/docs/test/tutorials/spy/chase-the-pizza.md @@ -0,0 +1,306 @@ +# Chase the Pizza +### @explicitHints true + +## {Introduction @unplugged} + +![Game animation](/static/tutorials/chase-the-pizza/chasing.gif) + +In this tutorial you will create a game with 2 sprites, a ``||sprites:Player||`` sprite and a ``||sprites:Food||`` sprite. The goal of the game is to eat as much pizza as you can before the time runs out! Each time your player catches the pizza, you gain points and the countdown is restarted. + +## {Step 2} + +First, **set the background color**. + + +~hint How do I do that? ๐Ÿคท๐Ÿฝ + +--- + +You can make this happen in two ways. + + +- :tree: Open the
+``||scene:Scene||``
+toolbox drawer and drag
+``||scene:set background color to [color]||``
+into **the first line** of your program. + + +- :keyboard: Type +```spy +scene.setBackgroundColor(0) +``` +directly into the first line of your program. + +๐Ÿ’ก _Feel free to choose your own color if you don't like the swatch in the block. You can replace the number **0** with anything between **0 & 15**._ + + +hint~ + + + +--- + +###### _Click the button that says "**โžก Next**" to go to the next step of the tutorial._ + + +#### ~ tutorialhint + +```spy +scene.setBackgroundColor(0) +``` + +## {Step 3} + +**Time to create a sprite!** + +Set your sprite **image** and **kind** in the second line of the program. + + + +~hint How do I do that? ๐Ÿคท๐Ÿฝ + +--- + +You can make this happen in two ways. + + +- :paper plane: Open the
+``||sprites:Sprites||``
+toolbox drawer and drag
+``||sprites:sprite [img] of kind [kind]||``
+into **the second line** of your program. + + +- :keyboard: Type +```spy +let mySprite = sprites.create(img` + 3 +`, SpriteKind.player) +``` +directly into the second line of your program. + +๐Ÿ’ก _We will choose our player sprite in the next step._ + + +hint~ + + + +#### ~ tutorialhint +```spy +scene.setBackgroundColor(7) +mySprite = sprites.create(img`. . +. .`, SpriteKind.Player) +``` + +## {Step 3} + +Draw your ``||sprites:Player||`` character by using the image editor for ``||variables(sprites):set mySprite||``. +Use the color palette and design tools to draw an image on the canvas. Click **Done** when you are finished. + +![Image editor](/static/tutorials/chase-the-pizza/image-editor-js.gif) + +## {Step 4} + +Put in the code to ``||controller:move mySprite||`` with the ``||controller:controller||``. + +#### ~ tutorialhint +```spy +scene.setBackgroundColor(7) +let mySprite = sprites.create(img` +. . . . . 5 5 5 5 5 5 . . . . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. 5 5 5 f f 5 5 5 5 f f 5 5 5 . +5 5 5 5 f f 5 5 5 5 f f 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 f 5 5 5 5 5 5 5 5 5 5 f 5 5 +5 5 5 f 5 5 5 5 5 5 5 5 f 5 5 5 +. 5 5 5 f 5 5 5 5 5 5 f 5 5 5 . +. 5 5 5 5 f f f f f f 5 5 5 5 . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . . . . 5 5 5 5 5 5 . . . . . +`, SpriteKind.Player) +controller.moveSprite(mySprite) +``` + +## {Step 5} + +Just like with ``||variables(noclick):mySprite||``, ``||create a sprite||`` again and set it to the a variable named +``||variables(noclick):pizza||``. This time, set the ``||sprites:sprite kind||`` to ``||sprites:food||``. This will +be the **pizza** sprite in our game. + +#### ~ tutorialhint +```spy +scene.setBackgroundColor(7) +let mySprite = sprites.create(img` +. . . . . 5 5 5 5 5 5 . . . . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. 5 5 5 f f 5 5 5 5 f f 5 5 5 . +5 5 5 5 f f 5 5 5 5 f f 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 f 5 5 5 5 5 5 5 5 5 5 f 5 5 +5 5 5 f 5 5 5 5 5 5 5 5 f 5 5 5 +. 5 5 5 f 5 5 5 5 5 5 f 5 5 5 . +. 5 5 5 5 f f f f f f 5 5 5 5 . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . . . . 5 5 5 5 5 5 . . . . . +`, SpriteKind.Player) +controller.moveSprite(mySprite) +let pizza = sprites.create(img` +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +`, SpriteKind.Food) +``` + +## {Step 6} + +Use the image editor for ``||variables(noclick):pizza||`` and then select the **Gallery** view. Scroll to find the image of a small pizza (or any other image you like!) and select it to load into the image editor. + +![Image gallery](/static/tutorials/chase-the-pizza/image-gallery-spy.gif) + +## {Step 7 @resetDiff} + +Add a ``||sprites:on overlap||`` event to your code. Set the ``||sprites:sprite kind||`` that cooresponds to +``otherSprite`` as ``||sprites:Food||``. + +#### ~ tutorialhint +```spy +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + +}) +``` + +## {Step 8} + +When our ``||sprites:Player||`` overlaps with the ``||variables(noclick):pizza||`` sprite, letโ€™s add a point to our game score. Pun in the code to ``||info:change score by||`` 1`. + +#### ~ tutorialhint +```spy +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) +}) +``` + +## {Step 9} + +Letโ€™s set the position for ``||variables(noclick):pizza||`` to random locations around the screen. We use +``otherSprite`` and ``||sprites:set its position||``. Righy now, just use `0` for both `x` and `y`. + +#### ~ tutorialhint +```spy +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) + otherSprite.setPosition(0, 0) +}) +``` + +## {Step 10} + +Put in code for the `x` and `y` positions of ``otherSprite`` to use a ``||math:pick a random||`` number. +The Arcade game screen is `160` pixels wide, and `120` pixels high. In the first ``||math:pick random||`` +in the `x` coordinate of the ``||sprites:otherSprite position||``, change the maximum value from **0** to +**160**. In the second ``||math:pick random||`` in the ``y`` coordinate, change the maximum value from +**0** to **120**. + +#### ~ tutorialhint +```spy +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) + otherSprite.setPosition(randint(0, 160), randint(0, 120)) +}) +``` + +## {Step 11} + +Letโ€™s restart our countdown each time. Add the code to ``||info:start countdown||`` and make the countdown +count be `10`. + +```spy +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) + otherSprite.setPosition(randint(0, 160), randint(0, 120)) + info.startCountdown(10) +}) +``` + +## {Complete @resetDiff} + +Congratulations, you have completed your game! Use the Game Simulator to play by moving your ``||sprites:Player||`` around the screen to try and eat as much pizza as possible before the time runs out. Whatโ€™s your high score? + +#### ~ tutorialhint +```spy +scene.setBackgroundColor(7) +let mySprite = sprites.create(img` +. . . . . 5 5 5 5 5 5 . . . . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . +. 5 5 5 f f 5 5 5 5 f f 5 5 5 . +5 5 5 5 f f 5 5 5 5 f f 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 +5 5 f 5 5 5 5 5 5 5 5 5 5 f 5 5 +5 5 5 f 5 5 5 5 5 5 5 5 f 5 5 5 +. 5 5 5 f 5 5 5 5 5 5 f 5 5 5 . +. 5 5 5 5 f f f f f f 5 5 5 5 . +. . 5 5 5 5 5 5 5 5 5 5 5 5 . . +. . . 5 5 5 5 5 5 5 5 5 5 . . . +. . . . . 5 5 5 5 5 5 . . . . . +`, SpriteKind.Player) +controller.moveSprite(mySprite) +let pizza = sprites.create(img` +. . . . . . b b b b . . . . . . +. . . . . . b 4 4 4 b . . . . . +. . . . . . b b 4 4 4 b . . . . +. . . . . b 4 b b b 4 4 b . . . +. . . . b d 5 5 5 4 b 4 4 b . . +. . . . b 3 2 3 5 5 4 e 4 4 b . +. . . b d 2 2 2 5 7 5 4 e 4 4 e +. . . b 5 3 2 3 5 5 5 5 e e e e +. . b d 7 5 5 5 3 2 3 5 5 e e e +. . b 5 5 5 5 5 2 2 2 5 5 d e e +. b 3 2 3 5 7 5 3 2 3 5 d d e 4 +. b 2 2 2 5 5 5 5 5 5 d d e 4 . +b d 3 2 d 5 5 5 d d d 4 4 . . . +b 5 5 5 5 d d 4 4 4 4 . . . . . +4 d d d 4 4 4 . . . . . . . . . +4 4 4 4 . . . . . . . . . . . . +`, SpriteKind.Food) + +sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { + info.changeScoreBy(1) + otherSprite.setPosition(randint(0, 160), randint(0, 120)) + info.startCountdown(10) +}) +``` + + +```package +chase-the-pizza=github:kiki-lee/chase-the-pizza +``` \ No newline at end of file diff --git a/docs/tutorials/bubbles.md b/docs/tutorials/bubbles.md new file mode 100644 index 00000000000..1ba45d8f496 --- /dev/null +++ b/docs/tutorials/bubbles.md @@ -0,0 +1,218 @@ +# Bubble Stacking with Joy +### @explicitHints true + + +## Intro @showdialog + +Are you ready to have an adventure with Joy and the rest of the emotions from Inside Out 2? Click **Next** to make your own game! + + +![Play Bubble Stacking with Joy](/static/tutorials/bubbles/io2_title.png "How many memories can you store?") + + + + + +## {2. Your First Block} + + +## {2. Your First Block} + +**Add your emotion!** + +To do this, we'll need to add a **sprite** to the bottom of the screen. + +~hint What's a sprite? ๐Ÿ’ก + +--- + +In Arcade, each character or image that does something is called a **SPRITE**. + +Sprites have properties that you can use and change -- things like scale, position, and lifespan are all properties of sprites. + +Our players will be sprites, too. + +hint~ + +- :paper plane: Open the ``||sprites:Sprites||`` category and drag
+``||variables(sprites):set [mySprite] to sprite [ ] of kind [Player]||``
+into **the empty**
+``||loops(noclick): on start||``
+container already in the workspace. + + +~hint Pizza category? ๐Ÿ• + +--- + +Within special tutorials, you'll sometimes see custom categories that we don't offer in our normal interface. These categories are **Extensions**. + +When creating custom projects or tutorials, people can craft their own blocks that others can add into their toolbox as an extension. Since we can't get to the **Extensions** gallery from a tutorial, the categories you need have been provided in the toolbox by default. + +If you want to use the ``||bubble:Bubble||`` category in another tutorial someday, make sure to grab the share link for this finished project and you'll be able to import the blocks from this tutorial into another project! + +hint~ + + + + + +#### ~ tutorialhint + +```blocks +//@highlight +let mySprite = sprites.create(io2_images.joy, SpriteKind.Player) +``` + + + +## {5. Check Your Game!} + + +- :binoculars: Look at your project in the game window to see what your code has done. + +You should see a single sprite in the game window that looks like the first image in your array. + +**Click on the game window and try moving your _sprite_ using the arrow keys or joypad.** + + + + + + + + + + +## {13. Test!} + + +- :binoculars: Test your project with two or more players. + +As **Player 1**, try holding down the (A) button (or space bar) and running into another player. What happens? + + +๐Ÿ“ _Note: At the moment, a player can only bump someone with a higher number. We'll fix that in the next step._ + + + + + +## {18. Test It} + + +- :binoculars: Test your final experience. + +You should be able to rack up points as you grab pizza until you press the (A) button, then the pizza should fly right by you. + +**For extra fun, login so you can play online with friends!** + + + + + + +## {Finale} + +**๐Ÿ• Cowabunga ๐Ÿ•** + +You have finished your multiplayer experience! + +When you're ready, sign-in, then select **Done** to start an online multiplayer session with up to three friends. + +**Who will be the first to score 20 points?** + + + + +```blockconfig.global +let mySprite = sprites.create(img`.`, SpriteKind.Player) +mySprite.top = 102 +``` + + + +```ghost + +scene.onHitWall(SpriteKind.Bubble, function (sprite, location) { + bubble.stick_to_wall(sprite, location) + music.play(music.melodyPlayable(music.baDing), music.PlaybackMode.UntilDone) +}) +controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + console.log("Calling Toss Ball") + bubble.tossBubble() + console.log("Calling load_bubble") + bubble.load_bubble() +}) +controller.right.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle_right() +}) +info.onScore(100, function () { + game.setGameOverEffect(true, effects.confetti) + game.setGameOverPlayable(true, music.melodyPlayable(music.powerUp), false) + game.setGameOverMessage(true, "GAME OVER!") +}) +controller.left.onEvent(ControllerButtonEvent.Repeated, function () { + bubble.tilt_angle_left() +}) +scene.setBackgroundColor(14) +music.play(music.createSong(hex`0078000408010105001c000f0a006400f4010a00000400000000000000000000000000000000021a0000000400011d04000800011e08000c00021e2010001400021d1e`), music.PlaybackMode.InBackground) +let mySprite = sprites.create(assets.image`myImage`, SpriteKind.Player) +mySprite.top = 102 +mySprite.startEffect(effects.fountain) +bubble.createBoard() +bubble.load_bubble() + + +``` + + + +```package +multiplayer +io2_images=github:kiki-lee/io2_images#v0.0.1 +bubble=github:kiki-lee/bubble_ext#v0.0.12 +``` + + +```simtheme +{ + "palette": [ + "#000000", + "#FFFFFF", + "#E40C0C", + "#FF8FDB", + "#FFF700", + "#3AF2B5", + "#0B9EF9", + "#56E3F5", + "#C4C3F4", + "#E0E6E6", + "#729280", + "#A4839F", + "#5C406c", + "#E5CDC4", + "#8A0A0A", + "#000000" + ] +} +``` + + +```assetjson + +{ + "README.md": " \n\n\n> Open this page at [https://kiki-lee.github.io/bubble_ext/](https://kiki-lee.github.io/bubble_ext/)\n\n## Use as Extension\n\nThis repository can be added as an **extension** in MakeCode.\n\n* open [https://arcade.makecode.com/](https://arcade.makecode.com/)\n* click on **New Project**\n* click on **Extensions** under the gearwheel menu\n* search for **https://github.com/kiki-lee/bubble_ext** and import\n\n## Edit this project ![Build status badge](https://github.com/kiki-lee/bubble_ext/workflows/MakeCode/badge.svg)\n\nTo edit this repository in MakeCode.\n\n* open [https://arcade.makecode.com/](https://arcade.makecode.com/)\n* click on **Import** then click on **Import URL**\n* paste **https://github.com/kiki-lee/bubble_ext** and click import\n\n## Blocks preview\n\nThis image shows the blocks code from the last commit in master.\nThis image may take a few minutes to refresh.\n\n![A rendered view of the blocks](https://github.com/kiki-lee/bubble_ext/raw/master/.github/makecode/blocks.png)\n\n#### Metadata (used for search, rendering)\n\n* for PXT/arcade\n\n", + "assets.json": "", + "bubble.ts": "namespace SpriteKind {\n //% isKind\n export const Bubbles = SpriteKind.create()\n}\ntiles.setCurrentTilemap(tilemap` `)\n\n\n//% color=#32c4de icon=\"\\uf192\"\nnamespace bubble {\n\n let codingThisBall = 0\n export let list: Image[] = []\n let burstBubble: Sprite = null\n let ShotNumber = 0\n let bonus = 0\n let totalBallsOut = 0\n let foundRoot = false\n let currentLocation: tiles.Location = null\n let locationsToClear: tiles.Location[] = []\n let lookingForTile: Image = null\n let clearCount = 0\n let locationQueue: tiles.Location[] = []\n let alreadyVisited: Image = null\n let aimingAngle = 0\n let myBall: Sprite = null\n\n\n /**\n * Appear to toss the bubble\n */\n //% blockId=tossBubble \n //% block=\"toss bubble\"\n //% help=bubble/toss_bubble\n export function tossBubble() {\n if (!(stateTransitions.stateIs(\"aiming\"))) {\n return\n }\n stateTransitions.changeState(\"throwing\")\n spriteutils.setVelocityAtAngle(myBall, spriteutils.degreesToRadians(aimingAngle), 300)\n sprites.setDataNumber(myBall, \"vx\", myBall.vx)\n sprites.setDataNumber(myBall, \"vy\", myBall.vy)\n }\n\n\n\n function maybeAddToQueue(column: number, row: number) {\n if (alreadyVisited.getPixel(column, row) == 0) {\n locationQueue.push(tiles.getTileLocation(column, row))\n alreadyVisited.setPixel(column, row, 15)\n }\n }\n\n function checkForMatches(thisBall: Sprite) {\n if (tiles.tileAtLocationEquals(myBall.tilemapLocation(), assets.tile`myTile0`)) {\n game.gameOver(false)\n }\n sprites.destroy(thisBall)\n tiles.setTileAt(thisBall.tilemapLocation(), thisBall.image)\n tiles.setWallAt(thisBall.tilemapLocation(), true)\n alreadyVisited = image.create(20, 15)\n clearCount = 0\n lookingForTile = thisBall.image\n locationQueue = []\n locationsToClear = []\n maybeAddToQueue(thisBall.tilemapLocation().column, thisBall.tilemapLocation().row)\n alreadyVisited.drawRect(0, 0, 20, 15, 15)\n stateTransitions.changeState(\"scoring\")\n timer.background(function () {\n while (locationQueue.length > 0) {\n currentLocation = locationQueue.removeAt(0)\n if (tileUtil.tileIs(tileUtil.currentTilemap(), currentLocation, lookingForTile)) {\n locationsToClear.push(currentLocation)\n maybeAddToQueue(currentLocation.column + 1, currentLocation.row + 0)\n maybeAddToQueue(currentLocation.column - 1, currentLocation.row + 0)\n maybeAddToQueue(currentLocation.column + 0, currentLocation.row + 1)\n maybeAddToQueue(currentLocation.column + 0, currentLocation.row - 1)\n }\n }\n if (locationsToClear.length >= 3) {\n pause(100)\n for (let value of locationsToClear) {\n clearLocation(value.column, value.row)\n info.changeScoreBy(1)\n }\n info.changeScoreBy(Math.floor(1.5 ** locationsToClear.length) - 3)\n alreadyVisited.fill(0)\n alreadyVisited.drawRect(0, 0, 20, 15, 15)\n for (let indexX = 0; indexX <= 19; indexX++) {\n for (let indexY = 0; indexY <= 14; indexY++) {\n maybeAddToQueue(indexX, indexY)\n if (locationQueue.length > 0) {\n locationsToClear = []\n while (locationQueue.length > 0) {\n currentLocation = locationQueue.removeAt(0)\n if (tiles.tileAtLocationIsWall(currentLocation)) {\n locationsToClear.push(currentLocation)\n maybeAddToQueue(currentLocation.column + 1, currentLocation.row + 0)\n maybeAddToQueue(currentLocation.column - 1, currentLocation.row + 0)\n maybeAddToQueue(currentLocation.column + 0, currentLocation.row + 1)\n maybeAddToQueue(currentLocation.column + 0, currentLocation.row - 1)\n }\n }\n foundRoot = false\n for (let value2 of locationsToClear) {\n if (value2.row == 1) {\n foundRoot = true\n break;\n }\n }\n if (!(foundRoot)) {\n for (let value3 of locationsToClear) {\n clearLocation(value3.column, value3.row)\n }\n }\n }\n }\n }\n }\n totalBallsOut = tiles.getTilesByType(assets.tile`myTile1`).length + (tiles.getTilesByType(assets.tile`myTile2`).length + (tiles.getTilesByType(assets.tile`myTile3`).length + (tiles.getTilesByType(assets.tile`myTile4`).length + tiles.getTilesByType(assets.tile`myTile5`).length)))\n if (totalBallsOut <= 0) {\n bonus = Math.round((120000 - game.runtime()) / 200)\n if (bonus > 0) {\n game.setGameOverMessage(true, \"Speed Bonus:\" + bonus + \" points!\")\n info.changeScoreBy(bonus)\n }\n game.gameOver(true)\n }\n })\n stateTransitions.changeState(\"aiming\")\n }\n\n\n\n /**\n * Appear to aim further left\n */\n //% blockId=aimLeft \n //% block=\"change angle left\"\n //% help=bubble/aim_left\n export function tilt_angle_left() {\n if (stateTransitions.stateIs(\"aiming\")) {\n aimingAngle = Math.constrain(aimingAngle - 1.5, -175, -5)\n }\n }\n\n /**\n * Appear to aim further right\n */\n //% blockId=aimRight \n //% block=\"change angle right\"\n //% help=bubble/aim_right\n export function tilt_angle_right() {\n if (stateTransitions.stateIs(\"aiming\")) {\n aimingAngle = Math.constrain(aimingAngle + 1.5, -175, -5)\n }\n }\n\n\n\n\n function clearLocation(column: number, row: number) {\n burstBubble = sprites.create(img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, SpriteKind.Player)\n tiles.placeOnTile(burstBubble, tiles.getTileLocation(column, row))\n if (tiles.tileAtLocationEquals(tiles.getTileLocation(column, row), assets.tile`myTile2`)) {\n animation.runImageAnimation(\n burstBubble,\n [img`\n . . . . . . . . . . . . . . . .\n . . . . . . . . . . . . . . . .\n . . . . . . . . . . . . . . . .\n . . . . . . . . . . . . . . . .\n . . . . . . 3 3 3 . . . . . . .\n . . . . . 3 . . . 3 . . . . . .\n . . . . 3 . . . . . 3 . . . . .\n . . . . 3 . . . . . 3 . . . . .\n . . . . 3 . . . . . 3 . . . . .\n . . . . . 3 . . . 3 . . . . . .\n . . . . . . 3 3 3 . . . . . . .\n . . . . . . . . . . . . . . . .\n . . . . . . . . . . . . . . . .\n . . . . . . . . . . . . . . . .\n . . . . . . . . . . . . . . . .\n . . . . . . . . . . . . . . . .\n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 3 . . . . . . . . \n . . . . 3 . . . . . 3 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 3 . . . . . . . 3 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . 3 . . . . . 3 . . . . . \n . . . . . . . 3 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 3 . . . . . . . . \n . . . 3 . . . . . . . 3 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 3 . . . . . . . . . 3 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 3 . . . . . . . 3 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 3 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 3 . . . . . . 3 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 3 . . . . . . . . \n . 3 . . . . . . . . . . . 3 . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 3 . . . . . . . . . 3 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 3 . . . . . . . . \n `],\n 50,\n false\n )\n } else if (tiles.tileAtLocationEquals(tiles.getTileLocation(column, row), assets.tile`myTile1`)) {\n animation.runImageAnimation(\n burstBubble,\n [img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . 2 2 2 . . . . . . . \n . . . . . 2 . . . 2 . . . . . . \n . . . . 2 . . . . . 2 . . . . . \n . . . . 2 . . . . . 2 . . . . . \n . . . . 2 . . . . . 2 . . . . . \n . . . . . 2 . . . 2 . . . . . . \n . . . . . . 2 2 2 . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 2 . . . . . . . . \n . . . . 2 . . . . . 2 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 2 . . . . . . . 2 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . 2 . . . . . 2 . . . . . \n . . . . . . . 2 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 2 . . . . . . . . \n . . . 2 . . . . . . . 2 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 2 . . . . . . . . . 2 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 2 . . . . . . . 2 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 2 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 2 . . . . . . 2 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 2 . . . . . . . . \n . 2 . . . . . . . . . . . 2 . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 2 . . . . . . . . . 2 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 2 . . . . . . . . \n `],\n 50,\n false\n )\n } else if (tiles.tileAtLocationEquals(tiles.getTileLocation(column, row), assets.tile`myTile4`)) {\n animation.runImageAnimation(\n burstBubble,\n [img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . 5 5 5 . . . . . . . \n . . . . . 5 . . . 5 . . . . . . \n . . . . 5 . . . . . 5 . . . . . \n . . . . 5 . . . . . 5 . . . . . \n . . . . 5 . . . . . 5 . . . . . \n . . . . . 5 . . . 5 . . . . . . \n . . . . . . 5 5 5 . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 5 . . . . . . . . \n . . . . 5 . . . . . 5 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 5 . . . . . . . 5 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . 5 . . . . . 5 . . . . . \n . . . . . . . 5 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 5 . . . . . . . . \n . . . 5 . . . . . . . 5 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 5 . . . . . . . . . 5 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 5 . . . . . . . 5 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 5 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 5 . . . . . . 5 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 5 . . . . . . . . \n . 5 . . . . . . . . . . . 5 . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 5 . . . . . . . . . 5 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 5 . . . . . . . . \n `],\n 50,\n false\n )\n } else if (tiles.tileAtLocationEquals(tiles.getTileLocation(column, row), assets.tile`myTile5`)) {\n animation.runImageAnimation(\n burstBubble,\n [img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . 6 6 6 . . . . . . . \n . . . . . 6 . . . 6 . . . . . . \n . . . . 6 . . . . . 6 . . . . . \n . . . . 6 . . . . . 6 . . . . . \n . . . . 6 . . . . . 6 . . . . . \n . . . . . 6 . . . 6 . . . . . . \n . . . . . . 6 6 6 . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 6 . . . . . . . . \n . . . . 6 . . . . . 6 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 6 . . . . . . . 6 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . 6 . . . . . 6 . . . . . \n . . . . . . . 6 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 6 . . . . . . . . \n . . . 6 . . . . . . . 6 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 6 . . . . . . . . . 6 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 6 . . . . . . . 6 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 6 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 6 . . . . . . 6 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 6 . . . . . . . . \n . 6 . . . . . . . . . . . 6 . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 6 . . . . . . . . . 6 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 6 . . . . . . . . \n `],\n 50,\n false\n )\n } else if (tiles.tileAtLocationEquals(tiles.getTileLocation(column, row), assets.tile`myTile3`)) {\n animation.runImageAnimation(\n burstBubble,\n [img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . 4 4 4 . . . . . . . \n . . . . . 4 . . . 4 . . . . . . \n . . . . 4 . . . . . 4 . . . . . \n . . . . 4 . . . . . 4 . . . . . \n . . . . 4 . . . . . 4 . . . . . \n . . . . . 4 . . . 4 . . . . . . \n . . . . . . 4 4 4 . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 4 . . . . . . . . \n . . . . 4 . . . . . 4 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 4 . . . . . . . 4 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . 4 . . . . . 4 . . . . . \n . . . . . . . 4 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 4 . . . . . . . . \n . . . 4 . . . . . . . 4 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 4 . . . . . . . . . 4 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 4 . . . . . . . 4 . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 4 . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n `, img`\n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . . 4 . . . . . . 4 . . . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 4 . . . . . . . . \n . 4 . . . . . . . . . . . 4 . . \n . . . . . . . . . . . . . . . . \n . . . . . . . . . . . . . . . . \n . . 4 . . . . . . . . . 4 . . . \n . . . . . . . . . . . . . . . . \n . . . . . . . 4 . . . . . . . . \n `],\n 50,\n false\n )\n } else {\n\n }\n burstBubble.lifespan = 150\n tiles.setTileAt(tiles.getTileLocation(column, row), assets.tile`transparency8`)\n tiles.setWallAt(tiles.getTileLocation(column, row), false)\n clearCount += 1\n music.play(music.createSoundEffect(\n WaveShape.Sawtooth,\n 100 * clearCount,\n 3000 + 500 * clearCount,\n 255,\n 0,\n 100,\n SoundExpressionEffect.None,\n InterpolationCurve.Logarithmic\n ), music.PlaybackMode.UntilDone)\n }\n spriteutils.createRenderable(0, function (screen2) {\n if (stateTransitions.stateIs(\"aiming\")) {\n for (let index = 0; index <= 4; index++) {\n if(myBall){\n screen2.setPixel(myBall.x + (index + 1) * 8 * Math.cos(spriteutils.degreesToRadians(aimingAngle)), myBall.y + (index + 1) * 8 * Math.sin(spriteutils.degreesToRadians(aimingAngle)), 11)\n }\n }\n }\n })\n\n\n /**\n * Appear to load the bubble\n */\n //% blockId=loadBubble \n //% block=\"load new bubble\"\n //% help=bubble/load_bubble\n export function load_bubble() {\n pauseUntil(() => stateTransitions.stateIs(\"aiming\"))\n if (totalBallsOut < 8) {\n for (let value4 of bubble.list) {\n if (tiles.getTilesByType(value4).length == 0 && bubble.list.indexOf(value4) >= 0) {\n bubble.list.removeAt(bubble.list.indexOf(value4))\n } else if (tiles.getTilesByType(value4).length > 0 && bubble.list.indexOf(value4) < 0) {\n bubble.list.push(value4)\n }\n }\n }\n codingThisBall = randint(0, bubble.list.length - 1)\n ShotNumber += 1\n myBall = sprites.create(bubble.list[codingThisBall], SpriteKind.Bubbles)\n myBall.x = 80\n myBall.bottom = 102\n\n }\n\n\n /**\n * Set up the board grid\n */\n //% blockId=createBoard \n //% block=\"arrange board\"\n //% help=bubble/create_board\n export function createBoard() {\n tiles.setCurrentTilemap(tileUtil.createSmallMap(tilemap`level0`))\n bubble.list = [\n assets.tile`myTile1`,\n assets.tile`myTile2`,\n assets.tile`myTile3`,\n assets.tile`myTile4`,\n assets.tile`myTile5`\n ]\n aimingAngle = -90\n for (let indexX2 = 0; indexX2 <= 17; indexX2++) {\n for (let indexY2 = 0; indexY2 <= 1; indexY2++) {\n if(bubble.list.length > 0){\n tiles.setWallAt(tiles.getTileLocation(indexX2 + 1, indexY2 + 1), true)\n tiles.setTileAt(tiles.getTileLocation(indexX2 + 1, indexY2 + 1), bubble.list._pickRandom())\n }\n }\n }\n controller.configureRepeatEventDefaults(0, 30)\n ShotNumber = 0\n stateTransitions.changeState(\"aiming\")\n }\n\n\n /**\n * Decides where the bubble should stick\n * \n */\n //% blockId=stick_to_wall\n //% block=\"stick $sprite to $location\"\n //% sprite.shadow=variables_get\n //% sprite.defl=sprite\n //% location.shadow=variables_get\n //% location.defl=location\n export function stick_to_wall(sprite: Sprite, location: tiles.Location) {\n stateTransitions.changeState(\"checking\")\n if (!(tiles.tileAtLocationEquals(location, assets.tile`myTile`))) {\n if (tiles.tileAtLocationEquals(location, assets.tile`bottom_row`)) {\n sprites.destroy(sprite)\n info.changeScoreBy(-1)\n } else if (tiles.tileAtLocationIsWall(sprite.tilemapLocation().getNeighboringLocation(CollisionDirection.Bottom)) || tiles.tileAtLocationIsWall(sprite.tilemapLocation().getNeighboringLocation(CollisionDirection.Right)) || tiles.tileAtLocationIsWall(sprite.tilemapLocation().getNeighboringLocation(CollisionDirection.Top)) || tiles.tileAtLocationIsWall(sprite.tilemapLocation().getNeighboringLocation(CollisionDirection.Left))) {\n sprite.setVelocity(0, 0)\n checkForMatches(sprite)\n } else {\n sprite.setVelocity(0, 0)\n sprite.y += -8\n checkForMatches(sprite)\n }\n } else {\n if (sprite.isHittingTile(CollisionDirection.Left)) {\n sprites.setDataNumber(myBall, \"vx\", Math.abs(sprites.readDataNumber(sprite, \"vx\")))\n }\n if (sprite.isHittingTile(CollisionDirection.Right)) {\n sprites.setDataNumber(myBall, \"vx\", 0 - Math.abs(sprites.readDataNumber(sprite, \"vx\")))\n }\n if (sprite.isHittingTile(CollisionDirection.Top)) {\n sprite.setVelocity(0, 0)\n checkForMatches(sprite)\n }\n if (sprite.isHittingTile(CollisionDirection.Bottom)) {\n sprites.setDataNumber(myBall, \"vy\", 0 - Math.abs(sprites.readDataNumber(sprite, \"vy\")))\n }\n }\n }\n\n}\n", + "images.g.jres": "{\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myImages\"\n }\n}", + "images.g.ts": "// Auto-generated code. Do not edit.\nnamespace myImages {\n\n helpers._registerFactory(\"image\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n helpers._registerFactory(\"animation\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n helpers._registerFactory(\"song\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n", + "main.blocks": "PlayerProjectileFoodEnemyBubblesspritelocation", + "main.ts": "\n", + "pxt.json": "{\n \"name\": \"bubble_ext_for_assetjson\",\n \"version\": \"0.0.10\",\n \"description\": \"\",\n \"dependencies\": {\n \"device\": \"*\",\n \"arcade-tile-util\": \"github:microsoft/arcade-tile-util#v1.2.0\",\n \"arcade-sprite-util\": \"github:jwunderl/arcade-sprite-util#v0.3.1\",\n \"arcade-state-transitions\": \"github:riknoll/arcade-state-transitions#v0.0.2\",\n \"controller\": \"*\",\n \"Timers\": \"github:microsoft/arcade-timers#v1.1.0\",\n \"arcade-sprite-data\": \"github:microsoft/arcade-sprite-data#v0.2.1\"\n },\n \"files\": [\n \"main.blocks\",\n \"main.ts\",\n \"README.md\",\n \"assets.json\",\n \"tilemap.g.jres\",\n \"tilemap.g.ts\",\n \"images.g.jres\",\n \"images.g.ts\",\n \"bubble.ts\"\n ],\n \"testFiles\": [\n \"test.ts\"\n ],\n \"targetVersions\": {\n \"branch\": \"v1.12.49\",\n \"tag\": \"v1.12.49\",\n \"commits\": \"https://github.com/microsoft/pxt-arcade/commits/8b39eda27ca91b27b57fc1f30c6b3b33d3fc2029\",\n \"target\": \"1.12.51\",\n \"pxt\": \"8.5.60\",\n \"targetId\": \"arcade\"\n },\n \"supportedTargets\": [\n \"arcade\"\n ],\n \"preferredEditor\": \"blocksprj\",\n \"palette\": [\n \"#000000\",\n \"#FFFFFF\",\n \"#DF012E\",\n \"#F696F8\",\n \"#708DFF\",\n \"#FF9500\",\n \"#5FDF5D\",\n \"#94BD84\",\n \"#3E76F9\",\n \"#87F2FF\",\n \"#FFF5FD\",\n \"#A4839F\",\n \"#5C406c\",\n \"#E5CDC4\",\n \"#E5F7FF\",\n \"#000000\"\n ]\n}\n", + "test.ts": "// tests go here; this will not be compiled when this package is used as an extension.\n", + "tilemap.g.jres": "{\n \"tile1\": {\n \"data\": \"hwQIAAgAAAC8u7y7vLu8u7y7vLvMzLy7vLu8u7y7vLu8u8zMvLu8uw==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"myTile\"\n },\n \"tile4\": {\n \"data\": \"hwQIAAgAAAAAMwMAMDMzADMzMwMzMzMDMzMzAzAzMwAAMwMAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"myTile2\"\n },\n \"tile5\": {\n \"data\": \"hwQIAAgAAAAARAQAQEREAERERAREREQEREREBEBERAAARAQAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"myTile3\"\n },\n \"tile6\": {\n \"data\": \"hwQIAAgAAAAAVQUAUFVVAFVVVQVVVVUFVVVVBVBVVQAAVQUAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"myTile4\"\n },\n \"tile7\": {\n \"data\": \"hwQIAAgAAAAAZgYAYGZmAGZmZgZmZmYGZmZmBmBmZgAAZgYAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"myTile5\"\n },\n \"tile9\": {\n \"data\": \"hwQIAAgAAAAAAAC8AAAAvAAAALwAAADMAAAAvAAAALwAAAC8AAAAvA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"bottom_row\"\n },\n \"tile3\": {\n \"data\": \"hwQIAAgAAAAAIgIAICIiACIiIgIiIiICIiIiAiAiIgAAIgIAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"myTile1\"\n },\n \"tile2\": {\n \"data\": \"hwQIAAgAAAAMAAAADAAAAAwAAAAAAAAADAAAAAwAAAAMAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true,\n \"displayName\": \"myTile0\"\n },\n \"transparency16\": {\n \"data\": \"hwQQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true\n },\n \"transparency8\": {\n \"data\": \"hwQIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true\n },\n \"level4\": {\n \"id\": \"level4\",\n \"mimeType\": \"application/mkcd-tilemap\",\n \"data\": \"MTAxMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA==\",\n \"tileset\": [\n \"myTiles.transparency16\"\n ],\n \"displayName\": \"level4\"\n },\n \"level2\": {\n \"id\": \"level2\",\n \"mimeType\": \"application/mkcd-tilemap\",\n \"data\": \"MDgxNDAwMGYwMDAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMTAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMTIyMjIyMjIyMjIyMjIyMjIyMjIyMDIwMDAwMDAwMDAwMDAwMDAwMjAwMjAwMDAwMDAwMDAwMDAwMDAyMDAyMDAwMDAwMDAwMDAwMDAwMDIwMDIwMDAwMDAwMDAwMDAwMDAwMjAwMjAwMDAwMDAwMDAwMDAwMDAyMDAyMDAwMDAwMDAwMDAwMDAwMDIwMDIwMDAwMDAwMDAwMDAwMDAwMjAwMjAwMDAwMDAwMDAwMDAwMDAyMDAyMDAwMDAwMDAwMDAwMDAwMDIwMDIwMDAwMDAwMDAwMDAwMDAwMjAwMjAwMDAwMDAwMDAwMDAwMDAyMDAyMDAwMDAwMDAwMDAwMDAwMDIwMDIwMDAwMDAwMDAwMDAwMDAwMjAwMjAwMDAwMDAwMDAwMDAwMDAyMA==\",\n \"tileset\": [\n \"myTiles.transparency8\",\n \"myTiles.tile1\",\n \"myTiles.tile9\",\n \"myTiles.tile2\"\n ],\n \"displayName\": \"level0\"\n },\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myTiles\"\n }\n}", + "tilemap.g.ts": "// Auto-generated code. Do not edit.\nnamespace myTiles {\n //% fixedInstance jres blockIdentity=images._tile\n export const tile1 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile4 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile5 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile6 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile7 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile9 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile3 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const tile2 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const transparency16 = image.ofBuffer(hex``);\n //% fixedInstance jres blockIdentity=images._tile\n export const transparency8 = image.ofBuffer(hex``);\n\n helpers._registerFactory(\"tilemap\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"level4\":\n case \"level4\":return tiles.createTilemap(hex`1000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000`, img`\n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n. . . . . . . . . . . . . . . . \n`, [myTiles.transparency16], TileScale.Sixteen);\n case \"level0\":\n case \"level2\":return tiles.createTilemap(hex`14000f00010101010101010101010101010101010101010101000000000000000000000000000000000000010100000000000000000000000000000000000001010000000000000000000000000000000000000101000000000000000000000000000000000000010100000000000000000000000000000000000001010000000000000000000000000000000000000101000000000000000000000000000000000000010100000000000000000000000000000000000001010000000000000000000000000000000000000101030303030303030303030303030303030303010100000000000000000000000000000000000001010000000000000000000000000000000000000101000000000000000000000000000000000000010102020202020202020202020202020202020201`, img`\n2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n2 . . . . . . . . . . . . . . . . . . 2 \n`, [myTiles.transparency8,myTiles.tile1,myTiles.tile9,myTiles.tile2], TileScale.Eight);\n }\n return null;\n })\n\n helpers._registerFactory(\"tile\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"myTile\":\n case \"tile1\":return tile1;\n case \"myTile2\":\n case \"tile4\":return tile4;\n case \"myTile3\":\n case \"tile5\":return tile5;\n case \"myTile4\":\n case \"tile6\":return tile6;\n case \"myTile5\":\n case \"tile7\":return tile7;\n case \"bottom_row\":\n case \"tile9\":return tile9;\n case \"myTile1\":\n case \"tile3\":return tile3;\n case \"myTile0\":\n case \"tile2\":return tile2;\n case \"transparency16\":return transparency16;\n case \"transparency8\":return transparency8;\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n" +} + +``` \ No newline at end of file