今からコミケ合わせでGBAゲームを作ってみる(9)

電源投入の度に部品出現パターンが同じになってしまう所と、
ハイスコアの記録において、SRAM読み書きを用いて対処。

・ヤルハラのおもちアドバンス
f:id:dumbo001:20171223194515p:plain

これで求める要件は一通り満たしたので、
後は元旦のバイナリ公開に向けて準備するだけ。

ソースコードは、、
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)
f:id:dumbo001:20171220143854j:plain:w360

ヤルハラのおもちアドバンス(1)
f:id:dumbo001:20171220144406j:plain:w360

後はパーツの出現における電源パターン回避と、ハイスコアの記録かなぁ。
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)

スプライトの読込・表示・制御までおしまい。

f:id:dumbo001:20171218004706p:plain

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 の再生まで完了した。

f:id:dumbo001:20171216194448p:plain

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 画面だけじゃ何しているか分からないという反応を頂いたので。)

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;
}