5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Axmol Engine】 バイブコーディングで脱出ゲームを作る[ 1 ]:スプラッシュ画面シーンを実装する

5
Last updated at Posted at 2026-06-19

はじめに

こちらの記事は、Axmol Engine なるものを使ってバイブコーディングでどこまでできるかを、検証と勉学を兼ねた試験的な目論見となります!

Cocos2d-xの後継である Axmol Engine(C++)製のプロジェクトで脱出ゲーム(のようなもの)を作成するという試みです。
半バイブコーディングとして実装を進めつつ、バイブフィクシングで目視での確認・手動の修正を絡めていきます。

  • プロンプトでやりたいことを命令
  • エラーが出たら、プロンプトにエラーを貼り付ける
  • レビューして、調整(プロンプトで命令 or 手動)

という流れが良いかと思います。

成果物

スクリーンショット 2026-06-19 19.38.55.png

環境・前提

  • フレームワーク: Axmol Engine (C++)
  • 起動シーン: AppDelegate.cpp 内で utils::createInstance<MainScene>() を直接生成
  • ソース収集: CMakeLists.txtfile(GLOB_RECURSE)Source/ 以下を自動収集

実装の流れ

みなさん大好きなスプラッシュ画面から作成していきます。

プロンプト:「スプラッシュ画面のシーンを作成してほしい」

Claude:
まずプロジェクト構造を調査し、上記の構成を確認しました。それを踏まえて SplashScene.h / SplashScene.cpp を新規作成し、AppDelegate.cpp の起動シーンを SplashScene に変更しています。

ここから実装を進める中で、4つのビルドエラーに遭遇しました。

つまずいたポイント

エラー1: Undefined symbol: vtable for SplashScene

プロンプト:「Undefined symbol: vtable for SplashScene」

Claude:
リンカが SplashScene の vtable を見つけられずに発生するエラーです。

原因

CMakeLists.txtfile(GLOB_RECURSE) は、ファイルリストを CMake実行時にしか更新しない という性質があります。新規 .cpp ファイルを追加した後にビルドだけを実行しても、SplashScene.cpp がリンク対象に含まれず、結果として vtable が未定義になってしまいます。

解決方法

ビルドディレクトリでCMakeを再実行することで解決しました。

cd build_ios_arm64_sim
cmake ..

file(GLOB_RECURSE) を使うプロジェクトでは、ファイルを追加するたびに cmake .. の再実行が必要になる点に注意が必要です。

エラー2: Use of undeclared identifier 'Color4B'

プロンプト:「Use of undeclared identifier 'Color4B'」

Claude:

LayerColor::createsetTextColor に渡していた Color4B が未定義というエラーです。

原因

Color4B はCocos2d-x由来の型ですが、Axmolでは廃止されています。

解決方法

まずは Color に置き換えました。

エラー3: No viable conversion from 'Color' to 'const Color32'

プロンプト:「No viable conversion from 'Color' to 'const Color32'」

Claude:

setTextColor が要求する型は Color32 であり、Color(floatベース)とは別物でした。

原因と対応

Axmolにおける色型の対応は以下の通りです。

値域 旧Cocos2d-xでの対応
ax::Color 0.0f〜1.0f Color4F
ax::Color32 0〜255 Color4B

Color(Color32( に一括置換することで解決しました。

エラー4: No member named 'setTextColor32'

プロンプト:「No member named 'setTextColor32'」

Claude:

エラー3の修正で行った Color(Color32( の一括置換が、setTextColor( の末尾にある Color( まで巻き込んでしまい、setTextColor32( という存在しないメソッド名に書き換わってしまいました。

解決方法

setTextColor32(setTextColor( に戻して解決しました。

短いパターンでの一括置換は、意図しない箇所(メソッド名の一部など)まで書き換えてしまうことがあるため注意が必要です。

レビュー

出来上がったのがこちら

スクリーンショット 2026-06-19 19.16.57.png

[Tap to Start]といテキストと、実際にタップした際の遷移も処理に含まれていました。
こちら想定と異なったので、単純にスプラッシュを表示させるように修正しました。

プロンプト:「サブテキストと、タッチでスキップと、キーでスキップは不要です」

Claude:

  • "Tap to Start" ラベルとそのアニメーション
  • EventListenerTouchAllAtOnce によるタッチスキップ
  • EventListenerKeyboard によるキースキップ
    以上を削除し、コードをシンプルにした。タイトルラベルの位置も画面中央に調整。

スクリーンショット 2026-06-19 19.38.55.png

この後、一秒後に、自動的にMainSceneへフェイドアウトしながら遷移します。

実装内容

ファイル構成

Source/
├── AppDelegate.cpp  ← 起動シーンを SplashScene に変更
├── SplashScene.h    ← 新規作成
├── SplashScene.cpp  ← 新規作成 スプラッシュを表示するシーン
├── MainScene.h
└── MainScene.cpp    ← Hello World 表示シーン

SplashScene.h

#pragma once

#include "axmol/axmol.h"

class SplashScene : public ax::Scene
{
public:
    bool init() override;

private:
    void goToMain();

    bool _transitioning = false;
};

SplashScene.cpp

#include "SplashScene.h"
#include "MainScene.h"

using namespace ax;

bool SplashScene::init()
{
    if (!Scene::init())
        return false;

    auto visibleSize = _director->getVisibleSize();
    auto origin      = _director->getVisibleOrigin();
    Vec2 center      = origin + Vec2(visibleSize.width / 2, visibleSize.height / 2);

    // 黒背景
    auto bg = LayerColor::create(Color32(0, 0, 0, 255));
    addChild(bg, 0);

    // タイトルラベル
    auto title = Label::createWithTTF("Escape Game", "fonts/Marker Felt.ttf", 72);
    if (title)
    {
        title->setPosition(center);
        title->setTextColor(Color32(255, 220, 80, 255));
        title->setOpacity(0);
        addChild(title, 1);

        auto titleSeq = Sequence::create(
            FadeIn::create(1.5f),
            DelayTime::create(1.5f),
            FadeOut::create(1.0f),
            CallFunc::create([this] { goToMain(); }),
            nullptr);
        title->runAction(titleSeq);
    }

    return true;
}

void SplashScene::goToMain()
{
    if (_transitioning)
        return;
    _transitioning = true;

    auto mainScene = utils::createInstance<MainScene>();
    _director->replaceScene(TransitionFade::create(0.5f, mainScene));
}

AppDelegate.cpp の変更箇所

// 変更前
#include "MainScene.h"
auto scene = utils::createInstance<MainScene>();

// 変更後
#include "SplashScene.h"
#include "MainScene.h"
auto scene = utils::createInstance<SplashScene>();

まとめ

  • file(GLOB_RECURSE) を使うプロジェクトでは、ファイル追加後に必ず cmake .. を再実行する
  • Axmolで0〜255のRGBAカラーを使う場合は Color32、0.0〜1.0のfloatカラーは Color を使う
  • 短いパターンの一括置換は、メソッド名などを意図せず壊すことがあるため注意する

同じハマりどころで詰まっている方の参考になれば幸いです。

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?