Skip to content

Commit

Permalink
Updating second half of target lab
Browse files Browse the repository at this point in the history
  • Loading branch information
kiki-lee committed Feb 21, 2025
1 parent ee5ba83 commit ceb857b
Show file tree
Hide file tree
Showing 10 changed files with 568 additions and 349 deletions.
2 changes: 1 addition & 1 deletion docs/courses/csintro/blocks/unit-2/lab0201-part1.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ controller.A.onEvent(ControllerButtonEvent.Pressed, function () {
if (projectileCount < maxProjectiles) {
fireSprite = sprites.create(lab2imgs.flame, SpriteKind.Projectile)
fireSprite.setPosition(flamethrower.x, flamethrower.y)
fireSprite.setVelocity(0, -90)
fireSprite.setVelocity(0, -200)
fireSprite.setFlag(SpriteFlag.AutoDestroy, true)
projectileCount += 1
}
Expand Down
4 changes: 2 additions & 2 deletions docs/courses/csintro/blocks/unit-2/lab0201-part2.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ let fireSprite: Sprite = null
let flamethrower: Sprite = null
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
```

```ghost
Expand All @@ -125,8 +125,8 @@ let fireSprite: Sprite = null
let flamethrower: Sprite = null
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
game.onUpdateInterval(1000, function () {
iceSprite = sprites.create(lab2imgs.icecube, SpriteKind.Enemy)
iceSprite.setPosition(randint(8, 152), 0)
Expand Down
8 changes: 4 additions & 4 deletions docs/courses/csintro/blocks/unit-2/lab0201-part3.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ Test your project to see if your code runs as expected.
let flamethrower: Sprite = null
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
// @highlight
info.setScore(0)
// @highlight
Expand Down Expand Up @@ -120,8 +120,8 @@ let flamethrower: Sprite = null
scene.setBackgroundColor(11)
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
info.setScore(0)
info.setLife(3)
```
Expand Down Expand Up @@ -155,8 +155,8 @@ let fireSprite: Sprite = null
let flamethrower: Sprite = null
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
game.onUpdateInterval(1000, function () {
iceSprite = sprites.create(lab2imgs.icecube, SpriteKind.Enemy)
iceSprite.setPosition(randint(8, 152), 0)
Expand All @@ -182,8 +182,8 @@ let fireSprite: Sprite = null
let flamethrower: Sprite = null
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
info.setScore(0)
info.setLife(3)
game.onUpdateInterval(1000, function () {
Expand Down
20 changes: 13 additions & 7 deletions docs/courses/csintro/blocks/unit-2/lab0201-part4.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@

## Collision alert! @showdialog

When enemies hit your player, the player should lose a life. Let's finish
the game by adding one more event handler.
When enemies hit your player, the player should lose a life.<br/>
Let's finish the game by adding one more event handler.

![Lab 2.1.4](https://arcade.makecode.com/api/_0wWasDYJfW35/thumb)


## Ouch!

Expand All @@ -21,7 +24,7 @@ that removes one of the player's lives.
---

Test your project to see if your code runs as expected.
View the hint if you need help.


#### ~ tutorialhint

Expand All @@ -34,8 +37,10 @@ sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSp

## Complete! @showdialog

Good work! Your game is now complete! If you have time, then move on to the bonus
section, where we will add some sound effects!
Good work! Lab 2.1 is now complete!

If you have time, move on to the bonus
level, to add some sound effects!



Expand Down Expand Up @@ -64,8 +69,8 @@ let flamethrower: Sprite = null
scene.setBackgroundColor(11)
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
info.setScore(0)
info.setLife(3)
game.onUpdateInterval(1000, function () {
Expand Down Expand Up @@ -95,10 +100,11 @@ sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSp
let iceSprite: Sprite = null
let fireSprite: Sprite = null
let flamethrower: Sprite = null
scene.setBackgroundColor(11)
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
flamethrower.setStayInScreen(true)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
info.setScore(0)
info.setLife(3)
game.onUpdateInterval(1000, function () {
Expand Down
147 changes: 97 additions & 50 deletions docs/courses/csintro/blocks/unit-2/lab0201-part5.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,40 @@
# Lab 2.1 Part 5 (BONUS): Pew, Pew!
### @explicitHints true

## BONUS -- Pew pew! @showdialog
## BONUS Pew, Pew! @showdialog

Time to add some sound effects to your project!

![Lab 2.1.5](https://arcade.makecode.com/api/_ehvLLVLYx1iu/thumb)

## Pew pew!

Let's add a sound whenever a projectile is fired.
We'll use a new event handler for this.

---

1. From the ``||sprites:Sprites||`` drawer, add an
``||sprites:on created||`` ``||variables(sprites):sprite||``
``||sprites:of kind (Player)||``
``||sprites:on created [sprite] of kind [Player]||``
container to your workspace.
1. Change the block so that it reads as follows:
``||sprites(noclick):on created sprite of kind Projectile||``
1. Into your new container, drag a
``||music:play sound (ba ding) until done||``
``||music:play (sound ba ding) until done||``
block from the
``||music:Music||`` drawer.
1. Change the sound to **pew pew**.
1. Change the playback mode to **in background**.

This new event handler will run anytime a projectile is created in your project.

Test your project to see if your code runs as expected.
View the hint if you need help.
---

Test your project to see if your code runs as expected.
Feel free to try different sounds!

#### ~ tutorialhint

```block
sprites.onCreated(SpriteKind.Projectile, function (sprite) {
music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground)
Expand All @@ -40,60 +46,99 @@ sprites.onCreated(SpriteKind.Projectile, function (sprite) {
Now, let's add a sound whenever an enemy is destroyed.
We'll use yet another new event handler for this.

---

1. From the ``||sprites:Sprites||`` drawer, add an
``||sprites:on destroyed||`` ``||variables(sprites):sprite||``
``||sprites:of kind (Player)||``
``||sprites:on destroyed [sprite] of kind [Player]||``
container to your workspace.
1. Change the block so that it reads as follows:
``||sprites(noclick):on created sprite of kind Enemy||``
``||sprites(noclick):on destroyed sprite of kind Enemy||``
1. Into your new container, drag a
``||music:play sound (ba ding) until done||``
``||music:play (sound ba ding) until done||``
block from the
``||music:Music||`` drawer.
1. Change the sound to **small crash**.
1. Change the playback mode to **in background**.

This new event handler will run anytime an enemy is destroyed.

Test your project to see if your code runs as expected.
View the hint if you need help.
---


Test your project to see if your code runs as expected.
Feel free to try different sounds!

---

**Question**: Did you notice that the crash plays when an enemy flies off of the screen,
too? Why is that? How could you fix it?

~hint Answer
Instead of using the new "on destroyed" event handler, you could add the
sound blocks to the existing event handlers where the enemies are destroyed.

---

We have an instruction in our code telling the computer to auto-destroy Enemy sprites when they leave the screen.

To avoid hearing the crash in that instance, try moving the sound effect out of the <br/>
``||sprites(noclick):on destroyed sprite of kind Enemy||`` <br/>
container and into the overlap container where the destroying happens.

hint~

#### ~ tutorialhint

```block
sprites.onDestroyed(SpriteKind.Enemy, function (sprite) {
music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground)
})
```

or

```blocks
sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) {
info.changeScoreBy(1)
sprites.destroy(sprite)
sprites.destroy(otherSprite, effects.spray, 500)
//@highlight
music.play(music.melodyPlayable(music.smallCrash), music.PlaybackMode.InBackground)
})
```





## Complete! @showdialog

Good work! If you still have some time, then give these other bonuses a try!
Good work! If you still have time, give these other bonuses a try!

---


- Create your own images for each sprite
- Create a background image
- Let the player fire projectiles with the **B** button also, but use
this block instead:

```block
let projectile = sprites.createProjectileFromSprite(sprites.projectile.explosion1, heroSprite, 0, -50)
let projectile = sprites.createProjectileFromSprite(lab2imgs.flame, flamethrower, 0, -50)
```
How does this block work compared to the blocks that you used for the **A** button?
(How does this block work compared to the blocks that you used for the **A** button?)

- Create your own images for the sprites.
- Create a background image.



```package
lab2imgs=github:kiki-lee/lab2imgs
```

```template
controller.A.onEvent(ControllerButtonEvent.Pressed, function () {
plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile)
plasmaSprite.setPosition(heroSprite.x, heroSprite.y)
plasmaSprite.setVelocity(0, -50)
plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true)
fireSprite = sprites.create(lab2imgs.flame, SpriteKind.Projectile)
fireSprite.setPosition(flamethrower.x, flamethrower.y)
fireSprite.setVelocity(0, -200)
fireSprite.setFlag(SpriteFlag.AutoDestroy, true)
})
sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) {
info.changeScoreBy(1)
Expand All @@ -104,32 +149,33 @@ sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSp
info.changeLifeBy(-1)
sprites.destroy(otherSprite, effects.fire, 500)
})
let enemySprite: Sprite = null
let plasmaSprite: Sprite = null
let heroSprite: Sprite = null
heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player)
heroSprite.setPosition(80, 110)
heroSprite.setStayInScreen(true)
controller.moveSprite(heroSprite)
let iceSprite: Sprite = null
let fireSprite: Sprite = null
let flamethrower: Sprite = null
scene.setBackgroundColor(11)
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
info.setScore(0)
info.setLife(3)
game.onUpdateInterval(1000, function () {
enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy)
enemySprite.setPosition(randint(8, 152), 0)
enemySprite.setVelocity(0, 25)
enemySprite.setFlag(SpriteFlag.AutoDestroy, true)
iceSprite = sprites.create(lab2imgs.icecube, SpriteKind.Enemy)
iceSprite.setPosition(randint(8, 152), 0)
iceSprite.setVelocity(0, 25)
iceSprite.setFlag(SpriteFlag.AutoDestroy, true)
})
```

```ghost
controller.A.onEvent(ControllerButtonEvent.Pressed, function () {
plasmaSprite = sprites.create(sprites.projectile.explosion1, SpriteKind.Projectile)
plasmaSprite.setPosition(heroSprite.x, heroSprite.y)
plasmaSprite.setVelocity(0, -50)
plasmaSprite.setFlag(SpriteFlag.AutoDestroy, true)
fireSprite = sprites.create(lab2imgs.flame, SpriteKind.Projectile)
fireSprite.setPosition(flamethrower.x, flamethrower.y)
fireSprite.setVelocity(0, -200)
fireSprite.setFlag(SpriteFlag.AutoDestroy, true)
})
controller.B.onEvent(ControllerButtonEvent.Pressed, function () {
projectile = sprites.createProjectileFromSprite(sprites.projectile.explosion1, heroSprite, 0, -50)
projectile = sprites.createProjectileFromSprite(lab2imgs.flame, flamethrower, 0, -50)
})
sprites.onCreated(SpriteKind.Projectile, function (sprite) {
music.play(music.melodyPlayable(music.pewPew), music.PlaybackMode.InBackground)
Expand All @@ -146,20 +192,21 @@ sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSp
info.changeLifeBy(-1)
sprites.destroy(otherSprite, effects.fire, 500)
})
let enemySprite: Sprite = null
let plasmaSprite: Sprite = null
let heroSprite: Sprite = null
let iceSprite: Sprite = null
let fireSprite: Sprite = null
let flamethrower: Sprite = null
let projectile: Sprite = null
heroSprite = sprites.create(sprites.space.spaceOrangeShip, SpriteKind.Player)
heroSprite.setPosition(80, 110)
heroSprite.setStayInScreen(true)
controller.moveSprite(heroSprite)
scene.setBackgroundColor(11)
flamethrower = sprites.create(lab2imgs.flamethrower, SpriteKind.Player)
flamethrower.setPosition(80, 110)
controller.moveSprite(flamethrower)
flamethrower.setStayInScreen(true)
info.setScore(0)
info.setLife(3)
game.onUpdateInterval(1000, function () {
enemySprite = sprites.create(sprites.space.spaceAsteroid0, SpriteKind.Enemy)
enemySprite.setPosition(randint(8, 152), 0)
enemySprite.setVelocity(0, 25)
enemySprite.setFlag(SpriteFlag.AutoDestroy, true)
iceSprite = sprites.create(lab2imgs.icecube, SpriteKind.Enemy)
iceSprite.setPosition(randint(8, 152), 0)
iceSprite.setVelocity(0, 25)
iceSprite.setFlag(SpriteFlag.AutoDestroy, true)
})
```
Loading

0 comments on commit ceb857b

Please sign in to comment.