05.キーを離して,動く方向を変える(2002/03/31作成)

前回は,何かキーを押すと,4角形が動き始めるようにしました。
今回は,最初に押したキーを押しっぱなしの間は横に,キーを放すと下に移動するようにします。
では,OPLを立上げ,以下のように入力しましょう。
今回から,(英語力がないので)REM文に日本語を使ってみました。

PROC keyup:
LOCAL x%,y%
LOCAL t%
LOCAL event&(1)

REM -------Initialize-------
gBOX 160,160
	x%=10
	y%=10
	gAT x%,y%
	gFILL 5,10,0

GET		REM Wait until Any Key is pushed

REM -------MOVE x-------
WHILE x%<=130			
	PAUSE 2
	gFILL 5,10,1
	x%=x%+5
	gAT x%,y%
	gFILL 5,10,0

	REM -------Get KeyUp Event-------
	t%=TESTEVENT			REM イベントが発生したかチェック
	IF t%=-1			REM t&=1なら,次の行に移る。違ったら一番下のENDIFの次に移動
		GETEVENT32 event&(1)	REM イベント情報を取得
		IF event&(1)=&407	REM イベント情報が&407(キーを放した)だったら次の行へ。違ったら,一つ目のENDIFに移動
			BREAK		REM ループの外(ENDWHの下)に移動
		ENDIF
	ENDIF
ENDWH

REM -------MOVE y-------
WHILE y%<=140
	PAUSE 2
	gFILL 5,10,1
	y%=y%+5
	gAT x%,y%
	gFILL 5,10,0
ENDWH

GET
ENDP
もう一歩
・TESTEVENT
イベントが発生しているか,チェックできます。
-1のときは発生,0のときは発生していません。
イベントとは,「キーを押した」とか,「離した」とか,「画面をタップした」とか,いろんな操作のことを言います(と思います)。

・IF...ENDIF
IFに続く条件式が正しいとき,ENDIFまでの処理を行います。
正しくないときは,ENDIFの次の行に移動します。

・GETEVENT32 event&(1)
イベント待ちをして,イベントが発生すると,イベント情報を,続く変数に返します。
event&(1)が変数で,ev&(1)でも,e&(1)でもいいです。
この変数に,キーが押されると「&406」,離されると「&407」が入力されます。
他にも,いろんなイベントに対応しています。

このGETEVENT32,もっといろんな情報を返してくれるのですが,よく分からないので省略します。
すいません。

・BREAK
ループ処理(WHILE...ENDWH)を終了します。
具体的には,ENDWHの次の行に移動します。
ここでは使っていませんが,もう一つのループ処理「DO...UNTIL」でも使えます。

プログラムの流れ
今回は,イベント処理(Get KeyUp Event)に重点を置いて,流れを追ってみます。

最初〜--Initialize--
各種変数の宣言,4角形の描画を行い,「GET」で,キーが押されるまで待ちます。

--MOVE x--
4角形を,右(x方向)に動かします。
ループ処理(WHILE...ENDWH)を用いており,これには「--Get KeyUp Event--」も含まれています。

--Get KeyUp Event--
「t%=TESTEVENT」:イベントが発生したとき,t%に-1を入力します
「IF t%=-1」:「t%=-1」(イベントが発生した)なら次の行に,違ったら2つ目のENDIFに移動します。
「GETEVENT32 event&(1)」:イベント情報を取得します。
「IF event&(1)=&407」:「event&(1)=&407」(キーを放した)なら次の行に,違ったら一つ目のENDIFに移動します。
「BREAK」:ループ処理(WHILE...ENDWH)から抜けます。
「ENDIF」:「IF event&(1)=&407」に対応する
「ENDIF」:「IF t%=-1」に対応する

「ENDWH」:「--MOVE x--」から続く,「WHILE x%<=130」に対応する

キーを放さなくても,x%が130より大きくなれば,ENDWHの次の行に移動します。

--MOVE y--
4角形を,下(y方向)に動かします。

IF文は,OPLに限らず,変数,ループに並ぶ重要なものです。
今回のように,IF分の中にIF文を入れること(入れ子)が可能です。
IF...ENDIFの中に,IFに続く条件式が正しくないときに実行する,ELSEIF,ELSEというコマンドも使えます。
これについては,ここでは解説しません。
OPL以外のプログラムでもよく使われるものなので,調べてみてください。


04.キーを押して,移動開始<-->06.4角形の表示位置をランダムに決定
OPLはじめの一歩
最初のページ