れーすのエグゼ流星Blog

エグゼとゲームと雑記

エグゼ解析したりゲーム作ったりいろいろ。

サイト案内(初めての方はこちらを)

初めまして。れーすです。

ここのブログに訪問したのは「流星のロックマン」や「DSネット対戦」などで検索したのがほとんどだと予想しているため、案内を記しておきます。

 

ニンテンドーDSのネット対戦(熱帯)について

 

exe-race.hateblo.jp

exe-race.hateblo.jp

exe-race.hateblo.jp

exe-race.hateblo.jp

 

 

 

GBAプログラミング 5日目

取り組んだ内容

Tutorial.6 キー入力とデバッグ
http://akkera102.sakura.ne.jp/gbadev/index.php?tutorial.6

やってみたこと

1.上 下 右 左 Bボタンのキー入力、同時入力の受け取りをVisualBoyAdvanceのloggingを用いて確認してみる

f:id:rai17321:20180606160308j:plain

#include "lib/gba.h"

//---------------------------------------------------------------------------
void WaitForVsync(void)
{
	while(*(vu16*)0x4000006 >= 160) {};
	while(*(vu16*)0x4000006 <  160) {};
}
//---------------------------------------------------------------------------
int main(void)
{
	// モード設定なし

	u32 x = 0;

	for(;;)
	{
		WaitForVsync();

		if( !(REG_KEYINPUT & KEY_UP)  ) TRACEOUT("上ボタン\n");
		if( !(REG_KEYINPUT & KEY_DOWN)) TRACEOUT("下ボタン\n");
		if (!(REG_KEYINPUT & KEY_LEFT)) TRACEOUT("左ボタン\n");
		if (!(REG_KEYINPUT & KEY_RIGHT)) TRACEOUT("右ボタン\n");

		//if (!(REG_KEYINPUT & KEY_UP & KEY_DOWN)) TRACEOUT("上と下\n");
		//if (!(REG_KEYINPUT & KEYIRQ_OR & KEY_RIGHT)) TRACEOUT("テスト\n");

		if( !(REG_KEYINPUT & KEY_A)   ) TRACEOUT("%d回押したよ\n", x++);
	}
}

考察

コメントアウトした部分の動作がうまくいかなかった。
&条件なので上と下を押さないと動作しないはずが、常に動作してしまっている。
KEYIRQ_ORとかを使うみたいなんだけど、使い方がよくわからなかった。

GBAには標準でリセット(A & B & SELECT & START)機能があるので、実装はできるはず。

GBAプログラミング 4日目

取組んだ内容

tutorial.4

mode4

やってみたこと

1.フレームバッファを無限ループでずっと切り替えさせてみる。

 

int main(void)
{
	// モード設定
	// 4bit目(BACKBUFFER)を1にすることで、フレーム2が有効になります
	SetMode(MODE_4 | BG2_ENABLE | BACKBUFFER);

	// 画像と色データの読み込み
	Mode4SetFrame((u8*)&frame1Bitmap, 1);
	Mode4SetFrame((u8*)&frame2Bitmap, 2);

	Mode4SetPalette((u16*)&frame1Pal);

	while(1){
	SetMode(MODE_4 | BG2_ENABLE);
	SetMode(MODE_4 | BG2_ENABLE | BACKBUFFER);
	}
	

	for(;;)
	{
	    WaitForVsync();
	}
}


f:id:rai17321:20180530155500j:plain

考察

 フレームバッファが画面切り替えに使われるのはわかったけど、BACKBUFFERの値をソースコード上で変えたら切り替わるのか?
という考えから、試しに無限ループでやってみたところ見事にヒット。

BACKBUFFERが定義されているのは
#include "lib/gba.h"
#include "res.h"
のどちらなのかな。

そして、助言をいただきはてなブログの記法を見たままからはてな記法にしました。
これでソースコード問題も解決だね!

GBAプログラミング 3日目

取組んだ内容

tutorial.3

ビットマップモード

 

やってみたこと

1.png画像を出力してみる

 

// 画像の読み込み

Mode3DrawImage((u16*)&imageBitmap);

f:id:rai17321:20180524133602j:plain

読み込ませるときの処理がよくわからない。

チュートリアル3のフォルダを流用し、gritで画像をGBA用に変換したものを読み込ませようとしたら、どうやらどこかの処理で画像をGBA用に変換、インポートまでしてくれてるみたいだ。(tut3/res)

楽っちゃ楽だけど、仕組みをきちんと知りたさがある。

 

 

2.四角形の描画をしてみる

f:id:rai17321:20180524142928j:plain

 

#include "lib/gba.h"#include "lib/gba.h"
//---------------------------------------------------------------------------

void WaitForVsync(void)

{ while (*(vu16*)0x4000006 >= 160) {};

while (*(vu16*)0x4000006 <  160) {};}

//---------------------------------------------------------------------------

void Mode3PutPixel(u32 x, u32 y, u16 col){

u16* ScreenBuffer = (u16*)0x6000000; ScreenBuffer[y * 240 + x] = col;}

//---------------------------------------------------------------------------

// モード3で四角形を塗りつぶすvoid Mode3DrawBox(u32 sx, u32 sy, u32 ex, u32 ey, u16 col){ u32 x, y;
for (y = sy; y<ey; y++) { for (x = sx; x<ex; x++) { Mode3PutPixel(x, y, col); } }}int main(void){ // モード設定 SetMode(MODE_3 | BG2_ENABLE);
// ドットの描画 u32 sx = 50; u32 sy = 50; u32 ex = 150; u32 ey = 150; u16 col = RGB5(31, 31, 31);
Mode3DrawBox(sx,sy,ex,ey,col);

for (;;) { WaitForVsync(); }
}

 

はてなソースコードの貼り付けするとインデント消えるのかよ!!!!!!!

 

DXlibでの描画と対して変わらない。

2つの頂点を設定することで描画を実現している。(sx,sy & ex,ey)

 

やってて思いましたが、UnityはDXlibを楽にしたもので、DXlibはこのような古典的なゲームプログラミングを楽にしたもの、このゲームプログラミングもアセンブリを楽にしたものなんじゃないかな。

GBAプログラミング 2日目

取組んだこと

・開発wikiチュートリアル2

tutorial.2

 

学んだこと(印象に残ったこと)

GBAの描画形式がmodeという種類で分けられている。

0-2がタイル

3-5がビットマップ

タイルとビットマップの違いは、このサイトがわかりやすいかも。

画像処理の話の中で、ラスター形式やタイル形式という言葉がでて… - 人力検索はてな

ビットマップが一番細かい描画なのかな?

 

processingのvoid setup()みたいに初期設定で描画設定を行う。

 

SetMode(MODE_3 | BG2_ENABLE);

 

で、この分解していくと

0x04000000~0x04000001

に代入する値によってmodeが切り替わるらしい。

 

f:id:rai17321:20180516162221p:plain

 

 

 

 

GBAプログラミング 1日目

はじめに

私は現在大学4年生であり、研究室にも所属しています。

その研究室で扱う研究テーマを

GBAプログラミング

にすることとしました。

 

理由は以下となります。

1.長年ロックマンエグゼ6の解析を行い、GBAアーキテクチャの知識がついた

2.知識がついたことにより、解析ではなく制作目線でも興味が湧いた

3.GBAプログラミングで1からロックマンエグゼを作ってみたい

 

よって、ここから2019年3月ほどまで、GBAプログラミングの勉強を行い、その成果としてGBAソフトの制作を目指します。

 

これからについて

まず、GBAプログラミングの学習を始めます。

幸運なことに、エグゼハックに比べるとチュートリアルや人口が充実していることから大変な苦労はしないと思われます。エグゼハック初期は本当に大変だった・・・。

 

GBAプログラミングを学ぶための学習教材

 

1.GBA develop wiki

GBA develop Wiki

2.GBAプログラミング跡地

GBAプログラミング跡地

3.GBATEK 日本語訳

https://meraman.dip.jp/secret.php?M3DSS_GBATEK

4.WILD ZONE 

WILDZONE -GBA Program-

5.金沢大学

Kanazawa Univ. Information System Design

 

+手元にある「Linuxから目覚めるぼくらのゲームボーイ!」

(偶然研究室においてありました。感謝します。)

https://www.amazon.co.jp/Linux%E3%81%8B%E3%82%89%E7%9B%AE%E8%A6%9A%E3%82%81%E3%82%8B%E3%81%BC%E3%81%8F%E3%82%89%E3%81%AE%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%9C%E3%83%BC%E3%82%A4%EF%BC%81-%E8%A5%BF%E7%94%B0-%E4%BA%99/dp/479732564X

 

特に、GBA develop wiki、GBATEK、Linux本で適度にインプット、アウトプットを繰り返しながら、制作の方に入りたいと思います。

 

Google拡張機能を作ってみる

 

はじめに

開発モチベーションというのは気まぐれなもので、1ヶ月に1度くらいぐんぐんとやる気のでる期間があります。

今がその時で、やけに持続も長いのでいいきっかけとして何か作ろうと考えました。

 

はじめに作ろうとしたのは

ロックマンエグゼ6GBAを読み込んでROM判定をするプログラム

しかし、これは失敗しました。

初めて1から取り組んだC#意味わかんないし、バイト列の検索の掛け方がぐぐってみても高度すぎて5時間位格闘して諦めました。

 

その次に作ろうとして、現在もやっているのが

通販サイトの自動カートインツール

前々から作りたいとは思っていたので、この機会に作ってみることになりました。

 

Chrome拡張機能

liginc.co.jp

 

Javascript

yuuxxxx.hatenablog.com