・スピ魅 PART2とは?
PART1のままだとアレなので,もう少しRPGらしくしようと考えた。
しかし Windows3.1の MS-Excel5では,出来る事が限られる。
その出来る事を集結させて,何とかRPGらしくしようと考えて製作したものです。
そういう趣旨で製作したものですので,今回もその趣旨を取り入れます。
PART1よりも,より研究を行い,もっとRPGらしくしたいと思います。
ちなみに,PART1のソースはスピ魅コーナーにあります。・仕様をまとめてみよう
PART1から,下記の点を変更したいと思います。
・もっとちゃんと枠を作る
・パレットを操作して,もう少し発色を工夫する
・サイズを縮められないか工夫する
・まずは画面の工夫から
前回に失敗したところですが,枠のフォントを四角形しか考えずに作成した為,変になってしまいました(^^;
そこで今回は先に必要な枠キャラクタの種類を洗い出します。
0.なし
1.横線
2.縦線
3.左上隅
4.右上隅
5.左下隅
6.右下隅
7.左下隅と左上隅がくっついた形
8.右下隅と右上隅がくっついた形
言葉で書くと非常に分かり辛いのですが,要するに角の丸まった四角枠を,ピッタリとくっつけた状態で配置したいのです。
これから行なう事は,枠表示関数の作成です。
画面全体を上記表の数値で表し,それに合わせてキャラクタを表示します。
そうする事で,画面デザインが容易になりますね(^_^)
unsigned char wd[]={
3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 4,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 7, 1, 1, 1, 1, 1, 1, 1, 1, 8,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,
5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 5, 1, 1, 1, 1, 1, 1, 1, 1, 6
};
マップデータの定義を,エクセルなどで作成します。
このくらいなら,直接書いた方が早いでしょうか?
画面全体を定義しますので,横は28キャラ,縦は18キャラです。
/*枠キャラクタ定義*/
unsigned short bmp_waku1[]={0x0000, 0x0000, 0x0000, 0xFF00, 0x00FF, 0x0000, 0x0000, 0x0000};
unsigned short bmp_waku2[]={0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804};
unsigned short bmp_waku3[]={0x0000, 0x0000, 0x0000, 0x0000, 0x0300, 0x0403, 0x0402, 0x0804};
unsigned short bmp_waku4[]={0x0000, 0x0000, 0x0000, 0x8000, 0x6080, 0x1060, 0x1008, 0x0804};
unsigned short bmp_waku5[]={0x0804, 0x0402, 0x0402, 0x0300, 0x0003, 0x0000, 0x0000, 0x0000};
unsigned short bmp_waku6[]={0x0804, 0x1008, 0x1008, 0x6010, 0x8060, 0x0080, 0x0000, 0x0000};
unsigned short bmp_waku7[]={0x0804, 0x0402, 0x0601, 0x0100, 0x0300, 0x0403, 0x0402, 0x0804};
unsigned short bmp_waku8[]={0x0804, 0x1008, 0x3008, 0xC030, 0x6080, 0x1060, 0x1008, 0x0804};
/*枠キャラクタ番号定義*/
unsigned chara_waku1[]={129};
unsigned chara_waku2[]={130};
unsigned chara_waku3[]={131};
unsigned chara_waku4[]={132};
unsigned chara_waku5[]={133};
unsigned chara_waku6[]={134};
unsigned chara_waku7[]={135};
unsigned chara_waku8[]={136};
枠データを定義します。関数の外に記述するのでしたね?
前回と若干データを変えています。
特にキャラクタ番号は,スプライトで利用出来ない 129番以降に置く事にしました。
void rWakuSet(void){
/*キャラクタ設定*/
font_set_colordata( 129, 1*1, bmp_waku1);
font_set_colordata( 130, 1*1, bmp_waku2);
font_set_colordata( 131, 1*1, bmp_waku3);
font_set_colordata( 132, 1*1, bmp_waku4);
font_set_colordata( 133, 1*1, bmp_waku5);
font_set_colordata( 134, 1*1, bmp_waku6);
font_set_colordata( 135, 1*1, bmp_waku7);
font_set_colordata( 136, 1*1, bmp_waku8);
}
フォントに先に定義したデータをセッティングします。
特に説明は不要ですね。
void rWakuDisp(unsigned char hMode, int x, int y){
/*枠キャラクタを表示*/
switch (hMode){
case 1: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku1); break;
case 2: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku2); break;
case 3: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku3); break;
case 4: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku4); break;
case 5: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku5); break;
case 6: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku6); break;
case 7: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku7); break;
case 8: screen_set_char(SCREEN1, x, y, 1, 1, chara_waku8); break;
}
}
各枠キャラクタを指定位置に表示する関数です。
今後の事を考えて,スクリーン1に表示したいと思いました。
そもそも透過処理を行なわないキャラクタを,スクリーン2に表示するのはおかしいですからね。
void rWakuView(void){
/*枠表示*/
int x, y;
for(y=0; y < 18; y++){
for(x=0; x < 28; x++){
if (wd[x + y * 28] != 0){ rWakuDisp(wd[x + y * 28], x, y); }
}
}
}
予め定義しておいた画面マップを元に,枠キャラクタをセットします。
0以外の時に枠表示処理を行ないます。
・ソースを書き替える
スピ魅 PART1を下記のように書き替えて下さい。
unsigned short bmp_waku〜を上記定義に置き換え
unsigned chara_waku〜も上記定義に置き換え
unsigned char wd[]=〜定義を追加
rWaku関数を削除し,上記 rWakuSet, rWakuDisp, rWakuView関数を追加
main関数を下記のものに置き換え
void main(void){
unsigned short hRet;
int x, y;
int i;
display_control(DCM_SCR2 | DCM_SPR);
font_set_colordata(100, 1, bmp_space);
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100);
rWakuSet();
rWakuView();
rSetMapC();
gHidukeFlag=0;
for(i=0; i < cSinarioMax; i++){
gSinarioFlag[i]=0;
}
x=38;
y=19;
for ( ; ; ){
rMapView(x, y);
rSinario(x, y);
hRet=rKeyin();
switch (hRet){
case cBOT_X1:
if (md[(y - 1) * 50 + x] % 2 == 0)
y--;
break;
case cBOT_X2:
if (md[y * 50 + (x + 1)] % 2 == 0)
x++;
break;
case cBOT_X3:
if (md[(y + 1) * 50 + x] % 2 == 0)
y++;
break;
case cBOT_X4:
if (md[y * 50 + (x - 1)] % 2 == 0)
x--;
break;
case cBOT_START:
goto EndJump;
break;
}
}
EndJump:;
}
・スクリーン1を表示したい
枠が全く表示されない(;_;)
なぜ? かと言うと,スクリーン1を表示出来るようにしていないからだ。
まずは,スクリーン1を表示可能にする。
display_control(DCM_SCR1 | DCM_SCR2 | DCM_SPR);
問題は,
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100);
の部分だ。これがあると,スクリーン1が見えないし,無くすとゴミが残る(;_;)
試行錯誤の結果,透過パレットを割り当てる事で,スクリーン1が見える状態で初期化出来る事に気が付きました。
同時に,スクリーン1も空白キャラクタを敷き詰めて初期化します。
screen_fill_char(SCREEN1, 0, 0, 28, 18, 100);
screen_fill_char(SCREEN2, 0, 0, 28, 18, 100 + 2048);
こんな感じですね。