Fire a projectile with the A button. It is its own kind, so a hit is an overlap of Projectile and Enemy.
Space Invaders, Galaga and every 'shoot 'em up' since: you fire, and the game has to notice when a shot hits.
A projectile (in Sprites) is a sprite fired from another sprite, with its own speed: projectile from ship with vx 0, vy -100 goes straight up. It is its own kind: Projectile, not part of the ship. The engine removes it when it leaves the screen.
Make your prediction first. Help opens once you've locked it in.

scene.setBackgroundColor(15)
let ship = sprites.create(img`
. . 9 . .
. 9 9 9 .
9 9 1 9 9
9 . . . 9
`, SpriteKind.Player)
ship.setPosition(80, 110)
controller.moveSprite(ship, 100, 0)
let alien = sprites.create(img`
. 7 . 7 .
7 7 7 7 7
7 f 7 f 7
. 7 . 7 .
`, SpriteKind.Enemy)
alien.setPosition(80, 20)
controller.A.onEvent(ControllerButtonEvent.Pressed, function () {
let shot = sprites.createProjectileFromSprite(img`
5
5
`, ship, 0, -100)
})
sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) {
sprite.destroy()
otherSprite.destroy()
info.changeScoreBy(1)
})
The overlap event names two kinds: Projectile and Enemy.
Press the A button (space on the keyboard). Then move the ship to one side and fire again: where does the shot go?

scene.setBackgroundColor(15)
let ship = sprites.create(img`
. . 9 . .
. 9 9 9 .
9 9 1 9 9
9 . . . 9
`, SpriteKind.Player)
ship.setPosition(80, 110)
controller.moveSprite(ship, 100, 0)
let alien = sprites.create(img`
. 7 . 7 .
7 7 7 7 7
7 f 7 f 7
. 7 . 7 .
`, SpriteKind.Enemy)
alien.setPosition(80, 20)
controller.A.onEvent(ControllerButtonEvent.Pressed, function () {
let shot = sprites.createProjectileFromSprite(img`
5
5
`, ship, 0, -100)
})
sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) {
sprite.destroy()
otherSprite.destroy()
info.changeScoreBy(1)
})

scene.setBackgroundColor(15)
let ship = sprites.create(img`
. . 9 . .
. 9 9 9 .
9 9 1 9 9
9 . . . 9
`, SpriteKind.Player)
ship.setPosition(80, 110)
controller.moveSprite(ship, 100, 0)
controller.A.onEvent(ControllerButtonEvent.Pressed, function () {
let shot = sprites.createProjectileFromSprite(img`
5
5
`, ship, 0, -100)
})
game.onUpdateInterval(1000, function () {
let alien = sprites.create(img`
. 7 . 7 .
7 7 7 7 7
7 f 7 f 7
. 7 . 7 .
`, SpriteKind.Enemy)
alien.setPosition(randint(10, 150), 0)
alien.vy = 20
})
sprites.onOverlap(SpriteKind.Projectile, SpriteKind.Enemy, function (sprite, otherSprite) {
sprite.destroy()
otherSprite.destroy()
info.changeScoreBy(1)
})
Play the game, then match each part with its job.
Ben's hit event:

sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) {
sprite.destroy()
otherSprite.destroy()
info.changeScoreBy(1)
})
Match each part of this game with what it does.
The shots in this game pass through everything. Add the overlap that turns a shot into a hit.
on overlap is in Sprites › Overlaps. Choose the kinds Projectile and Enemy.
Inside: destroy sprite, destroy otherSprite, change score by 1.
Now the aliens can reach the ship without anything happening. Make a crash cost a life.
Add a second on overlap, with the kinds Player and Enemy.
Destroy the alien (otherSprite), and change life by -1.
Make the shots work: a shot that hits an alien destroys both and scores a point.
This ticks by itself when your blocks do what is asked.
When an alien crashes into the ship, the alien is destroyed and you lose a life.
This ticks by itself when your blocks do what is asked.

let mouse = sprites.create(img`
. . . . d d
. d d d d f
d d d d d d
. d . d . .
`, SpriteKind.Player)
mouse.setPosition(40, 60)
let cat = sprites.create(img`
f . . f .
f f f f .
f 5 f 5 f
f f f f f
. f . f .
`, SpriteKind.Enemy)
cat.setPosition(100, 60)
game.onUpdate(function () {
if (cat.x < mouse.x) {
cat.vx = 40
} else {
cat.vx = -40
}
})
The aliens fall already. Make it a shooter:
on A button pressed (Controller): projectile from ship with vx 0 and vy -100 (Sprites).
on overlap (Sprites › Overlaps) with the kinds Projectile and Enemy. Inside: destroy sprite, destroy otherSprite, change score by 1.
A shooter: A fires a shot up from the ship, and a shot that hits an alien destroys both and scores.
This ticks by itself when your blocks do what is asked.
A launches a rocket into the night sky. Make the rockets launch faster, then make B launch a rocket that goes up at a slant.
Students fire projectiles with A and find that a projectile is its own kind, so a hit needs a Projectile–Enemy overlap. About 40 minutes.
Open the teacher guide: answers, solutions, slides and a worksheet.
A projectile is a sprite fired from another sprite, with a speed across (vx) and down (vy); vy -100 goes straight up. It is a sprite of its own kind, Projectile, not part of the ship, and the engine removes it when it leaves the screen. So a hit needs an overlap event between Projectile and Enemy. Students often pick Player, because "the player shoots": that is the planted misconception (Ben's shots pass straight through). In an overlap event, sprite is the sprite of the first kind (the shot) and otherSprite the second (the alien). The keyboard: A is space (or Z), B is enter (or X).
The overlap must name Projectile. Ask which two kinds touch when a shot hits.
Stretch: Make B fire two shots at a slant, one left and one right.
Support: Give students the on A pressed block with the projectile in it, and ask them only to build the hit event.
Next lesson: read a whole game and find the blocks for each job, before the final challenge. Class idea: a two-way shooter (shots left and right with a second button).