動作環境
Windows 10 Pro v21H1
Godot Engine v3.3.2.stable.official
41ゲームの説明
Godot実装
構成
TileMapにTileMap.gdをアッタッチする。
TileMapには下記の画像を使用する(64x64の画像を四つ)。
実際に使うのは二つ目と四ツ目だけではあるが。。。
実装 (TileMap.gd)
TileMap.gd
extends TileMap
enum {
CELL_TILE = 0, # タイル
CELL_BALL, # ボールが置かれている
CELL_NOT_USED, # 不使用
CELL_PICKED, # 配置できる
}
enum {
STS_DROP = 0, # ボールが置かれている
STS_PICKED, # ボールを持ちあげている
}
onready var s_state = STS_DROP
onready var label = get_node("../Label")
var s_picked
func _input(event):
if event is InputEventMouseButton:
if event.pressed == false:
return
if event.button_index != 1:
return
var mouse_tile = world_to_map(get_global_mouse_position())
var tile_id = get_cellv(mouse_tile)
print(tile_id)
if s_state == STS_DROP: # Pickup
# ボールが配置されたセルか
if tile_id != CELL_BALL:
return
set_cellv(mouse_tile, CELL_PICKED) # セル画像の変更 (Pickupした状態)
s_picked = mouse_tile # Drop時の処理に使う
# 状態とラベルの変更
s_state = STS_PICKED
label.text = "Picked"
pass
else: # Drop
# 配置できる(ボールがない)かどうか
if tile_id != CELL_PICKED:
return
# 飛び越すセル位置
var middle = (s_picked + mouse_tile) / 2
print(middle)
# 配置は縦方向か横方向のボールを飛び越すものだけ
var diff = s_picked.distance_to(middle)
print(diff)
if diff == 0:
set_cellv(mouse_tile, CELL_BALL)
s_state = STS_DROP
label.text = "Dropped"
if diff < 1 || diff > 1:
return
# 飛び越すところにボールがあるかどうか
var middle_ball = get_cellv(middle)
if middle_ball != CELL_BALL:
return
# セル画像の変更
set_cellv(mouse_tile, CELL_BALL)
set_cellv(middle, CELL_PICKED)
# 状態とラベルの変更
s_state = STS_DROP
label.text = "Dropped"
pass
実行例
- 青丸 : ボールが置かれている
- このいずれもがPickupできる
- 黒の円 : ボールを配置可能
左上のラベルは現在の操作の状況(PickedかDropped)。
Pickupしたボールを縦か横方向にボールをまたぐ方に移動できる。
Pickupした場所にDropもできる(操作のキャンセル)。
最後にボールが一つだけにできればゲームクリア。
配置
デザイン画面で配置を変更すれば、任意のパターンの41を遊べる。