From 05904e4807a1c690ab7b3b69a4293780ff2b90d7 Mon Sep 17 00:00:00 2001 From: Kiki Prottsman Date: Thu, 14 Dec 2023 17:23:37 -0800 Subject: [PATCH] Updating Gopher and Free Throw Jr (#6283) --- docs/static/mcj/gopher/how1-1.gif | Bin 33143 -> 16782 bytes docs/test/mcj/goal1/goal1-1.md | 8 +- docs/test/mcj/goal1/goal1-2.md | 8 +- docs/test/mcj/gopher/gopher1.md | 29 +- docs/test/mcj/gopher/gopher2.md | 29 +- docs/test/mcj/gopher/gopher3.md | 30 +- docs/test/mcj/gopher/gopher4.md | 15 +- docs/test/tutorials/free-throw-jr.md | 720 ++++++++++++--------------- 8 files changed, 376 insertions(+), 463 deletions(-) diff --git a/docs/static/mcj/gopher/how1-1.gif b/docs/static/mcj/gopher/how1-1.gif index 0a22e62e15b01fcb8ca690ce31fed5a975cc5e48..cd1a22683360f1e402cdf99c9804e90091eee18d 100644 GIT binary patch literal 16782 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 @@ -35,7 +35,7 @@ ## Great Job! @showdialog - [![Level 2](/static/mkj/assets/next.png)](https://arcade.makecode.com/beta#recipe:/test/mkj/goal1/goal1-2) + [![Level 2](/static/mcj/assets/next.png)](https://arcade.makecode.com/beta#recipe:/test/mcj/goal1/goal1-2) diff --git a/docs/test/mcj/goal1/goal1-2.md b/docs/test/mcj/goal1/goal1-2.md index 2cd3e5f0de1..ee50590ae2a 100644 --- a/docs/test/mcj/goal1/goal1-2.md +++ b/docs/test/mcj/goal1/goal1-2.md @@ -5,18 +5,18 @@ -![How to win](/static/mkj/goal/goal1-2.gif "Walk forward to get to the ball!") +![How to win](/static/mcj/goal/goal1-2.gif "Walk forward to get to the ball!") ## {One Step} -![How to build](/static/mkj/goal/how1-2.gif "Add three right arrows") +![How to build](/static/mcj/goal/how1-2.gif "Add three right arrows") # {How to Run} -![How to Check](/static/mkj/goal/check1-2.gif "Click the A button on the game window") --> +![How to Check](/static/mcj/goal/check1-2.gif "Click the A button on the game window") --> ```blocks @@ -31,7 +31,7 @@ ## Great Job! @showdialog - + diff --git a/docs/test/mcj/gopher/gopher1.md b/docs/test/mcj/gopher/gopher1.md index 2372be44784..986d057c39c 100755 --- a/docs/test/mcj/gopher/gopher1.md +++ b/docs/test/mcj/gopher/gopher1.md @@ -2,7 +2,7 @@ ### @explicitHints true ### @flyoutOnly true -## Let's Get Gopher Crazy! @showdialog +## Gopher it! @showdialog Get the gopher to the acorn. @@ -16,10 +16,7 @@ Get the gopher to the acorn. Move down to get the acorn! -```block -sprites.step_down() -``` - +--- ![How to build](/static/mcj/gopher/how1-1.gif "Dig down to get to the acorn.") @@ -38,7 +35,7 @@ sprites.step_down() #### ~ tutorialhint ```blocks - controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + controller.onA(function () { //@highlight sprites.step_down() }) @@ -57,10 +54,9 @@ arcade-block-icons=github:kiki-lee/arcade-block-icons ``` -```template - - controller.A.onEvent(ControllerButtonEvent.Pressed, function () {}) +```template + controller.onA( function () {}) ``` @@ -192,11 +188,22 @@ namespace sprites { pause(500) } - - } + namespace controller { + /** + * Register code run when a controller event occurs + * @param event + * @param handler + */ + //% weight=99 blockGap=8 + //% blockId=ctrlonA block="on `ICON.a-button-white-invert`" + //% help=docs/on-a + export function onA(handler: () => void) { + controller.A.onEvent(ControllerButtonEvent.Pressed, handler) + } + } ``` diff --git a/docs/test/mcj/gopher/gopher2.md b/docs/test/mcj/gopher/gopher2.md index 830cb7f32da..d7a2c481bb4 100755 --- a/docs/test/mcj/gopher/gopher2.md +++ b/docs/test/mcj/gopher/gopher2.md @@ -2,7 +2,7 @@ ### @explicitHints true ### @flyoutOnly true -## Let's Get Gopher Crazy! @showdialog +## Gopher the goal! @showdialog Get the gopher to the acorn. @@ -16,10 +16,6 @@ Get the gopher to the acorn. Move down to get the acorn! -```block -sprites.step_down() -``` - --- @@ -35,7 +31,7 @@ sprites.step_down() #### ~ tutorialhint ```blocks - controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + controller.onA (function () { //@highlight sprites.step_down() //@highlight @@ -56,10 +52,9 @@ arcade-block-icons=github:kiki-lee/arcade-block-icons ``` -```template - - controller.A.onEvent(ControllerButtonEvent.Pressed, function () {}) +```template + controller.onA( function () {}) ``` @@ -191,12 +186,24 @@ namespace sprites { pause(500) } - - } + namespace controller { + /** + * Register code run when a controller event occurs + * @param event + * @param handler + */ + //% weight=99 blockGap=8 + //% blockId=ctrlonA block="on `ICON.a-button-white-invert`" + //% help=docs/on-a + export function onA(handler: () => void) { + controller.A.onEvent(ControllerButtonEvent.Pressed, handler) + } + } + ``` diff --git a/docs/test/mcj/gopher/gopher3.md b/docs/test/mcj/gopher/gopher3.md index ca6af864d2e..f5f025c2a1a 100755 --- a/docs/test/mcj/gopher/gopher3.md +++ b/docs/test/mcj/gopher/gopher3.md @@ -1,8 +1,8 @@ -# Gopher the Goal +# Gopher the Acorn ### @explicitHints true ### @flyoutOnly true -## Let's Get Gopher Crazy! @showdialog +## Gopher the acorn! @showdialog Get the gopher to the acorn. @@ -16,11 +16,6 @@ Get the gopher to the acorn. Move down to get the acorn! -```block -sprites.step_down() -``` - - --- @@ -35,7 +30,7 @@ sprites.step_down() #### ~ tutorialhint ```blocks - controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + controller.onA(function () { //@highlight sprites.step_down() //@highlight @@ -58,10 +53,9 @@ arcade-block-icons=github:kiki-lee/arcade-block-icons ``` -```template - - controller.A.onEvent(ControllerButtonEvent.Pressed, function () {}) +```template + controller.onA( function () {}) ``` @@ -193,13 +187,25 @@ namespace sprites { pause(500) } + } + namespace controller { + /** + * Register code run when a controller event occurs + * @param event + * @param handler + */ + //% weight=99 blockGap=8 + //% blockId=ctrlonA block="on `ICON.a-button-white-invert`" + //% help=docs/on-a + export function onA(handler: () => void) { + controller.A.onEvent(ControllerButtonEvent.Pressed, handler) + } } - ``` diff --git a/docs/test/mcj/gopher/gopher4.md b/docs/test/mcj/gopher/gopher4.md index 85bcc938173..155b086f2ec 100755 --- a/docs/test/mcj/gopher/gopher4.md +++ b/docs/test/mcj/gopher/gopher4.md @@ -14,13 +14,14 @@ Get the gopher to the acorn. ## {Get to the Acorns} -Use loops to get the acorn! +Use a loop to get the acorn! + +--- ```block loops.loopThis(4, function (){ }) ``` - --- @@ -30,7 +31,7 @@ loops.loopThis(4, function (){ }) #### ~ tutorialhint ```blocks - controller.A.onEvent(ControllerButtonEvent.Pressed, function () { + controller.onA( function () { //@highlight loops.loopThis(4, function () { sprites.step_down() @@ -49,14 +50,12 @@ loops.loopThis(4, function (){ }) pxt-tilemaps=github:microsoft/pxt-tilemaps pxt-characterAnimations=github:microsoft/arcade-character-animations makecodejr-assets=github:kiki-lee/makecodejr-assets -arcade-block-icons=github:kiki-lee/arcade-block-icons +arcade-block-icons=github:kiki-lee/arcade-block-icons#v0.0.13 ``` ```template - - controller.A.onEvent(ControllerButtonEvent.Pressed, function () {}) - + controller.onA( function () {}) ``` @@ -215,7 +214,7 @@ namespace sprites { //% blockId=ctrlonA block="on `ICON.a-button-white-invert`" //% help=docs/on-a export function onA(handler: () => void) { - controller.A.onEvent(ControllerButtonEvent.Pressed, handler) + controller.A.onEvent(ControllerButtonEvent.Pressed, handler) } } diff --git a/docs/test/tutorials/free-throw-jr.md b/docs/test/tutorials/free-throw-jr.md index f283533a2a2..708a4f659b9 100644 --- a/docs/test/tutorials/free-throw-jr.md +++ b/docs/test/tutorials/free-throw-jr.md @@ -1,5 +1,6 @@ # Basketball Free Throw ### @explicitHints true +### @flyoutOnly true ## {1. Introduction @showdialog} @@ -11,46 +12,22 @@ Line up your shot and see if you can slam dunk this Basketball free throw game! ## {2. Your First Block} -**Ready to start coding?** - -Let's add the basketball court background. - ---- - - -- :tree: Go to the ``||scene: Scene||`` category **in the toolbox** and grab
-``||scene:set background image to [ ]||``
-then snap it inside the empty
-``||loops(noclick): on start||``
-block already in the workspace. - - - -~hint What does that mean? ๐Ÿคท๐Ÿฝ +Add the court! --- -When giving instructions, we'll highlight some text to give you a better idea of what you are looking for. - -For example, when we suggest the
-``||scene:set background image to [ ]||``
-block, we are pointing you toward
```block -scene.setBackgroundImage(img`.`) +freethrow.setCourt() ``` -hint~ - -

-๐Ÿ’ก _The court image should be preloaded in the block, but you are welcome to edit the image if you like._ #### ~ tutorialhint ```blocks //@highlight -scene.setBackgroundImage(throw_imgs.court) +freethrow.setCourt() ``` @@ -77,117 +54,21 @@ You should see the court background that you just added. --- -- :paper plane: From ``||sprites:Sprites||``, drag
-``||variables(sprites):set [athlete] to sprite [ ] of kind [Player]||``
-to **the end** of the -``||loops:on start||`` container. - - -~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 athlete will be a sprite, too. - -hint~ - -

-๐Ÿ’ก _The athlete image should be preloaded in the block, but you are welcome to edit the image if you like._ - - -#### ~ tutorialhint -```blocks -scene.setBackgroundImage(throw_imgs.court) -//@highlight -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) - +```block +freethrow.addPlayer(throw_imgs.dunk) ``` -## {5. Position the Player Character at the bottom of the screen} - - -Let's move the athlete down to give it room to grow. - ---- - -- :paper plane: From the ``||sprites: Sprites||`` category in the toolbox, grab
-``||sprites: set [athlete] position to x [80] y [90]||``
-and snap it inside at the **end** of the -``||loops(noclick): on start||`` -block already in your workspace. - - -~hint Why use 80 and 90? ๐Ÿ’ก - --- -The width of the screen is 160 pixels, so an **x** value of **80** will place the athlete in the middle of the screen from left to right. - -The **y** value of **90** will put the athlete near the bottom of the screen because the screen height is 120 pixels. - -These numbers were carefully selected to put the athlete in the right place for the next several steps...but you can also play around with the values to see what happens when you make them larger or smaller. - -hint~ - +๐Ÿ’ก _You can click the image of the player to make changes._ #### ~ tutorialhint ```blocks -scene.setBackgroundImage(throw_imgs.court) -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) +freethrow.setCourt() //@highlight -athlete.setPosition(80, 90) -``` - - - - - -## {6. Set the playerโ€™s velocity (movement)} - -In this game, your player will be moving back and forth. - ---- - -- :paper plane: From ``||sprites:Sprites||``, drag
-``||sprites:set [athelete] velocity to vx [50] vy [0]||``
-to **the end** of the
-``||loops(onclick):on start||`` container. - - -~hint What are vx and vy?๐Ÿ’ก - ---- - -In MakeCode Arcade, **vx** stands for the "velocity in the direction of x" โ€” which is a complicated way of saying "the speed from side to side." - -- The larger your **vx** value is, the faster something will travel to the right. -- The lower your **vx**, the faster it will travel to the left. -- If your **vx** is 0, the item won't move from side to side at all. - - -Similarly, **vy** stands for the "velocity in the direction of y" โ€” which is a -complicated way of saying "the speed from top to bottom." - -- The larger your **vy** value is, the faster something will travel downward. -- The lower your **vy**, the faster it will travel upward. -- If your **vy** is 0, the item won't move either up or down. - -hint~ - - -#### ~ tutorialhint -```blocks -scene.setBackgroundImage(throw_imgs.court) -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -//@highlight -athlete.setVelocity(50, 0) +freethrow.throw_imgs.dunk ``` @@ -202,153 +83,51 @@ You should see the athlete start running forward. -## {8. Make the player bounce off walls} - -**The athlete ran away!**
-Let's add a block to keep them inside the court. - ---- - -- :paper plane: From ``||sprites:Sprites||``, grab a
-``||sprites:set [athlete] bounce on wall ||``
-block and snap it into the **the end** of the
-``||loops(noclick):on start||`` container.
- - - -#### ~ tutorialhint -```blocks -scene.setBackgroundImage(throw_imgs.court) -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -athlete.setVelocity(50, 0) -//@highlight -athlete.setBounceOnWall(true) - -``` - - ## {9. Create the Basketball Hoop} +**Add the hoop!** -Using what you learned when adding the athlete, add a hoop to the scene then position it against the backboard. - ---- - -~hint Remind me ๐Ÿคจ - -- :paper plane: From ``||sprites:Sprites||``, drag
-``||variables(sprites):set [hoop] to sprite [ ] of kind [Goal]||``
-to **the end** of the -``||loops(noclick):on start||`` container. - -- :paper plane: From the ``||sprites: Sprites||`` category in the toolbox, grab
-``||sprites: set [hoop] position to x [80] y [35]||``
-and snap it inside at the **end** of the -``||loops(noclick): on start||`` -block already in your workspace. - -hint~ - - -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) +```block +freethrow.addHoop() ``` #### ~ tutorialhint ```blocks -scene.setBackgroundImage(throw_imgs.court) -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -athlete.setVelocity(50, 0) -athlete.setBounceOnWall(true) +freethrow.setCourt() +freethrow.throw_imgs.dunk //@highlight -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -//@highlight -hoop.setPosition(80, 35) +freethrow.addHoop() + ``` ## {10. Use (A) Button to Toss} +**Make (A) toss the ball** -Let's code the athlete to shoot basketballs when the (A) button is pressed. - - -- :game: From ``||controller:Controller||``, drag the
-``||controller:on [A] button pressed ||``
-container into **an empty area** of the workspace. - - - -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) -``` - - -#### ~ tutorialhint ```blocks -//@highlight -controller.A.onEvent(ControllerButtonEvent.Pressed, function () { }) -``` - - - - -## {11. Shoot the Basketballs} - -**Add the basketball projectiles.** - - -~hint What are projectiles?๐Ÿ’ก - ---- - -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~ - ---- - - -- :paper plane: Snap
-``||variables(sprites):set [projectile] to projectile [๐Ÿ€] from [athlete] with vx [0] vy [-100]||``
-inside **the empty**
-``||controller(noclick):on [A] button pressed ||``
-container. - -๐Ÿ’ก _The projectile is a basketball, but you can click the ball and change it to whatever you like._ - - - - -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) +freethrow.onA(function () { + freethrow.throwBall() +}) ``` #### ~ tutorialhint ```blocks -controller.A.onEvent(ControllerButtonEvent.Pressed, function () { - projectile = sprites.createProjectileFromSprite(throw_imgs.ball, athlete, 0, -100) +//@highlight +freethrow.onA(function () { + freethrow.throwBall() }) ``` + ## {12. Test it Out} @@ -358,7 +137,7 @@ controller.A.onEvent(ControllerButtonEvent.Pressed, function () { - When you press the (A) button (or space bar) the player should shoot a basketball toward the top of the screen -~hint Mine isn't working ๐Ÿคทโ€โ™‚๏ธ +~hint It isn't working ๐Ÿคทโ€โ™‚๏ธ --- @@ -366,107 +145,44 @@ Take a look at the blocks below to see if your code is missing anything: ```blocks -controller.A.onEvent(ControllerButtonEvent.Pressed, function () { - projectile = sprites.createProjectileFromSprite(throw_imgs.ball, athlete, 0, -100) -}) - -scene.setBackgroundImage(throw_imgs.court) -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -athlete.setVelocity(50, 0) -athlete.setBounceOnWall(true) -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) +freethrow.onA(function () { + freethrow.throwBall() +}) +freethrow.setCourt() +freethrow.addPlayer(throw_imgs.dunk) +freethrow.addHoop() ``` hint~ -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) -``` - - - ## {13. Points when we get a basket} -**Run code when the ball overlaps the hoop!** +**Add points for each basket** --- - -- :paper plane: From ``||sprites:Sprites||``, drag the
-``||sprites:on [sprite] of kind [Projectile] overlaps [othersprite] of kind [Goal]||``
-container into **an empty area** of the workspace. - - -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) +```blocks +freethrow.onOverlapHoop(function () { + freethrow.changeScoreAddPoint(1) + freethrow.destroyBall() +}) ``` - #### ~ tutorialhint ```blocks -sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Goal, function (sprite, otherSprite) { - +//@highlight +freethrow.onOverlapHoop(function () { + freethrow.changeScoreAddPoint(1) + freethrow.destroyBall() }) ``` -## {14. Win when we get a basket} - -**Add a point and destroy the ball.** - ---- - - -- :id card: From ``||info:Info||``, grab
-``||info:change score by [1]||``
-and snap it into **the empty**
-``||sprites(noclick):on [sprite] of kind [Projectile] overlaps...||``
-containter already in the workspace. - - -- :paper plane: From ``||sprites:Sprites||``, grab
-``||sprites:destroy [sprite]||``
-and snap it into **the end** of the
-``||sprites(noclick):on [sprite] of kind [Projectile] overlaps...||``
-containter in the workspace. - - -~hint Why "destroy sprite"? ๐Ÿ’ก - ---- - -You may think we should destroy **projectile** or even **ball** to get rid of the -basketball that overlapped the hoop, but this overlap container requires you to -choose either
-``||variables:sprite||`` or ``||variables:otherSprite||``
-when you want to select one of the **exact** items that touched. - -hint~ - - - -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) -``` - - -#### ~ tutorialhint -```blocks -sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Goal, function (sprite, otherSprite) { - info.changeScoreBy(1) - sprites.destroy(sprite) -}) -``` @@ -479,49 +195,23 @@ You should get a point every time your basketball overlaps the hoop! -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) -``` - - ## {16. Add a time limit} -**Does this game feel long to you?**
-๐Ÿ•” ๐Ÿ•” ๐Ÿ•” - -We haven't added a way to win. -Let's add a countdown timer. - ---- - -- :id card: From ``||info:Info||``, grab
- ``||info:start countdown [30] (s)||``
-and snap it in at **the end of** the
-``||loops(noclick):on start||`` container. - ---- - -๐ŸŽฎ **Play your game and see how many points you can get in 30 seconds!** +** Add a timer** - - -```blockconfig.local -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) +```block +freethrow.gameCountdown(30) ``` + #### ~ tutorialhint ```blocks -scene.setBackgroundImage(throw_imgs.court) -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -athlete.setVelocity(50, 0) -athlete.setBounceOnWall(true) -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) -info.startCountdown(30) +freethrow.setCourt() +freethrow.addPlayer(throw_imgs.dunk) +freethrow.addHoop() +//@highlight +freethrow.gameCountdown(30) ``` @@ -558,92 +248,296 @@ When you've finished playing, click **Done** so you can share your tutorial with - - - - - #### ~ tutorialhint ```blocks -scene.setBackgroundImage(throw_imgs.court) -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -athlete.setVelocity(50, 0) -athlete.setBounceOnWall(true) -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) -//@highlight -info.startCountdown(30) +freethrow.onOverlapHoop(function () { + freethrow.changeScoreAddPoint(1) + freethrow.destroyBall() +}) +freethrow.onA(function () { + freethrow.throwBall() +}) +freethrow.setCourt() +freethrow.addPlayer(throw_imgs.dunk) +freethrow.addHoop() +freethrow.gameCountdown(30) ``` ```blockconfig.global -namespace SpriteKind { - export const Goal = SpriteKind.create() -} -let athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -athlete.setVelocity(50, 0) +freethrow.gameCountdown(30) -athlete.setBounceOnWall(true) -info.startCountdown(30) -sprites.destroy(sprite) +freethrow.addPlayer(throw_imgs.dunk) -sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Goal, function (sprite, otherSprite) { }) -projectile = sprites.createProjectileFromSprite(throw_imgs.ball, athlete, 0, -100) -music.play(music.createSong(hex`00780004080200`), music.PlaybackMode.InBackground) +freethrow.onA(function () { + freethrow.throwBall() +}) + +freethrow.onOverlapHoop(function () { + freethrow.changeScoreAddPoint(1) + freethrow.destroyBall() +}) -scene.setBackgroundImage(throw_imgs.court) ``` ```package throw_imgs=github:kiki-lee/throw_imgs +arcade-block-icons=github:kiki-lee/arcade-block-icons#v0.0.13 +arcade-text=github:microsoft/arcade-text#v1.3.0 +``` + + + +```ghost +freethrow.onOverlapHoop(function () { + freethrow.changeScoreAddPoint(1) + freethrow.destroyBall() +}) +freethrow.onA(function () { + freethrow.throwBall() +}) +freethrow.setCourt() +freethrow.addPlayer(throw_imgs.dunk) +freethrow.addHoop() + ``` + + ```customts + namespace SpriteKind { //% isKind export const Goal = SpriteKind.create() } + info.onCountdownEnd(function () { game.gameOver(true) }) -``` -```ghost +//% color=#f84c08 +namespace freethrow { + + export let projectile: Sprite = null + export let athlete: Sprite = null + export let mostRecent: Sprite = null + export let scoreText = textsprite.create("", 15, 1) + scoreText.setFlag(SpriteFlag.RelativeToCamera, true) + + /** + * Run code when the play button is pressed + * (Like on start, but jr) + */ + //% color=#a62e08 + //% help=game/on-start-simple + //% weight=99 + //% afterOnStart=false + //% blockId=on_start_simple + //% block="on `ICON.play`" + //% blockAllowMultiple=0 + export function onStartSimple(a: () => void): void { + a(); + } + + + /** + * Play music in background + */ + //% blockId=play_music + //% block="`ICON.arrow-play-white` $thisSong" + //% thisSong.shadow=music_song_field_editor + //% help=github:docs/play_music + export function playSong(thisSong: music.Playable) { + music.play(thisSong, music.PlaybackMode.InBackground) + } + + /** + * Repeat music in background + */ + //% blockId=repeat_music + //% block="`ICON.arrow-repeat-white` $thisSong" + //% thisSong.shadow=music_song_field_editor + //% help=github:docs/repeat_music + export function repeatSong(thisSong: music.Playable) { + music.play(thisSong, music.PlaybackMode.LoopingInBackground) + } + + + /** + * Play soundeffect in background + */ + //% blockId=play_sef + //% block="`ICON.arrow-play-white` $thisSound" + //% thisSound.shadow=soundExpression_createSoundEffect + //% help=github:docs/play_sef + export function playSound(thisSound: music.Playable) { + music.play(thisSound, music.PlaybackMode.InBackground) + } + + + /** + * Set Court + */ + //% blockId=set_court + //% block="add `ICON.court`" + //% help=github:docs/set_court + export function setCourt() { + scene.setBackgroundImage(throw_imgs.court) + } + + + /** + * Player throw basketball + */ + //% blockId=throw_ball + //% block="throw `ICON.bball`" + //% help=github:docs/throw_ball + export function throwBall() { + freethrow.projectile = sprites.createProjectileFromSprite(throw_imgs.ball, freethrow.athlete, 0, -100) + } + + + + /** + * Make the turkey appear to jump + */ + //% blockId=destroy_ball + //% block="destroy `ICON.bball`" + //% help=github:docs/destroy_ball + export function destroyBall() { + sprites.destroy(mostRecent) + } + + + + /** + * Add the player and mechanics to the game + */ + //% blockId=add_player + //% block="โ›น๐Ÿป = $thisImg" + //% thisImg.shadow=screen_image_picker + //% help=github:docs/add_player + export function addPlayer(thisImg:Image) { + freethrow.athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) + freethrow.athlete.setPosition(76, 90) + freethrow.athlete.setVelocity(50, 0) + freethrow.athlete.setBounceOnWall(true) + } + + /** + * Add the hoop and mechanics to the game + */ + //% blockId=add_hoop + //% block="place `ICON.hoop`" + //% help=github:docs/add_hoop + export function addHoop() { + let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) + hoop.setPosition(80, 35) + } + + + /** + * Start the game timer + */ + //% blockId=game_countdown + //% block="`ICON.clock-white` $thisSec (s)" + //% thisSec.defl = 30 + //% help=github:docs/game_coundown + export function gameCountdown(thisSec:number) { + info.startCountdown(thisSec) + } + + + + /** + * Register code run when a controller event occurs + * @param event + * @param handler + */ + //% weight=99 blockGap=8 + //% blockId=ctrlonA block="on `ICON.a-button-white-invert`" + //% color=#a62e08 + //% help=docs/on-a + export function onA(handler: () => void) { + controller.A.onEvent(ControllerButtonEvent.Pressed, handler) + } + + + + /** + * Runs code when ball overlaps net + * @param event + * @param handler + */ + //% weight=99 blockGap=8 + //% blockId=on-overlap-hoop + //% block="`ICON.bball` `ICON.point-right-white` `ICON.hoop`" + //% color=#a62e08 + //% help=docs/on-overlap-hoop + export function onOverlapHoop(handler: () => void) { + if (!handler) return; + sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Goal, function (sprite, otherSprite) { + freethrow.mostRecent = sprite; + handler(); + }) + } + + + /** + * Overrides the normal score UI with an iconified version + */ + //% blockId=set_hoop_override + //% block="set `ICON.hoop` to $thisScore" + //% thisScore.defl=0 + //% help=github:docs/set_hoop_override + export function setScoreOverride(thisScore: number) { + info.setScore(thisScore) + freethrow.scoreText.setText(" x " + convertToText(info.score())) + scoreText.setIcon(img` +. . 3 4 4 4 4 3 . . +. 3 4 1 . . 1 4 4 . +3 4 . 1 . . . . 4 3 +4 3 1 1 1 1 . 1 4 4 +. 4 4 4 4 4 4 4 4 . +. 1 . 1 . . 1 . 1 . +. 1 . 1 . . 1 . 1 . +. 1 . . 1 1 . . 1 . +. 1 1 1 1 1 . 1 1 . +. 1 . 1 . . 1 . 1 . +`) + + scoreText.setBorder(1, 3, 1) + scoreText.setMaxFontHeight(9) + scoreText.right = 160 + scoreText.top = 1 + scoreText.update() + info.showScore(false) + } + + + /** + * Changes the score + */ + //% blockId=change_score_jr + //% block="`ICON.hoop` + $thisMuch" + //% thisMuch.defl=1 + //% help=github:docs/change_score_jr + export function changeScoreAddPoint(thisMuch:number) { + info.changeScoreBy(thisMuch) + freethrow.setScoreOverride(info.score()) + } - music.play(music.createSoundEffect(WaveShape.Sine, 5000, 0, 255, 0, 500, SoundExpressionEffect.None, InterpolationCurve.Linear), music.PlaybackMode.UntilDone) -controller.A.onEvent(ControllerButtonEvent.Pressed, function () { - projectile = sprites.createProjectileFromSprite(assets.image`ball`, athlete, 0, -100) -}) -sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Goal, function (sprite, otherSprite) { - info.changeScoreBy(1) - sprites.destroy(sprite) -}) -let projectile: Sprite = null -let athlete: Sprite = null -scene.setBackgroundImage(throw_imgs.court) -athlete = sprites.create(throw_imgs.dunk, SpriteKind.Player) -athlete.setPosition(80, 90) -athlete.setVelocity(50, 0) -athlete.setBounceOnWall(true) -let hoop = sprites.create(throw_imgs.hoop, SpriteKind.Goal) -hoop.setPosition(80, 35) -info.startCountdown(30) -info.onCountdownEnd(function () { - game.gameOver(true) -}) +} -game.setGameOverEffect(true, effects.confetti) -game.setGameOverMessage(true, "GAME OVER!") -game.setGameOverScoringType(game.ScoringType.HighScore) +freethrow.setScoreOverride(0) ``` + ```simtheme { "palette": [