Godotのプロジェクト「OpenRTS」の中身をのぞいてみよう

作成日
更新日

Godot v4 で作られたリアルタイムストラテジーゲームのオープンソース。

lampe-games/godot-open-rts

情報

  • Godot v4.3

ディレクトリ構造

tree -L 3 の結果。

.
├── CHANGELOG.md
├── LICENSE
├── LOGO_LICENSES.md
├── README.md
├── assets
│   ├── logos
│   │   ├── LOGO_LICENSES.md
│   │   ├── godot_logo_vertical_monochrome_dark_312x357.png
│   │   ├── godot_logo_vertical_monochrome_dark_312x357.png.import
│   │   ├── lampe_games_white.svg
│   │   └── lampe_games_white.svg.import
│   ├── models
│   │   ├── kenney-spacekit
│   │   └── primitives
│   ├── translations
│   │   ├── main_menu.csv
│   │   ├── main_menu.csv.import
│   │   ├── match.csv
│   │   └── match.csv.import
│   ├── ui
│   │   ├── background.png
│   │   ├── background.png.import
│   │   ├── icons
│   │   └── kenney-crosshairs
│   └── voice
│       └── english
├── build
├── export_presets.cfg
├── icon.svg
├── icon.svg.import
├── makefile
├── media
│   ├── banner_1400x650.png
│   ├── logo.kra
│   ├── logo_650x150.png
│   └── screenshots
│       ├── screenshot_1400x650.png
│       ├── screenshot_2_1920x1080.png
│       ├── screenshot_3_1920x1080.png
│       └── screenshot_4_1920x1080.png
├── project.godot
├── source
│   ├── Constants.gd
│   ├── FeatureFlags.gd
│   ├── FeatureFlags.tscn
│   ├── Globals.gd
│   ├── Logos.gd
│   ├── Logos.tscn
│   ├── Main.gd
│   ├── Main.tscn
│   ├── Signals.gd
│   ├── Utils.gd
│   ├── data-model
│   │   ├── MatchSettings.gd
│   │   ├── Options.gd
│   │   └── PlayerSettings.gd
│   ├── generic-scenes-and-nodes
│   │   ├── 2d
│   │   ├── 3d
│   │   └── control
│   ├── main-menu
│   │   ├── Background.tscn
│   │   ├── Credits.gd
│   │   ├── Credits.tscn
│   │   ├── Loading.gd
│   │   ├── Loading.tscn
│   │   ├── Main.gd
│   │   ├── Main.tscn
│   │   ├── Options.gd
│   │   ├── Options.tscn
│   │   ├── Play.gd
│   │   └── Play.tscn
│   ├── match
│   │   ├── AirNavigation.gd
│   │   ├── FogOfWar.gd
│   │   ├── IsometricCamera3D.gd
│   │   ├── Map.gd
│   │   ├── Map.tscn
│   │   ├── Match.gd
│   │   ├── Match.tscn
│   │   ├── MatchConstants.gd
│   │   ├── MatchSignals.gd
│   │   ├── MatchUtils.gd
│   │   ├── Menu.gd
│   │   ├── Menu.tscn
│   │   ├── Navigation.gd
│   │   ├── Terrain.gd
│   │   ├── TerrainNavigation.gd
│   │   ├── debug
│   │   ├── decorations
│   │   ├── handlers
│   │   ├── hud
│   │   ├── maps
│   │   ├── players
│   │   ├── resources
│   │   ├── units
│   │   └── utils
│   ├── resources
│   │   └── main_menu.theme
│   ├── shaders
│   │   ├── 2d
│   │   └── 3d
│   └── utils
│       ├── IconOverview.tscn
│       ├── IconRenderBooth.gd
│       ├── IconRenderBooth.tscn
│       └── Set.gd
└── tests
    └── manual
        ├── Match.gd
        ├── TestAllUnits.tscn
        ├── TestNonQuadraticMap.tscn
        ├── TestOneUnit.tscn
        ├── TestPlayerVsAI.tscn
        ├── TestUnitsFightingEachOther.tscn
        └── maps

動かしてみる

v4.4 で動かしてみる。

Main.tscn ではロゴを表示してメニュー画面に移動している。

@onready var _logos = find_child("Logos")

func _ready():
    _logos.tree_exited.connect(
        get_tree().change_scene_to_file.bind("res://source/main-menu/Main.tscn")
    )

ロゴを表示した後にメニュー画面が開く

Godotのプロジェクト「OpenRTS」の中身をのぞいてみよう-1744707716055

どうやって遷移した? -> get_tree().change_scene_to_file.bind("res://source/main-menu/Main.tscn") でちがう Main.tscn を開いているのか。

Logos.gd を見てみる。

extends Control

@onready var _animation_player = find_child("AnimationPlayer")


func _ready():
    if not FeatureFlags.show_logos_on_startup:
        queue_free()
        return
    _animation_player.animation_finished.connect(func(_animation_name): queue_free())
    _animation_player.play("animate_logos")

気になったこと

  • プロジェクトのGodotバージョンはどこ見ればわかる?
    • project.godot の冒頭のコメントに書いてあることが多い
      • が、これには書いていない。
    • project.godot 内の config/features=PackedStringArray("4.4", "Forward Plus") が 4.4 で保存されたことを示唆している
  • このプロジェクトは全画面で起動する
    • res://source/data-model/Options.gd に書いてある
  • 画面ごとに Main.tscn がそれぞれ生えている。
    • Options.gd も。
  • Godotでの画面遷移の仕方を調査する

Options.gd

func _apply_screen():
    DisplayServer.window_set_mode(
        (
            DisplayServer.WINDOW_MODE_FULLSCREEN
            if screen == Screen.FULL
            else DisplayServer.WINDOW_MODE_WINDOWED
        )
    )
サイトアイコン
公開日
更新日