RPGメーカーギルド? にゃんだそれは―皆のci-enまとめvol224
2012年からDL同人エロゲの感想アフィを続けて来た私(111)ですが、昨今のこの業界は百花繚乱、ますます円熟の道を歩みつつある様に感じられる。
万DLを叩き出すいわゆるトップクリエイター、遊ぶ専門のユーザー、あるいはその狭間にぶらぶらと位置する層。
そこで色んなクリエイターの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]

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























ディスカッション
コメント一覧
AIのプロンプトだけでエロ画像の差分作れる時代になったら起こしてくれ
差分って発想が人間的なのかも知れないですね……
今の技術体系を聞くに、差分で変化させるってのが相当向いてなくて、まぁそうなる未来はかなり遠そう。