#include "sgl.h"
void slInitEvent( void );
void - 何も与えません。
void - 何も返しません。
イベント、ワーク管理用のバッファを初期化します。イベントは64個、
ワークは256個が用意されます。
void *eventtbl[] = {
init_camera,
init_player1,
init_player2,
init_enemyctrl
};
void InitGame(){
void **evrdptr;
EVENT *evptr;
int cnt;
slInitEvent(); /* イベント管理用変数の初期化 */
evrptr = eventtbl;
for( cnt = sizeof( eventtbl ) / sizeof( void * ) ; cnt-- > 0 ; ) {
evptr = slSetEvent( *evrptr++ );
}
slSetSprTVMode( TV_320x224 );
}
void Game(){
slExecuteEvent(); /* イベントの実行 */
slSynch(); /* ポリゴンデータの出力とビデオ表示同期 */
}
イベント、ワーク用のRAM自体は初期化されないので、領域を取り出した時に、
ユーザープログラムが初期化してください。
slGetEvent |
slSetEvent |
slSetEventNext |
slCloseEvent |
slReturnEvent |
slExecuteEvent |
slGetWork |
slReturnWork |
#include "sgl.h"
EVENT *slGetEvent( void );
void - 何も与えません。
EVENT* - 取得したイベント用RAMのアドレスを示すポインタ。
イベント用に割り付けられたRAM領域を取り出し、そのポインタを返します。
void func() {
/* This is executed in event loop. */
}
EVENT *evnt1, *evnt2;
evnt1 = slGetEvent();
evnt2 = slSetEvent( func );
evnt2->user = ( Uint8 * )evnt1;
128バイトの領域で、ユーザーが自由に使用できます。64個分用意されていますが、
使い切っている場合にはNULLコードを返します。
slInitEvent |
slSetEvent |
slSetEventNext |
slCloseEvent |
slReturnEvent |
EventTop |
EventCount |
#include "sgl.h"
void *( func )( void );
EVENT *slSetEvent( func );
void *( func )( void ) - イベントに登録する実行関数。
EVENT* - 取得したイベントへの EVENT型ポインタ。
イベントを取り出し、実行リストの末尾に追加します。この際、指定された関数を
実行関数として登録します。
slInitEvent();
slSetEvent( user_func1 );
slSetEvent( user_func2 );
:
while( -1 ) {
:
slExecuteEvent();
slSynch();
}
128バイトの領域ですが、先頭の16バイトはシステムにより使用されます。
イベントが残っていない場合には NULLコードを返します。
slInitEvent |
slSetEvent |
slSetEventNext |
slCloseEvent |
slReturnEvent |
slExecuteEvent |
#include "sgl.h"
EVENT *evnt;
void *( func )( void );
EVENT *slSetEventNext( evnt, func );
EVENT *evnt - 登録するイベントの前のイベント。
void *( func )( void ) - 登録する実行関数。
EVENT* - 取り出されたイベントを示す、 EVENT型構造体へのポインタ。
イベントを取り出し、指定されたイベントの次に実行されるように、実行リスト
に追加します。この際、指定された関数を実行関数として登録します。
void func() {
/* This is executed in event loop. */
}
ss_main() {
EVENT *evnt;
evnt = slGetEvent();
evnt->work = ...
:
slSetEventNext( evnt, func );
:
128バイトの領域ですが、先頭の16バイトはシステムにより使用されます。
イベントが残っていない場合には NULLコードを返します。
slInitEvent |
slSetEvent |
slGetEvent |
slCloseEvent |
slReturnEvent |
slExecuteEvent |
#include "sgl.h"
EVENT *evnt;
void slReturnEvent( evnt );
EVENT *evnt - 解放を要求するイベントを表す EVENT型構造体へのポインタ。
void - 何も返しません。
実行リストに登録されていないイベントをシステムに返す。
EVENT *evnt;
evnt = slGetEvent();
slReturnEvent( evnt );
実行リストに登録されているイベントに対して、この関数を実行するとリストに
登録されたままになるため、実行は継続されます。戻されたポインタはシステムの
バッファに再登録されますが、この際に登録済みであってもチェックされません
ので、同じポインタを複数回返却すると、この後実行される、
slGetEvent()、slSetEvent()、slSetEventNext()
において不具合が発生します。
slInitEvent |
slGetEvent |
slSetEvent |
slSetEventNext |
slCloseEvent |
EventLast |
#include "sgl.h"
EVENT *evnt;
void slCloseEvent( evnt );
EVENT *evnt - 削除するイベントを表す EVENT型構造体へのポインタ。
void - 何も返しません。
実行リストに登録されたイベントをリストから切り離し、システムに返します。
また、ワークがセットされている場合、これらも戻します。
EVENT *evnt;
evnt = slSetEvent( user_func );
:
slCloseEvent( evnt );
実行リストに登録されていないイベントを指定すると、リスト情報が正しくない
ため、不当なイベントに対して、リスト変更処理をすることになり、予測できない
アドレスに対する書き込みが発生し、最悪の場合、CPUが停止する場合があります。
戻されたポインタはシステムのバッファに再登録されますが、この際に登録済みで
あってもチェックされないので、同じポインタを複数回返却すると、この後
実行される、
slGetEvent()、slSetEvent()、slSetEventNext()
において不具合が発生します。
slInitEvent |
slGetEvent |
slSetEvent |
slSetEventNext |
slReturnEvent |
#include "sgl.h"
void slExecuteEvent( void );
void - 何も与えません。
void - 何も返しません。
実行リストに登録されたイベントを先頭から順に実行します。
slInitEvent();
slSetEvent( ... );
:
while( -1 ) {
slExecuteEvent();
slSynch();
}
メインループごとに実行してください。
slInitEvent |
slSetEvent |
slSetEventNext |
slSynch |
slInitSynch |
EventTop |
EventNow |
EventCount |
#include "sgl.h"
WORK *slGetWork( void );
void - 何も与えません。
WORK* - 割り当てられたワークエリアを示す WORK型構造体へのポインタ。
ワーク用に割り付けられたRAM領域を取り出し、そのポインタを返します。
WORK *work;
EVENT *evnt;
work = slGetWork();
evnt = slSetEvent();
evnt->work = work;
ワークは64バイトの領域で、先頭の4バイトをリスト用のポインタとして、
システムで使用します。残りの60バイトはユーザーが自由に使用できます。
EVENT構造体のWORKに ポインタをセットしていればイベントをクローズする
場合に、システムに返却されます。
slInitEvent |
slReturnWork |
WorkCount |
#include "sgl.h"
WORK *wk;
void slReturnWork( wk );
WORK *wk - 解放するワークRAMを表す、WORK構造体のポインタ。
void - 何も返しません。
ワークとして使用していたRAM領域をシステムに戻す。
WORK *work;
work = slGetWork();
:
slReturnWork( work );
戻されたポインタはシステムのバッファに再登録されますが、この際に登録済みで
あってもチェックされないので、同じポインタを複数回返却すると、この後に
実行される slGetWork() において不具合が発生します。
slInitEvent |
slGetWork |
WorkCount |
#include "sgl.h"
extern EVENT EventBuf []; /* buffer for Event use */
slInitEvent |
slGetEvent |
slReturnEvent |
#include "sgl.h"
extern WORK WorkBuf []; /* buffer for Work use */
slGetWork |
#include "sgl.h"
extern EVENT* RemainEvent[] ; /* Remain Event address buffer */
slSetEvent |
slSetEventNext |
slReturnEvent |
slExecuteEvent |
#include "sgl.h"
extern WORK* RemainWork[] ; /* Remain Work address buffer */
slReturnWork |