RPGメーカーギルド? にゃんだそれは―皆のci-enまとめvol224

ci-enの制作話,R18

2012年からDL同人エロゲの感想アフィを続けて来た私(111)ですが、昨今のこの業界は百花繚乱、ますます円熟の道を歩みつつある様に感じられる。
万DLを叩き出すいわゆるトップクリエイター、遊ぶ専門のユーザー、あるいはその狭間にぶらぶらと位置する層。

そこで色んなクリエイターのci-enや制作に役立つ情報を横断し、今の位置を跳び越えよう、それが新しい裾野になるし、もしかしたら一攫千金のチャンスもあるかも? という企画なのだ

今のところ購読してる私のci-en一覧

クリエイターズ申請(1000ptもらえる)目当てにDLチャンネルに投稿したので、審査が降りたらここにリンクを貼る:

最近やってること

25年も愛しまった、このヒップホップって奴をな。
と25 to lifeで歌ったのはエミネムですが、生成AIもそれだけになったら、本物で御座いましょうな。
ご機嫌いかかでしょうか、歌丸でございます(嘘)

という事で、生成AIのコードに救われた気になる……、という話でもするか。
以前から書いてる通り、AI絵のゲームを作っていて、まー大したものじゃない、言わばスライドパズルみたいな感じのモノで、でも自分の納得が優先だ……と書いたのは、DLチャンネルの記事の通りなんだけど。

で、スライドパズルにしてもまぁ10面くらいステージが無きゃって話になる訳で、そうするとステージデータを取り扱いやすい形で持ちましょう、って事になるわな。

でゲームのギミックとして、座標(左から2枚目、上から1枚目で(1,0)とか)に応じ、例えばメッセージが出る、絵が変わる、みたいな事をやりたくて、でこういうイベントトリガーってのをデータ的にどう持つのか? 悩みが出て来る。

いつもこの辺りで悩んで、あとJavaScriptだもんで、いわゆるthisの権限移譲がややこしい事になり、俺が書いたコードが

const stages = [
    (function(){
        let self;
        self = {
            cols: 1,
            rows: 3,
            startX: 0, // 初期X座標
            startY: 0, // 初期Y座標
            data: [
                {url: "girl_1_0-0.png" }, {url: "girl_1_0-1.png" }, {url: "girl_1_0-2.png" },
            ] ,
            changeImg : function(){
                const moto = self.data[0].url;
                const ele = document.querySelector(`img[src='${moto}']`);
                ele.setAttribute("src", "00006-3121109092.png");
            } , 
            pathTo : [
                [0 , 1 , "self.changeImg()"]
            ] ,
            moveTrigger : function(x , y){ // これはその度ごとのstageに関係づけた後、オブジェクトメソッドの大域でもいい気がする
                this.pathTo.forEach((p)=>{
                    if(p[0] == x && p[1] == y){
                        eval(p[2]);
                        p[2] = function(){}
                    }
                });
            }
        }
        return self;
    }()) ,

こうですよ。
ひぇっ無名関数に、eval! まぁこの辺りはObject.create()とか.call()とか……オブジェクトとthisを綺麗に解決する方法が幾つかあったよーな気もしてるが、もう忘れた。だいぶ俺のJavaScript能力も衰えた……
…だが根本はそうじゃなく、いつもこういう外部データ的に持つ時に、こういう事をしてしまっている気がする。

要は、各ステージのデータにこういうイベントハンドラ系を持つのは(感覚的に)正しくない!
でも、どうすれば良いか分かんない……

そうだ、Gemini先生に聞いてみよう!↓

const stages = [
    {
        cols: 1,
        rows: 3,
        startX: 0, // 初期X座標
        startY: 0, // 初期Y座標
        data: [
            {url: "girl_1_0-0.png" }, {url: "girl_1_0-1.png" }, {url: "girl_1_0-2.png" },
        ] ,
        events: [
            { x: 0, y: 1, action: "CHANGE_IMG", c_x : 0 , c_y : 0 ,params: { nextSrc: "00006-3121109092.png" } }
        ] 
    }
];

class StageManager {
    constructor(data) {
        this.data = data;
        this.triggeredEvents = new Set(); // 実行済みフラグの管理
    }

    // 特定の座標に移動した時に呼ばれる
    moveTrigger(x, y) {
        const event = this.data.events.find(e => e.x === x && e.y === y);
        
        if (event && !this.triggeredEvents.has(event)) {
            const img_index = event.c_x + (event.c_y * this.data.cols)
            const items = document.querySelectorAll('div.grid-item');
            items[img_index].querySelector('img').classList.add('target-image');
            //
            this.executeAction(event.action, event.params);
            this.triggeredEvents.add(event); // 一度だけ実行
        }
    }

    // アクションの実行(evalを使わず、関数マップやswitchで管理)
    executeAction(actionType, params) {
        switch (actionType) {
            case "CHANGE_IMG":
                this.updateImage(params.nextSrc);
                break;
            default:
                console.warn("未定義のアクション:", actionType);
        }
    }

    updateImage(src) {
        // DOM操作はここに集約する
        const img = document.querySelector(".target-image");
        if (img){
            img.src = src;
            img.classList.remove('target-image');
        }
    }
}

相談しながら書いたのがこのコード。
正しい。正しさの理由も幾つか並べて説明してくれたが(ロジハラや)
まぁ自分も言葉だけは知っていて、まったく腑に落とせてなかった『疎結合』、その姿がここにはあったのである。

あ、なるほどね。なるほど。そうかあ……class文法…ってそういえば最近出て来たんだっけ(*全然最近ではない)

思えばこの手の、「この形が間違ってるのは分かるが、どうしていいか分からない」・「どうしていいか分からない以上、この形を押し進めるしかない」でずっとやり、そのまま随分凝り固まって動脈硬化を起こしちゃうよーな頑迷さが自分にはあって、
だから生成AIどころか「自分の人生そのもの」がその辺り25 to lifeだったってオチだが、
今ここでGeminiに聞いたら数分で視界が開けたのだ、という。

これはプログラムの話だけど、でもまぁ目の前の一つがこうも鮮やかに解決すると、
じゃあこれからの人生の決断もAIに聞いて、「別の視点」を採り込んだ方が良いんじゃねえかな、という気がするものだ↓

プロンプト(copilot):
AI生成のゲームを作って発売したいと思ってるが、なかなか売れないだろう事が予想される。どうしたものか

🎮 AI生成ゲームが売れにくい理由(予想される壁)
AI生成ゲームは確かに難しい部分がある。例えば:

– 差別化が弱くなりやすい
AIだけで作ると、どうしても「AIっぽい」質感が出てしまい、他と似た印象になりがち。

– ユーザーが“AIだけで作った”ことに価値を感じにくい
「AIで作ったから買う」という人はほぼいない。
面白いかどうかが全て。

– 完成度のバラつきが大きい
AI生成物は品質が安定しないので、ゲームとしての体験が弱くなることがある。
でも、これは「AIゲームが売れない」のではなく、AIをどう使うか次第で売れる可能性は十分ある。

くっこの……「そうだけどさぁ」みたいな事をつらつら述べやがって、ロジハラだ!
AIがそう答えるならよ、――むしろ「真逆」を行きたくなるのが、この俺ってモノだぜ……!(そういう所やぞ!)

ツール・素材系アフィ

そんな訳でこれを見てる人の多くは、明日の有名クリエイターを目指し、制作を続けておられる方でしょう。
DLsiteで扱ってるツールやら素材のリンクを貼っておきますね……↓
[ACTION GAME MAKER]


[RPG MAKER UNITE]


[RPGツクールMZ]


[SRPG Studio]


[ゲームエフェクト集 Vol1 サファイアソフト素材シリーズ]


[シミュレーションRPGツクール素材集]


[ティラノビルダー PRO]


[フリー素材SE Vol.ABCバンドル (MP3+OGG形式で収録)]


[イラストアイコン素材集Vol.1]


[研究所 タイルセット]


[ねくらレトロフューチャーマップチップ素材集]


[ゴージャス×クラシカル UI&装飾素材セット]


[姫騎士リヨナ]


[A.I.VOICE 琴葉茜・葵]


[立ち絵素材集-ファンタジーヒロインR版-]