・スピ魅とは?
その昔,Windows3.1の MS-Excel5にて RPGを製作すると言う暴挙を行なった(^^;
CPUも 80486SX 33Mhzと非常に遅くて,移動するだけでも数秒を要した。
その状態で製作したスピ魅は,その後様々な言語を習得する練習台として使っている。
詳しくは,専用ページがあるので,そちらを見て下さい。・仕様をまとめてみよう
まずは簡単に仕様を考えてみる。
画面は,左上に移動マップ,その下にメッセージウィンドウ,右にステータス表示……と言うオーソドックスな RPG画面構成だ。
次に必要な関数を洗い出してみる。
・マップキャラ表示関数
・メッセージ表示関数
・ボタン入力関数・早速作ってみよう
間単そうなメッセージ表示関数から作ってみましょう。
<メッセージ表示関数の仕様>
・文字列を送ると,最下欄に表示する
・既に表示されている文字列を,1つ上の行に送る
・3行を越えたら削除する
void rMsgText(char *hMoji){
static char sMoji[3][32];
/*文字を1行上に送る*/
strcpy(sMoji[0], sMoji[1]);
strcpy(sMoji[1], sMoji[2]);
/*最下行に送った文字列をセット*/
strcpy(sMoji[2], hMoji);
/*文字表示*/
text_put_string(0, 0, sMoji[0]);
text_put_string(0, 1, sMoji[1]);
text_put_string(0, 2, sMoji[2]);
}
思いっきりベタなコーディングですね(^^;
最初はこれで良いのです。バグの付け入るスキが無い方が好ましいからです。
文字が何行表示出来るのか不明な為,とりあえず上部にくっつけて表示させる事にした。
#include <sys/bios.h>
#include <string.h>
void main(void){
text_screen_init();
rMsgText("1");
rMsgText("2");
rMsgText("3");
key_wait();
}
予想通り,うまく表示出来た(^_^)・文字表示について
色々試したところ,以下の事が分かった。
表示範囲は,横28文字,縦18文字 (text_put_string関数の表示位置指定が31文字まであるのが謎)
大抵の漢字は表示出来るが,半角英数字は濃く表示され,半角カナは表示されない。・メッセージを枠で囲ってみよう
グラフィックの基本は,8×8のキャラクタを作成して,それを画面に並べるのらしい。
パソコンユーザーにはなかなか理解が難しいところだ。
まずは横線キャラクタを1つ表示してみよう
void rWaku(void){
/*キャラクタ定義*/
#define waku1_width 1
#define waku1_height 1
unsigned short bmp_waku1[] = {
0x0000, 0x0000, 0x0000, 0xFF00, 0x00FF, 0x0000, 0x0000, 0x0000,
};
/*キャラクタ番号定義*/
unsigned char chara_waku1[] = {0,};
/*キャラクタ番号0にセット*/
font_set_colordata(0, waku1_width * waku1_height, bmp_waku1);
/*キャラクタを表示*/
screen_set_char(SCREEN1, 0, 0, waku1_width, waku1_height, chara_waku1);
}
とりあえず,左上隅に表示されるようにしてみました。
これに先程の文字表示を組み合わせて,コーディングします。
#include <sys/bios.h>
#include <string.h>
void main(void){
text_screen_init();
rMsgText("1");
rMsgText("2");
rMsgText("3");
rWaku();
key_wait();
}
実行してみると……何も表示されない(;_;)
そう言えばスクリーンは2面あるので,
screen_set_char(SCREEN2, 0, 0, waku1_width, waku1_height, chara_waku1);
としてみたが,やっぱり表示されない(;_;)
キャラクタ0番がまずいのかも知れないので,キャラクタ50にしてみた。
すると,バケバケのキャラクタが画面上に2つ表示された。
なんじゃこりゃ?(^^;unsigned short bmp_waku1[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
};
としてもバケバケになるので,恐らく定義を行なっている場所に問題が有ると予想した。
サンプルソースを見ると,関数の外で必ず定義を行なっている。
/*キャラクタ定義*/
#define waku1_width 1
#define waku1_height 1
unsigned short bmp_waku1[] = {
0x0000, 0x0000, 0x0000, 0xFF00, 0x00FF, 0x0000, 0x0000, 0x0000,
};
/*キャラクタ番号定義*/
unsigned char chara_waku1[] = {50,};
void rWaku(void){
/*キャラクタ番号0にセット*/
font_set_colordata(50, waku1_width * waku1_height, bmp_waku1);
/*キャラクタを表示*/
screen_set_char(SCREEN1, 0, 0, waku1_width, waku1_height, chara_waku1);
}
とすると,うまく表示されるはずだ。
実行してみると,うまく表示された……が,2つ表示されている。
何となくキャラクタを0に戻したところ,関係無い1つは消えた(なぜ?(^^;)・まとめ
試行錯誤を行ないながらだったので,どれが正しいソースなのか分からなくなった。
最後に,メッセージウィンドウ表示プログラムソースを書いておきます。
#include <sys/bios.h>
#include <string.h>
/*キャラクタ定義*/
unsigned short bmp_waku0[]={0x0000, 0x0000, 0x0000, 0x0100, 0x0601, 0x0806, 0x0804, 0x1008};
unsigned short bmp_waku1[]={0x0000, 0x0000, 0x0000, 0xFF00, 0x00FF, 0x0000, 0x0000, 0x0000};
unsigned short bmp_waku2[]={0x0000, 0x0000, 0x0000, 0x8000, 0x6080, 0x1060, 0x1008, 0x0804};
unsigned short bmp_waku3[]={0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804};
unsigned short bmp_waku4[]={0x0804, 0x1008, 0x1008, 0x6010, 0x8060, 0x0080, 0x0000, 0x0000};
unsigned short bmp_waku5[]={0x0000, 0x0000, 0x0000, 0x0000, 0xFF00, 0x00FF, 0x0000, 0x0000};
unsigned short bmp_waku6[]={0x1008, 0x0804, 0x0804, 0x0600, 0x0106, 0x0001, 0x0000, 0x0000};
unsigned short bmp_waku7[]={0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008, 0x1008};
/*キャラクタ番号定義*/
unsigned chara_waku0[]={0};
unsigned chara_waku1[]={1};
unsigned chara_waku2[]={2};
unsigned chara_waku3[]={3};
unsigned chara_waku4[]={4};
unsigned chara_waku5[]={5};
unsigned chara_waku6[]={6};
unsigned chara_waku7[]={7};
void rMsgText(char *hMoji){
static char sMoji[3][33];
/*文字を1行上に送る*/
strcpy(sMoji[0], sMoji[1]);
strcpy(sMoji[1], sMoji[2]);
/*最下行に送った文字列をセット*/
strcpy(sMoji[2], hMoji);
/*文字表示*/
text_put_string(1, 14, sMoji[0]);
text_put_string(1, 15, sMoji[1]);
text_put_string(1, 16, sMoji[2]);
}
void rWaku(void){
int i;
/*キャラクタフォント・セット*/
font_set_colordata(0, 1, bmp_waku0);
font_set_colordata(1, 1, bmp_waku1);
font_set_colordata(2, 1, bmp_waku2);
font_set_colordata(3, 1, bmp_waku3);
font_set_colordata(4, 1, bmp_waku4);
font_set_colordata(5, 1, bmp_waku5);
font_set_colordata(6, 1, bmp_waku6);
font_set_colordata(7, 1, bmp_waku7);
/*キャラクタを表示*/
screen_set_char(SCREEN2, 0, 13, 1, 1, chara_waku0);
for(i=1; i < 17; i++){
screen_set_char(SCREEN2, i, 13, 1, 1, chara_waku1);
}
screen_set_char(SCREEN2, 17, 13, 1, 1, chara_waku2);
for(i=14; i < 17; i++){
screen_set_char(SCREEN2, 17, i, 1, 1, chara_waku3);
}
screen_set_char(SCREEN2, 17, 17, 1, 1, chara_waku4);
for(i=16; i > 0; i--){
screen_set_char(SCREEN2, i, 17, 1, 1, chara_waku5);
}
screen_set_char(SCREEN2, 0, 17, 1, 1, chara_waku6);
for(i=16; i > 13; i--){
screen_set_char(SCREEN2, 0, i, 1, 1, chara_waku7);
}
}
void main(void){
text_screen_init();
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rMsgText("1234567890123456");
rWaku();
key_wait();
}