串焼きほるもん

ゲーム制作サークルSMGほるもんXのブログです。製作状況やくだらない話などがメインになります。

※ご注意
R-18要素があります。直接的なものはなるべく記事にしないようにしていますが全年齢版からこられた未成年の方やそういった表現が苦手な方はお気をつけ下さい。
タイトルかタグにR-18のついているものを避けるようにすれば大丈夫だとおもいます。

※Please be careful
There is an R-18 element. I try not to write direct things as much as possible. However, please be careful for minors and those who dislike such expressions.
Please do not refer to the article with the title or tag of R-18.

CF2.5

CF2.5でレーザーをつくったよ

みなさんこんにちは、最近は身体を酷使しすぎて疲れが抜けないSです。

今回はCF2.5でレーザーをつくったので忘れないようにいつものようにメモ記事にします。

レーザーをつくるのは意外と簡単で細長いオブジェクトを発射オブジェクトから発生させてやればそれだけでいけます。なんせ光の速さで発射されるのでいきなり画面端まで届いても全く違和感がありません。強いて言えば発射される前に光が集る様な発生モーションと終わったときに徐々に細くなって消えるモーションをいれてやれば完璧です。実際そういうゲームも多いです。

だがしかしっ

重金属ガールはシールドで防ぐんだよぉぉぉぉっ!!!

という訳で何かに遮られたときにそこで止まるレーザーを作りました。



2パターンあります。(動画はそのうちの超連射方式版です)

一つ目は金字塔と冥府の王で使った方法なのですが細長いレーザーの画像をX軸の方向のみスケールを変更して伸縮させてやる方法。
この方法の利点はあらゆる意味でお手軽ということ。
欠点は直線にしか発射させられないことと画像をアニメーションさせられないということ。

二つ目は小さい弾を切れ目なく連射して1本のレーザーに見せる方法。
この方法の利点は軌道を好きに変えられることと、見た目を自分の好きなようにできること。
欠点は制御があらゆる意味で難しいということ。

です。
今回もサンプルを置いておきますので見たい人はどうぞ。

ダウンロード

大まかな所はサンプルのイベントリストにコメントを入れているのでわかると思いますので今回の記事も補足説明に留まります。

今回はforeachループとそれを使ったオブジェクトの同期を理解していないと難しいと思います。

foreachループはアクションにあるカウントの中の「各オブジェクトにつき」というやつです。
これは高速ループとは違い文字通り「各オブジェクト」につき処理を行うということです。
もう少し詳しく説明すると同一のオブジェクトが複数あるときに一括処理ではなくオブジェクト一つ一つ個別に処理するということです。
この同一オブジェクトというのは複製で作ったオブジェクトのことでオブジェクト名も完全に同じものになります。クローンでつくったものはオブジェクト名の後に数字がついてオブジェクト2みたいになりますがこちらは別オブジェクトになるので気をつけてください。
通常、同一オブジェクトの処理は全て同じ処理をするか個別に処理するかをCF2.5側で勝手に判断して行っています。
例えば「障害物と衝突」という条件が入っていればその衝突したオブジェクトだけにアクションを適用してくれたり、「常に実行」の条件下で変数Aに1を追加とあれば存在する同一オブジェクト全ての変数Aに1が追加されたりします。
条件次第である程度バラバラにオブジェクトの処理をすることは可能なのですが意図した動作をしてくれないことがよくあります。特に同一オブジェクトの処理を同一時間(1フレーム内)で行うとよく変な動作になります。
そんなときforeachループを利用します。

で、今回は更にそのforeachで処理する各オブジェクトに別の各オブジェクトを同期して処理しています。

同一ではないオブジェクト同士を同期させるにはインビルドペアなどいくつか方法がありますが今回は固定値を利用した方法を採用しています。
オブジェクトにはそれぞれ個別の認識番号である固定値が設定されています。
親になるオブジェクトの固定値を子になるオブジェクトの変数に代入して固定値と変数が同じなら処理するというイベントを組めば別のオブジェクト同士を同期することができます。
この方法の利点はオブジェクトの作成されるタイミングも同期するオブジェクトの数も関係なく処理できることです。
例えば巨大なキャラに破壊できるパーツを5つ作って同期させてやることも簡単にできます。
全てのパーツオブジェクトの変数に巨大なキャラオブジェクトの固定値を入れてやって、条件に「巨大なキャラの固定値=パーツオブジェクトの変数」を入れてやればよいのです。

ただし巨大なキャラが複数体になったときにおかしな挙動になることがよくあるのでforeachと組み合わせるわけです。

各巨大なキャラにつき~
パーツオブジェクトの変数=巨大なキャラの固定値

みたいな感じですね。
変数を比較するときに基本的にはforeachを指定するオブジェクトは後ろにもってくるようにしてください。
条件で指定する場合どちらのオブジェクトを先にもってくるかでアクション時にピックアップされるオブジェクトが変わってくるためです。
あくまで自分の経験則によるものであってCF2.5がどういう風に判断しているのかが重要なので上手く動作しないときは逆にしてみるといいかもしれません。

このサンプルでは

親オブジェクト(発射台)の固定値
レーザー根本の識別番号

の2つで同期を取っています。

どの発射台(固定値)から発射されたレーザーで何番目(識別番号)に発射されたレーザーなのか、という認識です。

また小ネタとして
経過フレーム数 mod 2 を利用して

=0 偶数
=1 奇数

という条件もつかっています。

ではサンプルファイルの説明ですが

スケール変更方式はレーザー根本とレーザー本体とレーザー先端の3つのパーツで構成されています。
レーザー本体は細長い1枚の画像でこれのX軸のスケールを変更してレーザーを伸縮しています。
ホットスポットとアクションポイントを両端に持ってくることで拡縮しても根本と先端がきっちりと位置同期するようになっています。
計算しやすいように100ドットの長さで作成してあるので0.01単位で変化させれば1ドットづつの伸縮が可能となっています。
無限に伸ばすのもあれなので最長は表示領域の最大値640にしています。
スケールに換算すると6.40ですね。
障害物に当たったときは高速ループを利用して1フレームで障害物にギリギリ当たらない長さまで縮小しています。
こちらは比較的シンプルにできました。
そしておかしな挙動もないのでいろいろな場面で利用できます。

続いて超連射方式ですがこちらもレーザー根本とレーザー本体とレーザー先端の3つのパーツで構成されていますがレーザー本体にアニメーションが2パターンあります。
こちらは360度撃てるようにベクター動作で移動します。
その際、レーザーとレーザーが連なって見えるようにレーザーの長さ16ドットと同じか少し短い距離を移動するように速度を1550(いろいろ試した結果ベクター動作は速度100で1フレーム1ドットの移動になるようです)に設定しました。上下左右の4方向なら1600でも良いのですが中途半端な角度になると一部隙間が確認できたので少し短めの1550で設定しました。
レーザーをアニメーションーのパターンAとBが交互になるように発射します。
レーザー根本で1フレームごとに照射時間をカウントしておきその値が偶数か奇数かでアニメーションシーケンスを切り替えています。
発射された後はアニメーションのフレームはレーザー根本と同期させています。
レーザーの先端は最初の1発だけ発射してあとはそれを使いまわしています。
レーザー本体が障害物に当たらなかったときはそのまま画面外へ出ていき、画面外では絶対に利用しないであろう位置に強制移動して待機。
レーザー本体が障害物に当たったときは障害物に当たったレーザー本体の位置に移動します。同時にレーザー本体が破壊されるのであたかも障害物に当たってるかのようにみえるというカラクリです。

こちらは苦労してつくりましたがいろいろとつくりが甘く状況を考えて利用しないと行けないレベルの出来です。
具体的には
障害物に遮られた時に障害物より先のレーザーは破壊されないので飛んで行くのが見える。
まあ消滅するのもおかしな話なのでこれはこれでありなんだけど、そのとき障害物に遮られるレーザーが2つ以上存在することがあるのに対しレーザーの先端は1つしかないのでおかしなことになります。
レーザーを薙ぎ払うパターンにしたときに先端が明後日の方向に飛んでいったりもします。
もう少しいろいろと考える余地は残っているのですが重金属ガールで想定される使い方ではこれで問題ないのでこれで完成としています。
最終的には雷電IIのプラズマレーザーみたいなのがつくれたら良いな~とおもっていますが先は長い。

誰かこれ改造して作ったサンプルうpしてくれてもいいのよ|д゚)チラッ

という訳でいよいよ重金属ガールにも光学兵器が登場しますがこのサンプルを上手く移植できるでしょうか…心配です。

制作もゆったりとしたペースですが進んでいますのでのんびり完成を待っていてくださいね。

それでは今回はこの辺で!
アデュー(´・ω・`)ノシ



CF2.5での自機動作を自分で作ったよ

皆さんこんばんは
9つ工場の一番搾りを手に入れビール三昧の日々を送っているSです。

今回は重金属ガールの制作でPMOを使用せず移動処理を組んだのでその際にサンプルとして作った重力制御とスムースな加減速のmfaファイルを解説&公開したいと思います。
いつも通り自分メモとして記事を書きますので自分以外の人がみてもわからないかもしれません。
参考にする方はCF2.5のチュートリアルのチョコブレイクと縦スクロールシューティングあたりは理解していないときついと思います。

が、その前に…

前回の記事で急遽実施したアンケート結果の発表で~す!

なんと予想の3倍以上の10票入りました!!
有難うございます。
そして

堕ちる捜査官・・・・・3票
重金属ガール・・・・・4票
金字塔と冥府の王2・・3票+1票

となりました。
金字塔と冥府の王2の+1票はアンケート期間の終わった後にツイッターで寄せられた票です。
ツイッターの集計期間は7日までしかないのですができれば1ヶ月と1年と無期限をつけて欲しいですね。

情報の露出量から考えて妥当な結果となりました。
という訳で心置きなく重金属ガールの制作に邁進できます。
残り2つはいつでも制作を開始できるようにネタを溜めていこうと思います。


ここからCF2.5での自機動作のサンプル公開と解説します。

最初に
  • 衝突マスク
  • 高速ループ
  • mod
  • abs
  • int
を使っているので簡単に説明しておきます。

衝突マスクは特定の座標が「障害物」もしくは「はしご」かを判定するもので条件のストーリーボードコントロール(チェス盤と馬みたいなアイコン)にあります。

高速ループは指定した回数同じ命令を繰り返すためのものです。条件、アクションともに特別(歯車アイコン)の中にあります。
何らかの条件を使用しアクションでループを開始。
条件でループ実行中を選び繰り返したいアクションを入れる。
といった使い方をします。
最低でも2行使用します。

「mod」「abs」「int」は数式です。
数値Aを数値Bで割った時の余りを出すのが「mod」で「数値A mod 数値B」というように使用します。
例えば「13 mod 10」とすれば「3」と返してくれます。

「abs」は絶対値を返してくれます。
絶対値ってのは0からどれだけ離れているかを表しています。
わかりやすく言うとプラス・マイナスを除いて数字だけを返してくれます。
「abs(-3)」も「abs(3)」も「3」と返してくれます。

「int」は小数点以下を切り捨ててくれます。
「int(1.41421356)」の場合「1」となります。

詳しくはCF2.5のwikiを見てください。

ではサンプルの解説です。

まずは重力制御サンプルです。
フレーム「ゲーム的重力制御」のリストにコメントを入れているのでみればわかると思います。
基本的な考え方としては

重力→落下速度の最大値
重力加速度→1フレームごとに加算される速度
落下速度→現在の落下速度

となり落下速度分オブジェクトを下に移動させることになります。

条件・落下速度が重力より下
アクション・落下速度=現在の落下速度+重力加速度

条件は空中にいる時が判別できればなんでも良い
アクション・オブジェクトのY座標を現在のY座標+落下速度

文章にするとわかりにくいですがサンプルの重力基本の所をみれば理解しやすいと思います。

後は障害物に衝突したときに落下速度を0にするなりフラグなりなんなりで空中判定から地上判定へ切り替えてやれば重力制御の完成です。

ここまでできればジャンプに関しては落下速度をマイナスにしてやれば勝手に上昇した後落ちてきます。
重力を5、重力加速度を1、ジャンプ力を4とした場合
  1. 落下速度を-4にする→落下速度に加速度を加える--4+1=-3→Y座標を-3(3ドット上昇)
  2. 現在の落下速度は-3なので加速度を加えて-2→Y座標を-2
  3. -2+1=-1
  4. -1+1=0→落下速度0なのでこのフレームではオブジェクトは移動しない(ジャンプの頂点)
  5. 0+1=1→ここから落下し始める
  6. 1+1=2
  7. 2+1=3
  8. 3+1=4
  9. 4+1=5
  10. 以降は重力の5を超えてしまうので毎フレーム5ドットの落下
内部的にはこんな感じになります。
1フレームでの移動量が-3,-2,-1,0,1,2,3,4,5,5~と徐々に変わっていくのがわかると思います。
あとは重力と重力加速度をいろいろといじってやれば自分の納得できる挙動ができるのではないかと思います。


次に小数点以下の移動サンプルです。
こちらは1フレームに1ドットの移動よりも遅い移動を実現するためのサンプルです。
しかしゲーム画面がピクセル単位で構成されている以上1ドット以下の移動はできません。
なので1ドット以下の移動の表現は経過時間と絡める必要があります。
どういうことかと言うと

1フレームに0.5ドットの移動は不可能

2フレームに1ドットの移動は可能

ということです。

ここからは説明が難しいのでサンプルをみて解析してほしいのですが考え方としては

最低速度は1フレームに1/100ドット移動、つまり100フレームに1ドット移動とする
移動開始と共に経過フレーム数をカウント
カウントが100に達したら1ドット移動してカウントを初期化
加速して速度が2/100になったら50フレームに1ドット移動なのでカウントの上限を50に設定

といった感じ。

加速時のパラメータは
  • 現在の速度(移動速度)
  • 加速度
  • カウント(移動用タイマー)
  • 移動するタイミング
の4つになりリスト的には

移動開始とともに移動用タイマーを常に1加算していく
同時に移動速度に加速度を足していく
移動するタイミングは100を現在の速度で割った値
移動用タイマーの値が移動するタイミング以上になったら1ドット移動

となる。
現在の速度が100を超えたら機能しなくなるのでここでmodを利用しています。
移動速度 mod 100 として0~99を繰り返してます。

移動速度が100を超えたら上記の移動分に加えて1フレームにつき「int(移動速度/100)」ドット移動させています。
intを使って小数点以下を切り捨てています。

小数点以下の移動と1フレームに1ドット以上の移動の2つの処理を組み合わせて作っています。

減速に関しては移動速度から減速度を引く処理をするだけで他の処理は加速と兼用です。
移動の反転時は減速と加速が同時に働くように組んだので入力がない場合と反転入力がある場合とでは制動距離がかわるようになっています。

う~~~~~~~~~ん

そんな感じ!

あとはmfaファイルみてとしか言えない。
そもそもこの記事は後々自分がみて思い出せればいいのだ!←身も蓋もない(;´Д`)

最後にこのサンプルを経てできた重金属ガールの挙動がこちらになります。

ダウンロード

CGがつくと結構それっぽい動きになってますね。

カーソルキーとZXVキーで操作します。
サマンサのドキドキトレジャーハンティングのキーコンフィグプログラムをコピーしてexeファイルとおなじ場所に置けばキーコンフィグもできちゃうぞw

ジャンプとかできちゃいますがプレイヤー操作でジャンプする予定はありません。



しれっとα版を配布しつつ今回は終わりたいと思います。
ではでは!

RGB係数

みなさんこんにちは
最近集中力が続かないSです。

熊本地震で九州が大変なことになっていますね。

近頃私は災害などのニュースをみていると東日本大震災があったおかげで皆の防災意識が変化して被害が少なくなっているんじゃないかなと思っています。
例えば東日本大震災がなかったら一度目の地震の後に避難所へ移動した人はいまより少なかったんじゃないだろうか、そうすると二度目の地震で倒壊した建物に巻き込まれた人もいまよりずっと多かったのではないだろうかと思うのです。
さらに震災時の行政の対応や物資の備蓄なども東日本大震災以降全国で見直されていたので混乱も以前よりは起きにくくなっているのではないかと思います。
もちろんSNSなどでのデマや一部のメディアや心無い人達のひどい行動などもありますが、逆にボランティアや物資の援助 などの情報などもそれほど混乱なく伝わっているように感じます。
経験を活かすっていうのはすごいことなんだなと感心しています。

とにもかくにも被災者の皆さんが早く平穏な生活に戻れるよう祈っています。


今回の記事はRGB係数についてです。
CF2.5にはRGB係数というのがあってそれをいじればキャラクターや背景のカラーを簡単に変更することができます。
とはいっても2Pカラーや色違いのキャラにするとかそういうのではなく燃えた時に赤味を強くしたり凍った時に青味を強くしたりって感じのカラー変更です。
やり方はエフェクトの中のRGB係数の変更を選択して数値を入力するだけです。
R(赤)G(緑)B(青)の3原色がそれぞれ256段階あって全部で16777216通りあります。
全て0で真っ黒、全て255でそのオブジェクトや背景などの通常の色が表示されます。

RGB値 は「B×65536 + G×256 + R」で算出できるのですが 実際にどんな色に変化するのかはプログラムを走らせてみないとわかりません。

最初のうちは電卓を使ってそれっぽい数値を算出していたのですがなんせ1677万通りもあるのでイメージ通りの値を算出するのは大変でした。
そこでRGBの値を入力するだけでリアルタイムで色を確認できるアプリを自作しました。
 
2016-04-18
こんな感じですね。

2016-04-18 (4)
オール0で真っ黒です。

2016-04-18 (2) 2016-04-18 (7)
燃えたり凍ったり

2016-04-18 (6)
ついでに透明にできるようにして

2016-04-18 (1)
残像を出してみたり

ずいぶんと便利になりました。
金字塔と冥府の王の作成にも役立っています。

2016-04-18 (5)
ちなみにエフェクトのstandardのなかにある反転を使えば真っ白もできます。
ダメージうけた時に白く光るのって結構悩んだんですよね。
エフェクトのstandardはどの形式でビルドしても使えるはずなのでビルド形式を気にせずつかえるのも助かります。

確認用のオブジェクトの差し替えと背景色の変更さえすれば今後もずっと利用可能なので結構いらないところまで作りこんでしまいました。
この手の自作ツールは自分のスキルアップのためと後々の作業効率化のために積極的に作っていこう。

というわけでいつもどおりアップしとくので気になる人は有償での二次配布以外は好きにしてやってください。

ダウンロード

そうそう金字塔と冥府の王ですがなんだかんだで今月中に体験版がアップできそうです。
エロイベント付きがアップできるかどうかはわかりませんがお楽しみに。
 

StringParser2を使って外部ファイルからデータを取り込んでみたよ

こんにちは
手の怪我もかなり回復してきて作業に支障がなくなってきたSです。
手のひらの怪我が治ったのが一番でかいですね。
マウス使ってもいたくないぞ!

さて、今回はイベントシーンの作成のための文字表示のテストサンプル作りです。
アドベンチャーゲームなどで使われている1文字づつ表示されるシステムは美人警察でつくったのでよいのですが、表示される文章を入力するのが非常に面倒です。
CF2.5はテキスト関係の能力はあまり高くないのです。
そこで外部ツールで作ったテキストファイルを読み込んで表示させてやればかなり楽になるんじゃないかと思いStringParser2エクステンションに手をだしました。
で、wikiのコマンド解説をみながら作業したのですがかなり苦労しました。
なので忘れないうちにメモ記事書いておきます。
いつものようにサンプルを置いておくので興味のある人は好きにしちゃってください。

全体の流れとしては

外部ファイルから適当なオブジェクトの可変文字列にテキストを読み込む

文字列オブジェクトの可変文字列変更で読み込んだテキスト表示する
このときLeft$(可変文字列,表示文字数)の数式を利用して左から1文字づつ表示文字数を増やしてやる

全部表示されたら待機カーソルを出して一時停止

任意のアクションで最初に戻る

といった感じです。

これに加えて読み込んだテキストを数値に変更して変数でキャラ絵の位置とアニメーションシーケンスと方向を変化させるようにしました。

外部ファイルからテキストを読み込んで解析するのにStringParser2をつかいます。

まずは外部ファイルの作成です。
今回のプログラムで外部ファイルに必要な項目は以下の6つです。

イベントの判別(再生したいイベントシーン)
キャラ絵の位置(オブジェクトの座標)
キャラの種類(アニメーションシーケンス)
キャラの表情(オブジェクトの方向)
効果音(サウンド)
キャラのセリフ(テキスト)

区切り文字を;(区切り文字は後で設定するので何でも良い)にしてテキストエディタで適当にファイルを作ります。

;event01
;0;1;4;0;今日のごはんはなにかな?
;1;2;4;0;ハンバーグがいいなぁ
~以下略~ 

こんな感じです。
最初の1行めがイベントの判別用で次からが変数用の数値とセリフテキストになります。
ひとまずeventdata.iniというファイル名で保存しました。

でいよいよStringParser2の出番です。
設定はこんな感じ。
2016-04-08

Case Sensitiveは大文字と小文字を区別する
Wildcard Searchはワイルドカードを使う
ってことらしいですよ

ワイルドカードってのはevent01,event02,event03…みたいなものの検索をするときに
「*」か「?」をつかってまとめて検索する方法らしいです。
event*やevent?検索すればevent○○ってのが全部候補にあがるってことですね。
「*」が複数文字で「?」は1文字らしいですが詳しくはwikiを見てください。

まずは下準備としてFile→Load from fileで外部ファイルを読み込みんで、List Tokenizing→Delimiters→Add delimiterで区切り文字を指定します。

ここからが難しかったところです。

wikiにはインデックスとかトークンとかnCountとかいろいろと用語がでてくるのですがそれが何を指すかさっぱりわからないのです。
ぼんやりとわかっているのは全体の文字数と区切られた文字列の数を確認できることと文字列の検索ができるということです。
他にもいろいろとできるのですが必要なことしか調べてません。
古池や 蛙飛び込む 水の音
というテキストがあったとして、区切り文字をスペースにすると文字数が3+5+3で11文字(+区切り文字のスペース2文字が入るかもしれない)、区切られた文字列の数が3ということになります。たぶん。
で、やりたいことは「水の音」ってのは何個目なのかなってこと。
それがわかればそこから順に読み込んでいけばイベントごとに必要なデータが得られるというわけです。

最初の読込位置を決定するために、先ほどつくったファイルのeventの位置を調べて変数(読込位置)に代入します。

;event01←ひとつ目
;0;1;4;0;今日のごはんはなにかな?
;1;2;4;0;ハンバーグがいいなぁ
~省略~ 
;event02←ふたつ目
~以下略~ 
 
変数を変更でlistFind( "String Parser", "event*", 1 )と入力するとeventのひとつ目の位置を返してくれます。
最後の数値を変化させると2個目3個目と検索できるのでevent01はオープニングでevent02がエンディングって感じで区別できます。

読込位置がわかったらその次の区切りから順に読み込んでそれぞれ対応する変数なり可変文字列なりに入れていきます。
数式はlistGetAt$( "String Parser", (先ほど取得した変数(読込位置)) + α)です。
+αの部分を1,2,3…と増やしていけば順に読み込んでくれます。
今回は6つの項目を作りましたが繰り返し利用するのはevent*以外の5つなので+1~+5まで作ります。
数値の場合はval()で囲んで文字列を数値化しないといけません。

5個読み込んだら変数(読込位置)に5を追加して次の読込位置に変更しておきます。
この辺りの数値は項目が変化したら変化した分だけ変えてやれば応用が効くと思います。

これで変数と可変文字列にそれぞれのデータが読み込まれました。

あとは普通にテキストとキャラ絵の表示処理をすれば良いわけです。
テキストを全て表示したら保存してある読込位置からデータを読み込んでいけばデータを入力してあるぶんだけテキストが表示されます。

最後にイベントの終了処理ですが、このサンプルでは最初のデータが99だったら終了する様にしています。
他にもそれぞれの項目が本来ありえない組み合わせになったときに特別な処理をするようにすれば背景を変えたりいろいろできるんじゃないかと思います。

これでイベントシーンのテキストを外部ツールで作れるのでCF2.5の作業がかなり軽減されるんじゃないかと思います。
エクセルでつくってCSVのカンマ区切りで保存するのがやりやすそうだな。
CF2.5で入力ツールを作るのも面白そうだけどそれはまあ気が向いたらってことで今回は終わろうとおもいます。

ではまた
ノシ

追記
※重要

その1
フレームのプロパティでフェードインを設定しているとフェード中の処理がおかしなことになるようでエラー吐いて止まります。
StringParser関係の数式を使う場合イベントを分けてやったりフェードインの効果が終了するまで待機するなりすれば回避できます。

サンプル修正例
2016-04-09


その2
ファイルを読み込むときにCSVにすると文字数が2個多くなる現象が回避されました。
該当箇所の+2を削除しないと最後2文字が表示されないのでサンプル見てる人は注意。



サンプルダウンロード
 

CF2.5でメニューの作成

桜の綺麗な季節ですが皆さんいかがお過ごしでしょうか?
何年かふりに盛大に転倒し傷を負ったSです。
つっかけで走るのはやめましょう。

さて本日はCF2.5でのメニューの作成です。 
カーソルで項目を選んで決定するあれです。
CF2.5は作りにくいと評判ですが、ただ作るだけならさほど難しいものでもありません。
しかし汎用性に富んだものをつくろうとか見栄えのいいものをつくろうとかいろいろ欲が出てくると途端に難しくなってしまいます。

そこで今回は、某掲示板で入れ替え可能なアイテムメニューの作り方がわからないとかなんとかいうのをみてからずっと考えていた方法を試してみようとおもい作ってみました。

2016-04-04 (1)
 こんな感じ。
見ただけでは全くわかりませんが項目が増減しても簡単に変更できる作りになっています。

拍子抜けするくらいうまくいったので調子に乗ってアイテムニューを入れ替えて整理できるような機能も試してみようとおもったのですがこのゲームにはアイテムは整理するほどでてきません。
というわけでまた別にサンプルプログラムを作りました。
置いときますので気になる人は好きにしてやってください。

2016-04-04 (2)

だいたい40行くらいでできました。

2016-04-04 (3)
カーソルを動かして

2016-04-04 (4)
選択して

2016-04-04 (5)
入れ替え完了!

詳しく知りたい人はmfaファイルを見てもらうとして簡単に解説しといきます。

まずカーソルオブジェクトを用意します。
さらにアイテムオブジェクトをアイテムの数だけ用意します。
アイテムオブジェクトはオブジェクトグループにしています。

カーソルの移動はそれぞれのアイテムオブジェクトに表示位置にあたる変数をあらかじめ入力しておきます。
カーソルオブジェクトには現在地の変数を設定しておき矢印キーで増減させます。
上下移動は単純に列数を足し引きしていますが上から下、下から上とループさせるところはなんだか効率の悪い数式つかってます。
カーソルの移動はカーソル位置の変数と同じ値を持っているアイテムオブジェクトの表示位置に同期するようにしています。
この変数が同じオブジェクトの位置に移動するという処理がうまく動作してくれたのでアイテムの数をどれだけ増減させようが配置をどうしようがカーソルがアイテムを見失うということがありません。
ただしアイテムを配置する形によってカーソル位置の変数の増減をうまくプログラムしないといけないのであまりに奇抜な配置だと専用で組んだほうがマシということになりそうです。
「ボタンを押した時」と「カーソルと重なっている」を条件にしてそのアイテムの変数なり文字列なりを読み取れば効果を発揮させるのも容易いと思います。

この変数で位置を同期するというのを金字塔と冥府の王のスタートメニューで使いました。

で、つぎがいよいよアイテムの入れ替えなのですがここまでできていれば簡単な話です。
要は選んだ「2つのオブジェクトの位置の入れ替え」と「カーソルと同期するための表示位置の変数の入れ替え」をすれば良いわけです。
というわけでアイテムオブジェクトの変数XとYにそれぞれ自身の座標を代入して、その座標に常に表示するようにしました。
その後、選択した時に一時的に座標と表示位置をカーソルの変数に記録して2つ選択された時にお互いの変数を書き換えるようにすればあっさり完成です。

方法が思いつくまでは結構苦労したけどいざつくってみるとすごくあっさりできたな~というのが感想です。

金字塔と冥府の王ではつかわないんですけどね

さっさと設定画面つくろう。

ゲーム作ってると汎用性というかメンテナンス性というかそういうのをついつい考えながらつくってしまうので余計に手間がかかったりするのですが、このメニューもホントはアイテムオブジェクトを1つで作りたいんですよね。
アイテムの方向とアニメーションシーケンスの切替を利用すればオブジェクト1つで見た目を変えることは可能ですし、連番をつけてやれば位置情報もすぐつくれるし。
あとはiniファイルかなんかにそれぞれのアイテムのステータスと配置用の初期座標データを入力しておいて、高速ループとループインデックスを上手く使ってオブジェクト作成すればいけると思うんだけど、これは私には難しいですね。
こういうやつは配列つかえばいいみたいな記事もよくみかけるのでそういったアプローチのサンプルもみてみたいなぁ。
誰か作ってください。

こういうサンプルプログラムをたくさん作っていって、共通の基本システムはコピペだけであとはメインのゲーム部分とCGつくるだけ、みたいになったら制作はかどるんじゃないだろうかとおもっています。

本日はここまで。
今回こっそりRGB係数つかってますけどそれについてはまた今度。
またね!
DLsite作品一覧
DMM作品一覧
itch.io作品一覧
訪問者数
  • 今日:
  • 昨日:
  • 累計:

記事検索
最近のつぶやき
  • RSS
  • Dlsite blog