미로 탈출
🎯 학습 목표:
- 타일맵(Tilemap)을 사용하여 복잡한 미로를 디자인합니다.
- 카메라(Camera)가 플레이어를 따라다니도록 설정합니다.
- 랜덤 위치(Place on Random Tile) 블록을 사용하여 시작점과 도착점을 지정합니다.
- 카운트다운(Countdown)을 추가하여 긴장감 있는 게임을 만듭니다.
미로 탐험가 만들기
미로를 탐험할 주인공을 만들어 봅시다.
||sprites:스프라이트||에서||variables(sprites):[mySprite]를 스프라이트 설정||블록을 가져옵니다.- 이미지 편집기에서 캐릭터를 그리고,
||controller:컨트롤러||의||controller:[mySprite]를 버튼으로 이동||블록을 연결합니다.
// @highlight
let mySprite: Sprite = sprites.create(img`
. . . . . . . . . . . . . . . .
. . . 2 2 2 2 2 2 2 2 . . . . .
. . 2 2 . . . . . . 2 . . . . .
. . 2 . 1 . . . 1 . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 . . . 1 . . . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 2 2 . . . . . 2 2 . . . .
. . . . 2 2 2 2 2 2 2 . . . . .
. . . . . . 2 . . . . . . . . .
. 2 2 2 . . 2 . . . . 2 . . . .
. . . 2 2 2 2 2 2 2 2 2 . . . .
. . . . . . 2 . . . . . . . . .
. . . . . . 2 . . . . . . . . .
. . . 2 2 2 . 2 . . . . . . . .
. . . 2 . . . . 2 2 . . . . . .
`, SpriteKind.Player)
// @highlight
controller.moveSprite(mySprite)
미로 건설하기 (타일맵)
복잡한 미로 맵을 불러옵니다.
► ||scene:장면||에서 ||scene:타일맵 설정|| 블록을 가져옵니다.
► 아래 코드는 미리 준비된 던전(Dungeon) 타일맵 데이터입니다. 벽(Wall)을 오른쪽처럼 직접 설정해야 캐릭터가 통과할 수 없습니다.
let mySprite: Sprite = sprites.create(img`
. . . . . . . . . . . . . . . .
. . . 2 2 2 2 2 2 2 2 . . . . .
. . 2 2 . . . . . . 2 . . . . .
. . 2 . 1 . . . 1 . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 . . . 1 . . . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 2 2 . . . . . 2 2 . . . .
. . . . 2 2 2 2 2 2 2 . . . . .
. . . . . . 2 . . . . . . . . .
. 2 2 2 . . 2 . . . . 2 . . . .
. . . 2 2 2 2 2 2 2 2 2 . . . .
. . . . . . 2 . . . . . . . . .
. . . . . . 2 . . . . . . . . .
. . . 2 2 2 . 2 . . . . . . . .
. . . 2 . . . . 2 2 . . . . . .
`, SpriteKind.Player)
controller.moveSprite(mySprite)
// @highlight
tiles.setTilemap(tilemap`level_0`)
카메라와 시작 위치
맵이 화면보다 크기 때문에 카메라 설정이 필요합니다.
► ||scene:장면||에서 ||scene:카메라가 [mySprite]를 따르게 하기|| 블록을 추가합니다.
► ||scene:장면||의 ||scene:[mySprite]를 타일 [ ] 위에 놓기|| 블록을 사용합니다.
► 타일 종류를 바닥 타일(floorDark2)로 선택하면, 플레이어가 랜덤한 바닥 위치에서 시작합니다.
// (이전 코드 전체 포함)
let mySprite: Sprite = sprites.create(img`
. . . . . . . . . . . . . . . .
. . . 2 2 2 2 2 2 2 2 . . . . .
. . 2 2 . . . . . . 2 . . . . .
. . 2 . 1 . . . 1 . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 . . . 1 . . . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 2 2 . . . . . 2 2 . . . .
. . . . 2 2 2 2 2 2 2 . . . . .
. . . . . . 2 . . . . . . . . .
. 2 2 2 . . 2 . . . . 2 . . . .
. . . 2 2 2 2 2 2 2 2 2 . . . .
. . . . . . 2 . . . . . . . . .
. . . . . . 2 . . . . . . . . .
. . . 2 2 2 . 2 . . . . . . . .
. . . 2 . . . . 2 2 . . . . . .
`, SpriteKind.Player)
controller.moveSprite(mySprite)
tiles.setTilemap(tilemap`level_1`)
// @highlight
scene.cameraFollowSprite(mySprite)
// @highlight
tiles.placeOnRandomTile(mySprite, sprites.dungeon.floorDark2)
보물상자 찾기 (목표 설정)
미로의 탈출구 역할을 할 보물상자를 만들어 봅시다.
► 새로운 스프라이트를 만들고 이미지를 보물상자(또는 문)로 그립니다.
► 변수 이름을 mySprite2(또는 goal)로 하고, 종류는 그대로 Player로 둡니다. (또는 새로운 종류를 만들어도 됩니다)
► ||scene:[mySprite2]를 타일 [ ] 위에 놓기|| 블록을 사용하여, 계단(stairLarge) 타일 위에 상자가 나타나도록 합니다.
// @highlight
let mySprite2 = sprites.create(img`
. . b b b b b b b b b b b . . .
. b e 4 4 4 4 4 4 4 4 4 4 e b .
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e e 4 4 4 4 4 4 4 4 4 4 e e b
b e e e e e e e e e e e e e e b
b e e e e e e e e e e e e e e b
b b b b b b b d d b b b b b b b
c b b b b b b c c b b b b b b c
c c c c c c b c c b c c c c c c
b e e e e e c b b c e e e e e b
b e e e e e e e e e e e e e e b
b c e e e e e e e e e e e e c b
b b b b b b b b b b b b b b b b
. b b . . . . . . . . . . b b .
`, SpriteKind.Player)
// @highlight
tiles.placeOnRandomTile(mySprite2, sprites.dungeon.stairLarge)
탈출 성공과 제한 시간
보물상자에 닿으면 승리하고, 시간이 다 되면 패배하게 만듭니다.
► ||sprites:[mySprite]가 [mySprite2]와 겹치면|| 블록을 사용하여, 닿았을 때 ||game:게임 종료 <승리>||가 되도록 합니다.
► ||info:카운트다운 시작 [30] (s)|| 블록을 추가하여 30초 안에 미로를 탈출해야 하는 규칙을 만듭니다.
let mySprite: Sprite = sprites.create(img`
. . . . . . . . . . . . . . . .
. . . 2 2 2 2 2 2 2 2 . . . . .
. . 2 2 . . . . . . 2 . . . . .
. . 2 . 1 . . . 1 . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 . . . 1 . . . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 2 2 . . . . . 2 2 . . . .
. . . . 2 2 2 2 2 2 2 . . . . .
. . . . . . 2 . . . . . . . . .
. 2 2 2 . . 2 . . . . 2 . . . .
. . . 2 2 2 2 2 2 2 2 2 . . . .
. . . . . . 2 . . . . . . . . .
. . . . . . 2 . . . . . . . . .
. . . 2 2 2 . 2 . . . . . . . .
. . . 2 . . . . 2 2 . . . . . .
`, SpriteKind.Player)
controller.moveSprite(mySprite)
tiles.setTilemap(tilemap`level_1`)
scene.cameraFollowSprite(mySprite)
tiles.placeOnRandomTile(mySprite, sprites.dungeon.floorDark2)
let mySprite2 = sprites.create(img`
. . b b b b b b b b b b b . . .
. b e 4 4 4 4 4 4 4 4 4 4 e b .
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e e 4 4 4 4 4 4 4 4 4 4 e e b
b e e e e e e e e e e e e e e b
b e e e e e e e e e e e e e e b
b b b b b b b d d b b b b b b b
c b b b b b b c c b b b b b b c
c c c c c c b c c b c c c c c c
b e e e e e c b b c e e e e e b
b e e e e e e e e e e e e e e b
b c e e e e e e e e e e e e c b
b b b b b b b b b b b b b b b b
. b b . . . . . . . . . . b b .
`, SpriteKind.Player)
tiles.placeOnRandomTile(mySprite2, sprites.dungeon.stairLarge)
// @highlight
info.startCountdown(30)
// @highlight
sprites.onOverlap(SpriteKind.Player, SpriteKind.Player, function (sprite, otherSprite) {
game.over(true)
})
완성!
축하합니다! 미로 탈출 게임을 완성했습니다.
제한 시간 내에 복잡한 미로를 뚫고 보물상자를 찾아보세요!
아래는 완성된 전체 블록 코드입니다.
sprites.onOverlap(SpriteKind.Player, SpriteKind.Player, function (sprite, otherSprite) {
game.over(true)
})
let mySprite: Sprite = sprites.create(img`
. . . . . . . . . . . . . . . .
. . . 2 2 2 2 2 2 2 2 . . . . .
. . 2 2 . . . . . . 2 . . . . .
. . 2 . 1 . . . 1 . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 . . . 1 . . . . 2 . . . .
. . 2 . . . . . . . . 2 . . . .
. . 2 2 2 . . . . . 2 2 . . . .
. . . . 2 2 2 2 2 2 2 . . . . .
. . . . . . 2 . . . . . . . . .
. 2 2 2 . . 2 . . . . 2 . . . .
. . . 2 2 2 2 2 2 2 2 2 . . . .
. . . . . . 2 . . . . . . . . .
. . . . . . 2 . . . . . . . . .
. . . 2 2 2 . 2 . . . . . . . .
. . . 2 . . . . 2 2 . . . . . .
`, SpriteKind.Player)
controller.moveSprite(mySprite)
tiles.setTilemap(tilemap`level_1`)
scene.cameraFollowSprite(mySprite)
tiles.placeOnRandomTile(mySprite, sprites.dungeon.floorDark2)
let mySprite2 = sprites.create(img`
. . b b b b b b b b b b b . . .
. b e 4 4 4 4 4 4 4 4 4 4 e b .
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e 4 4 4 4 4 4 4 4 4 4 4 4 e b
b e e 4 4 4 4 4 4 4 4 4 4 e e b
b e e e e e e e e e e e e e e b
b e e e e e e e e e e e e e e b
b b b b b b b d d b b b b b b b
c b b b b b b c c b b b b b b c
c c c c c c b c c b c c c c c c
b e e e e e c b b c e e e e e b
b e e e e e e e e e e e e e e b
b c e e e e e e e e e e e e c b
b b b b b b b b b b b b b b b b
. b b . . . . . . . . . . b b .
`, SpriteKind.Player)
tiles.placeOnRandomTile(mySprite2, sprites.dungeon.stairLarge)
info.startCountdown(30)