LoginSignup
1
4

More than 1 year has passed since last update.

2021-09-12 Godot Engine > ボードゲーム 41ゲームの実装 > TileMapのセルの練習 (world_to_map(), get_cellv(), set_cellv()など)

Last updated at Posted at 2021-09-12

動作環境

Windows 10 Pro v21H1
Godot Engine v3.3.2.stable.official

41ゲームの説明

Godot実装

構成

image.png

TileMapにTileMap.gdをアッタッチする。

TileMapには下記の画像を使用する(64x64の画像を四つ)。
実際に使うのは二つ目と四ツ目だけではあるが。。。

fortyOne_210909.png

実装 (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

実行例

image.png

  • 青丸 : ボールが置かれている
    • このいずれもがPickupできる
  • 黒の円 : ボールを配置可能

左上のラベルは現在の操作の状況(PickedかDropped)。

Pickupしたボールを縦か横方向にボールをまたぐ方に移動できる。
Pickupした場所にDropもできる(操作のキャンセル)。

最後にボールが一つだけにできればゲームクリア。

配置

デザイン画面で配置を変更すれば、任意のパターンの41を遊べる。

画像を変えてみた

参考: 【Level2】ボタンをドット絵で色々な形にする方法【ドット絵講座】

fortyOne_210909.png

image.png

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4