はじめに
こちらの記事は、Axmol Engine なるものを使ってバイブコーディングでどこまでできるかを、検証と勉学を兼ねた試験的な目論見となります!
Cocos2d-xの後継である Axmol Engine(C++)製のプロジェクトで脱出ゲーム(のようなもの)を作成するという試みです。
半バイブコーディングとして実装を進めつつ、バイブフィクシングで目視での確認・手動の修正を絡めていきます。
- プロンプトでやりたいことを命令
- エラーが出たら、プロンプトにエラーを貼り付ける
- レビューして、調整(プロンプトで命令 or 手動)
という流れが良いかと思います。
成果物
環境・前提
- フレームワーク: Axmol Engine (C++)
- 起動シーン:
AppDelegate.cpp内でutils::createInstance<MainScene>()を直接生成 - ソース収集:
CMakeLists.txtがfile(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.txt の file(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::create や setTextColor に渡していた 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( に戻して解決しました。
短いパターンでの一括置換は、意図しない箇所(メソッド名の一部など)まで書き換えてしまうことがあるため注意が必要です。
レビュー
出来上がったのがこちら
[Tap to Start]といテキストと、実際にタップした際の遷移も処理に含まれていました。
こちら想定と異なったので、単純にスプラッシュを表示させるように修正しました。
プロンプト:「サブテキストと、タッチでスキップと、キーでスキップは不要です」
Claude:
- "Tap to Start" ラベルとそのアニメーション
- EventListenerTouchAllAtOnce によるタッチスキップ
- EventListenerKeyboard によるキースキップ
以上を削除し、コードをシンプルにした。タイトルラベルの位置も画面中央に調整。
この後、一秒後に、自動的に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を使う - 短いパターンの一括置換は、メソッド名などを意図せず壊すことがあるため注意する
同じハマりどころで詰まっている方の参考になれば幸いです。


