今からコミケ合わせでGBAゲームを作ってみる(9)
電源投入の度に部品出現パターンが同じになってしまう所と、
ハイスコアの記録において、SRAM読み書きを用いて対処。
・ヤルハラのおもちアドバンス
これで求める要件は一通り満たしたので、
後は元旦のバイナリ公開に向けて準備するだけ。
ソースコードは、、
GBA Develop Wiki さんのサンプルプログラムから
ライブラリをかなり利用させて貰っていて
半分くらい自分の書いたコードじゃないから厳しいかも…。
参考文献:
NO.114 2048
http://akkera102.sakura.ne.jp/gbadev/index.php?NO.114%202048
後日談
http://akkera102.hatenablog.com/entry/2016/02/13/190713
今からコミケ合わせでGBAゲームを作ってみる(8)
BGタイルマップによるフォント、背景画像を表示するところまで出来上がり。
これでゲームとしての体裁は整った感じ。
ヤルハラのおもちアドバンス(1)
ヤルハラのおもちアドバンス(1)
後はパーツの出現における電源パターン回避と、ハイスコアの記録かなぁ。
RTCの無いGBA環境で、さてどうしたものだろうか。。
参考文献:
Tutorial.10 タイルモード(1)
http://akkera102.sakura.ne.jp/gbadev/index.php?tutorial.10
Tutorial.11 タイルモード(2)
http://akkera102.sakura.ne.jp/gbadev/index.php?tutorial.11
今からコミケ合わせでGBAゲームを作ってみる(7)
スプライトの読込・表示・制御までおしまい。
DirectSound とは打って変わって、こちらはスンナリ理解出来た。
過去 DS で開発をやっていたからなのか、
はたまた id:akkera102 さんのチュートリアルが良かったのか。
まあどっちもなんだろうけど。
残すは BG タイルの表示のみか。
進み具合からして、意外と手こずっているのかも…。
参考文献:
Tutorial.7 スプライト(1)
http://akkera102.sakura.ne.jp/gbadev/index.php?tutorial.7
Tutorial.8 スプライト(2)
http://akkera102.sakura.ne.jp/gbadev/index.php?tutorial.8
今からコミケ合わせでGBAゲームを作ってみる(6)
DirectSound で BGM と SE の再生まで完了した。
id:akkera102 さんとこのブログ解説記事と
サンプルソースを参考にさせて頂いた。
あいや、正直半分くらいしか理解出来ていないんだが…。
ただ他にもいくつか作りたいものは有ったりするんで、
自分なりの咀嚼は来年の課題ということで。
次は取り合えずスプライトかな、と。
このままだと微調整も儘ならないし、遊んでいても面白くないし。
…という前置きではあるが、
実のところ BG タイルより配置に頭使わないから
先に片付けてしまおうってのが本音。
参考文献:
DirectSound (大雑把な説明1) - GBAプログラミング跡地
http://akkera102.hatenablog.com/entry/2015/10/15/212041
DirectSound (大雑把な説明2) - GBAプログラミング跡地
http://akkera102.hatenablog.com/entry/2015/10/17/181304
今からコミケ合わせでGBAゲームを作ってみる(5)
タイトル→ゲームプレイ→ゲームオーバーという基本的なシーン遷移と、
ゲームルーチンの実装まで完了。
テキストベースだが一応遊べるように成った。
HSP と GameMarker:Studio というベースはあったけど、
じっくりと考察せず急ぎ実装してったもんだから、
良いトコ取りというより、例えるなら「キメラ」と言えばしっくり来るような、
そんな様相に仕上がってしまって辛い。
既に一刻も早くリファクタリングしたい衝動に駆られているが、
コミケまでもう2週間しか無いので後回し。
何とか絵と音まで乗っけて持って行きたいのう…。
(printf 画面だけじゃ何しているか分からないという反応を頂いたので。)
最近垂れ流している作業用BGM
The End of Evangelion - Sohryu Asuka Langley vs Eva Series 60fps FI - sub ESP ENG
www.youtube.com
初見の動画とか見入っちゃうんで適当に知っているのをチョイス。
devkitPro の libgba キー入力ライブラリの備忘とか
libgba のキー入力ライブラリは scanKeys 関数でキーデータ更新後、
keysUp、keysDown、keysDownRepeat 関数で入力情報を 1 度取得すると、
2 回目以降値を返してくれなくなる。
libnds 使って DS 開発してた頃も確かそういう動きだったなーと思い
ソースコード見てみたら案の定だった。
関数内で値を返しつつ 0 でクリアしていやがる。
但し、keysHeld だけは何故か値クリアされていない。
for (;;) { VBlankIntrWait(); scanKeys(); if (keysDown() & KEY_A) { iprintf("INPUT A"); } if (keysDown() & KEY_B) { iprintf("INPUT B"); } }
この場合 A ボタンの入力には反応するが
B ボタンの入力には反応しない。
なので、押したときや離したときを複数回評価したいなら
一度変数に入れてから作業することになる。
for (;;) { VBlankIntrWait(); scanKeys(); off = keysUp(); trg = keysDown(); rep = keysDownRepeat(); if (trg & KEY_A) { iprintf("INPUT A"); } if (trg & KEY_B) { iprintf("INPUT B"); } }
なお、keysUp、keysDown、keysDownRepeat の戻り値はそれぞれ別なので、
3 つの変数を用意して scanKeys で更新の度に取得しておくと
必要なとき最新のデータが手に入って何かと便利。
という事で、とりあえずライブラリ化してみたものが以下。
id:akkera102さんの key.h, key.c をリスペクト(汗)。
中身は libgba と C 標準ライブラリで実装。
…実を言うとakkeraさんのサンプルプログラムから
こそーり借用しようかと思ったけど
如何せん key.h, key.c 以外のインクルードは増やしたくなかったので
結局お借りしないでポーティングという手段を取った。
key.h
#ifndef KEY_H #define KEY_H #ifdef __cplusplus extern "C" { #endif //共通ヘッダを記述 #include <gba_types.h> #include <gba_input.h> //--------------------------------------------------------------------------- //定数を記述 #define KEY_REPEAT_CNT 30 #define KEY_REPEAT_DLY 60 //--------------------------------------------------------------------------- //構造体を記述 typedef struct { u32 cnt; // 現在のキー u32 trg; // 押されたキー u32 off; // 離されたキー u32 rep; // リピートキー } ST_KEY; //--------------------------------------------------------------------------- //プロトタイプ宣言を記述 void KeyInit(void); void KeyExec(void); u32 KeyGetCnt(void); u32 KeyGetTrg(void); u32 KeyGetOff(void); u32 KeyGetRep(void); #ifdef __cplusplus } #endif #endif
key.c
//ヘッダを記述 #include "key.h" #include <string.h> //--------------------------------------------------------------------------- //構造体変数宣言を記述 ST_KEY Key; //--------------------------------------------------------------------------- void KeyInit(void) { //初期化処理を記述 memset(&Key, 0x00, sizeof(ST_KEY)); setRepeat(KEY_REPEAT_DLY, KEY_REPEAT_CNT); } //--------------------------------------------------------------------------- // vblank中に1回だけ呼び出します(チャタリング防止) void KeyExec(void) { //主処理を記述 scanKeys(); Key.cnt = keysHeld(); Key.trg = keysDown(); Key.off = keysUp(); Key.rep = keysDownRepeat(); } //--------------------------------------------------------------------------- // 現在押されているボタン u32 KeyGetCnt(void) { return Key.cnt; } //--------------------------------------------------------------------------- // 押された時のボタン u32 KeyGetTrg(void) { return Key.trg; } //--------------------------------------------------------------------------- // 離された時のボタン u32 KeyGetOff(void) { return Key.off; } //--------------------------------------------------------------------------- // キーリピートのボタン u32 KeyGetRep(void) { return Key.rep; }
今からコミケ合わせでGBAゲームを作ってみる(3)
画面デザインとリソース準備を主に。
久しぶりにペイントソフトを触った気がする。
作業内容。
・8x8フォントの作成(目コピー) ・背景リソースの減色とリサイズ、リサンプル ・GBA解像度に合わせて画面デザイン・配置など再考
また、GBAで実現するに辺り仕様を以下のように仮決め。
・画面描画はMODE 0を使用 ・背景(タイトル、ゲーム中、フォント)は256色1パレットとしBG2枚構成とする (ビットマップモードは描画ライブラリでも用意しない限り不便なので) ・スプライトは16色1パレットの64x32サイズで1オブジェクトとして複数表示する
スプライトの管理方法については積み残し。
複雑な事を求めている訳じゃないので多分難航しないとは思うけど。
今からコミケ合わせでGBAゲームを作ってみる(2)
GBA開発の現状についてざっくり調べてみた。
以下は、過去にlibndsを用いてDS Homebrewを少しだけ齧った人間の感想。
・libgbaはlibndsほど整備がされないまま更新が止まっている ・有用なexampleが殆ど無いのと、そもそも提供されているexample自体が少ない ・基本処理に至っては開発者が各々GBA仕様を元にスクラッチ開発している ・よって定番機能が統一化されていない (スプライト・BG表示、サウンド再生など) ・C標準ライブラリの対応状況は不明。というか未見 (今回開発するタイトルに関しては余り重要じゃない。 気にするのはメモリ周りくらい?)
今から約1か月で完成させる想定だと、
先人同様ライブラリ整備から始めていたのでは間に合わないので、
基本処理はネットの解説サンプルを参考に構築していって、
深い理解は後に回す、という方針が現実的な落としどころか。