単語の説明
FFTはノベルゲームの新たな表現手法であります。
今までの作成されてきたノベルゲームの多くは、文字を表示する部分がボトムか全体かどちらかに
定められているものがほとんどでした。
FFTでは今までのノベルゲームなどの機能に漫画などのフキダシ、ネーム当の特徴を追加したものです。
今までのノベルゲームでは、
物語と画像の関係を単純な対応付けによって表現することが可能であった、もちろん単純な対応付けによって
表現されるものばかりではないが、次のような状況を考えてみよう。
たとえば、ファンタジーの主人公などは怒こったり悲しんだり挫折をしたりを繰り返して、
だんだんと成長をし最後には多分あくの親玉を倒したりしてゲームを終える。
ずぼらなゲームについて考えてみよう、キャラの感情よって表示するイメージを用意しておく、
それらを主人公の感情の起伏に応じて切り替えていけばよいわけである。
かくしてゲームは完成をする
しかし、FFTではそのような方法は認められない。そもそも、描画の表現に大部分を
おくことにアイデンティティを持つために..。
目標
FFTノベルゲーム用のスクリプトを作ることで、プログラムのデザイン能力を高める。
そして、FFTに特化したプログラム手法を確立する。
今回の課題
フラッシュのムービークリップのようなものを作成することから始める。ムービークリップには
キーイベントや描画イベントなど、イベントに対応した処理が要求される。
以下、実現のため第一にイベントを受け取るコンポ−ネント作成することからはじめる
win32apiを使用した場合、グローバルスコープ上のものしか扱うことができないとい制限があります。
詳しく説明すると、ウィンプロージャーはstaticな領域の物いがいは使ってはいけないという制限があります。
つまりクラスの関数(メソッド)をウインドウプロージャーに渡すなんてできません。 (多分?)
JAVAなどのように、クラスひとまとめに使えるほうが親しみ深いと思うので、少し手を加えてみることにしましょう。
今日やること
まずは、ウンドウを作ってみる。
とりあえず、Wisdamsoftを見ながら書き書きする。
#include<stdio.h>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM w,LPARAM l)
{
if(msg == WM_LBUTTONUP){
MessageBox(hwnd,TEXT("End"),TEXT("true"),MB_OK);
PostQuiteMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,w,l);
}
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
//ウインドウ登録する
WNDCLASS winc;
winc.style = CS_HREDRAW;
winc.lpfnWndProc= WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInst;
winc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("start");
if(!RegisterClass(&winc)) return 0;
//ウインドウを作る
HWND hwnd = CreateWindow(
TEXT("start") , TEXT("Start") ,
WS_CAPTION ,
100 , 100 , 200 , 200 , NULL , NULL ,
hInst , NULL);
if(hwnd == NULL)
{
printf("Error hwnd");
return 0;
}
ShowWindow(hwnd,SW_SHOW);
MSG msg;
while(true){
GetMessage(&msg,NULL,0,0);
DispatchMessage(&msg);
}
return 0;
}
これをクラスに直したい分けです。
クラスに直す
ということで 手を加えます。Frameクラスの参照を保持するstaticな領域を用意しておき。
staticな領域がウィンプロージャーとFrameクラスの橋渡しをするというつくりにします。
以下ソース
#include
class Frame
{
private:
WNDCLASS winc;
HWND hwnd;
MSG msg;
public :
Frame();
void show();
int EventRoop();
int onClick();
~Frame();
};
typedef Frame *lpFrame;
static int database_num = 0;
static lpFrame database[100];
static void add(lpFrame obj)
{
if(database_num <= 100)
{
database[database_num] = obj;
database_num++;
}
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM w,LPARAM l)
{
if(msg == WM_LBUTTONUP){
database[0]->onClick();
return 0;
}
return DefWindowProc(hwnd,msg,w,l);
}
#include"frame.h"
Frame::Frame()
{
//スタテックな領域に参照を保持しておく
add(this);
//ウインドウを登録する
winc.style = CS_HREDRAW;
winc.lpfnWndProc= WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = GetModuleHandle(NULL);
winc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("start");
//うまくできたか確認を取る
if(!RegisterClass(&winc)) exit(0);
//ウインドウを作る
hwnd = CreateWindow(
TEXT("start") , TEXT("Start") ,
WS_CAPTION ,
100 , 100 , 200 , 200 , NULL , NULL ,
GetModuleHandle(NULL) , NULL);
}
Frame::~Frame()
{
;
}
void Frame::show()
{
ShowWindow(hwnd,SW_SHOW);
}
int Frame::onClick()
{
MessageBox(hwnd,TEXT("End"),TEXT("true"),MB_OK);
PostQuitMessage(0);
return 0;
}
int Frame::EventRoop()
{
if(NULL != GetMessage(&msg,NULL,0,0))
{
DispatchMessage(&msg);
return 1;
}else
{
return -1;
}
}
int PASCAL WinMain(HINSTANCE , HINSTANCE, LPSTR, int)
{
Frame fra;
fra.show();
while(0 <= fra.EventRoop()){;}
return 0;
}
うむ、何とかできそうな予感!!