Touching Color ()? | |
<touching color [#d15fee]?> | |
Category | Sensing |
Type | Boolean |
Introduced in | 22Dec04 (0.x) |
The Touching Color ()? block is a Sensing block and a Boolean block. The block checks whether its sprite is touching a specified color. If it is, the block returns true.
This block is widely used for collision detecting. Platformers often use this block.[1]
Caveats
The Touching Color ()? block can produce unexpected/unwanted results.
Built-in Limitation
Significantly, the Touching Color ()? block does not always return false if its sprite is not touching the specified color. This is because color sensing in Scratch has a built-in limitation. Whilst the stage can display more than 16 million colors, Scratch's sensing blocks only differentiate a much smaller number of colors.[2] This means that the Touching Color ()? block will often return a false positive when sensing a color which is different from (but similar to) the specified one.[3] Many Scratchers may never notice this phenomenon, but those wanting absolute precision in color detection should bear the Scratch limitation in mind.
Anti-Aliasing
Some graphics, even if they appear to have crisp edges in the Scratch Paint Editor, are subject to anti-aliasing when on the stage. This means that, when selecting color by clicking, care must be taken not to select a translucent edge pixel by mistake.
Performance
Scratchers considering using the Touching Color ()? block should be aware that it is slower than the Touching ()? block.[4]
Example Uses
- Moving a sprite until it touches a color.
repeat until <touching color [#000000]?> move (10) steps end
- Making a sprite do something if it touches a color, e.g., if the sprite touches blue (water), it reacts in a specific way.
if <touching color [#0000ff]?> then say [I found water!] for (2) seconds end
- Stopping bullets if they hit walls of a specific color.
repeat until <touching color [#cf4141] ?> move (10) steps end delete this clone
- Sensing whether a sprite has hit a dead-end in a maze.
forever if < not<touching color [#007f00]?>> then move (2) steps end end
- Preventing a sprite from passing through walls.
forever if <touching color [#ffff7f]?> then set [x velocity v] to (0) end end
- Making a game end when a color is touched.
forever if <touching color [#01efff]?> then say [Game over.] for (1) seconds broadcast (game over v) end end