空想曲線

吉里吉里2/KAG3でのゲーム制作に使える小ネタ置き場。ゲーム用素材も置いてます。

吉里吉里/KAG:パネル当てを作る 第2回  

2012-05-12
2017-06-16
cm0
tb0

本題に入る前に、コンプガチャ問題についてちょっとだけ。

・青少年の課金限度額設定
・通常ガチャの確率表示

これも何とかして欲しいところです。
あまり危ない橋を渡ってると風営法適用されちゃうぞ。

さて、本題に入ります(・ω・)ノ

吉里吉里でパネル当てを作る 第2回

今回からスクリプトをモリモリ打っていきます。
途中で区切ると分からなくなるので、最後まで突っ走ることにしました。

では、れっつごーε≡≡ヘ( ´Д`)ノ



1.レイヤ枚数の設定


*001
[ cm ]
; 使用するレイヤの枚数を指定します
[ laycount messages=2 layers=3 ]



2.メッセージレイヤの設定


*002
; メッセージレイヤ0はグラフィカルボタン用を配置する用に使います
; サイズは画面サイズと同じ、各マージンは0、不透明度は0、可視

[ position layer=message0 top=0 left=0 width=640 height=480
marginb=0 marginl=0 margint=0 marginr=0 opacity=0 visible=true ]



3.マクロの設定


*macro
; 惜しい時に表示するしろねこ画像、レイヤ1使用
[ macro name="mes" ]
;しろねこのカットインをレイヤ1に読み込む
[ image storage=cut_near layer=1 top=0 left=0 opacity=255 visible=true ]
; クリックしたら*main(パネル選択のラベル)へジャンプ
[ click target=*main ]
[ endmacro ]


; 勝敗が決まったときのカットイン用、レイヤ2使用
[ macro name="result" ]
; レイヤ1を解放
[ freeimage layer=1 ]
; カットイン画像を不透明度0で読み込み
[ image storage=%sto layer=2 top=%t left=0 opacity=0 visible=true ]
; 動かしながら不透明度を255に
[ move layer=2 path=(0,0,255) time=100 ]
[ wm ]

; クリックすると*re(リプレイ確認のラベル)へジャンプ
[ click target=*re ]
[ endmacro ]



4.変数設定&リセット(リプレイ時の戻り先)


*003
; パネルの状態:0は何もなし、1が当たり、2がハズレ
[ eval exp="tf.panel = []" ]
[ eval exp="tf.panel = [ 0,0,0,0,0,0,0,0,0 ]" ]


; パネルの表面画像:添字に応じて読み込む画像が変わる
[ eval exp="tf.panelImg = []" ]
[ eval exp="tf.panelImg = [ 'panel','atari','hazure' ]" ]


; パネルが開いているかどうかのチェック用:0なら開いてない、1なら開いてる
[ eval exp="tf.panelopen = []" ]
[ eval exp="tf.panelopen = [ 0,0,0,0,0,0,0,0,0 ]" ]


; 何回目の挑戦かカウントする用。3になったらアウト
[ eval exp="tf.count = 0" ]

; プレイヤーが選んだボタンがどれかを調べる用
[ eval exp="tf.sel = 0" ]



5.あたりとハズレをランダムで選ぶ


*004
; あたりパネルの番号(添字)をランダムで選びます
; 添字は0スタートなのでパネルの番号と一つずつズレています
; tf.atari=0 なら、あたりパネルは1番となります

[ eval exp="tf.atari = intrandom(0,8)" ]

*005
; ハズレの番号(添字)をランダムで選びます
[ eval exp="tf.hazure = intrandom(0,8)" ]

; あたりとハズレの番号が同じだったら、もう一度ハズレを選びます
[ if exp="tf.hazure == tf.atari" ]
[ jump target=*005 ]
[ else ]

; 重複していなければ、配列変数 tf.panel [ i ] にあたりとハズレの数値を代入します
[ eval exp="tf.panel[tf.atari] = 1" ]
[ eval exp="tf.panel[ tf.hazure ] = 2" ]
[ jump target=*006 ]
[ endif ]



6.画像のリセットと読み込み


*006
[ cm ]
; 前景レイヤを全て解放します
[ freeimage layer=0 ]
[ freeimage layer=1 ]
[ freeimage layer=2 ]


; ベースレイヤに背景画像を読み込みます
[ image storage=panelbase layer=base ]

; 前景レイヤ0に300x300の透明画像を読み込みます
; 透明画像なので visible=true にしてても見えません

[ image storage=empty300 layer=0 top=90 left=180 visible=true ]

; パネルの画面更新ルーチンを呼び出します(詳しくはコール先で)
[ call target=*sub ]

何をしてるかというと、こういうことをしています。
ss_20120508_01.jpg



7.グラフィカルボタンの設置


*main
; 1番パネル用のボタンの表示位置
[ locate x=180 y=90 ]
; この位置にあるパネルが開いていなければ
[ if exp="tf.panelopen[0] == 0" ]
; グラフィカルボタンを設置します
; クリックすると「パネルを選んだ&パネルを開いた」フラグが立ちます
; ジャンプ先は*ck(選んだパネルの中身チェックラベル)です

[ button graphic=btn_waku exp="tf.panelopen[0]=1,tf.sel=0" target=*ck ]
[ endif ]


; 他のボタンも同じように配置していきます
[ locate x=280 y=90 ]
[ if exp="tf.panelopen[1] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[1]=1,tf.sel=1" target=*ck ]
[ endif ]

[ locate x=380 y=90 ]
[ if exp="tf.panelopen[2] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[2]=1,tf.sel=2" target=*ck ]
[ endif ]

[ locate x=180 y=190 ]
[ if exp="tf.panelopen[3] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[3]=1,tf.sel=3" target=*ck ]
[ endif ]

[ locate x=280 y=190 ]
[ if exp="tf.panelopen[4] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[4]=1,tf.sel=4" target=*ck ]
[ endif ]

[ locate x=380 y=190 ]
[ if exp="tf.panelopen[5] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[5]=1,tf.sel=5" target=*ck ]
[ endif ]

[ locate x=180 y=290 ]
[ if exp="tf.panelopen[6] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[6]=1,tf.sel=6" target=*ck ]
[ endif ]

[ locate x=280 y=290 ]
[ if exp="tf.panelopen[7] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[7]=1,tf.sel=7" target=*ck ]
[ endif ]

[ locate x=380 y=290 ]
[ if exp="tf.panelopen[8] == 0" ]
[ button graphic=btn_waku exp="tf.panelopen[8]=1,tf.sel=8" target=*ck ]
[ endif ]


; プレイヤーがボタンを押すまでぼーっと待ちます( ゚д゚)
[ s ]



8.プレイヤーがパネルを選んだ


*ck
[ cm ]
; プレイヤーが選んだパネルを開きます
;ここでは画像更新のサブルーチンを利用します

[ call target=*sub ]
; 挑戦回数を+1します
[ eval exp="tf.count++" ]
; しろねこカットインを消しておきます
[ freeimage layer=1 ]



9.パネルの中身チェック


*ck2
; 選んだパネルがハズレだったら *gameover へジャンプ
[ if exp="tf.panel[ tf.sel ] == 2" ]
[jump target=*gameover]

; 選んだパネルが当たりだったら *gameclear へジャンプ
[ elsif exp="tf.panel[tf.sel] == 1" ]
[ jump target=*gameclear ]

; 挑戦回数が3回になっていたら *timeover へジャンプ
[ elsif exp="tf.count == 3" ]
[ jump target=*timeover ]
[ else ]


; 上記のいずれにも当てはまらない場合は
; 選んだパネルの上下左右に当たりがあるかどうかをチェックします

; 1番を選んだ&2か4のどちらかに当たりがあれば、しろねこを表示します

[ if exp="tf.sel==0 && (tf.panel[1]==1 || tf.panel[3] == 1)" ]
[ mes ]


; 2番以降も同じように調べていきます。頭の悪い書き方に悶絶すればいい。
[ elsif exp="tf.sel==1 && (tf.panel[0]==1 || tf.panel[2]==1 || tf.panel[4]==1)" ]
[ mes ]
[ elsif exp="tf.sel==2 && (tf.panel[1]==1 || tf.panel[5]==1)" ]
[ mes ]

[ elsif exp="tf.sel==3 && (tf.panel[0]==1 || tf.panel[4]==1 || tf.panel[6]==1)" ]
[ mes ]

[ elsif exp="tf.sel==4 && (tf.panel[1]==1 || tf.panel[3]==1 || tf.panel[5]==1 || tf.panel[7]==1)" ]
[ mes ]

[ elsif exp="tf.sel==5 && (tf.panel[2]==1 || tf.panel[4]==1 || tf.panel[8]==1)" ]
[ mes ]

[ elsif exp="tf.sel==6 && (tf.panel[3]==1 || tf.panel[7]==1)" ]
[ mes ]

[ elsif exp="tf.sel==7 && (tf.panel[4]==1 || tf.panel[6]==1 || tf.panel[8]==1)" ]
[ mes ]

[ elsif exp="tf.sel==8 && (tf.panel[5]==1 || tf.panel[7]==1)" ]
[ mes ]

[ else ]
[ endif ]


; 全部終わったら *main に戻ります
[ jump target=*main ]

; 閉じるのを忘れない
[ endif ]



10.結果を表示する


▼ハズレを引いた
*gameover
[ cm ]
[ result sto=cut_lose t=-100 ]
[ s ]


▼あたりを引いた
*gameclear
[ cm ]
[ result sto=cut_win t=100 ]
[ s ]


▼挑戦回数が3回になった
*timeover
[ cm ]
[ result sto=cut_timeover t=-100 ]
[ s ]



11.リプレイの確認


*re
[ cm ]
; YesNoダイアログを表示
[ eval exp="tf.replay = askYesNo('もう一回やる?')" ]
; 「はい」を選んだら*003へジャンプ
[ if exp="tf.replay == 1" ]
[ jump target=*003 ]
[ else ]

; 「いいえ」を選んだらウィンドウを閉じる(終了確認なし)
[ eval exp="kag.closeByScript(%[ask:false])" ]
[ endif ]
[ s ]



12.パネル画像の更新サブルーチン


*sub
[ pimage dx= 0 dy= 0 storage="&tf.panelImg[tf.panel[0]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[0]==1 ? 255 : 0"]
[ pimage dx=100 dy= 0 storage="&tf.panelImg[tf.panel[1]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[1]==1 ? 255 : 0" ]
[ pimage dx=200 dy= 0 storage="&tf.panelImg[tf.panel[2]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[2]==1 ? 255 : 0" ]
[ pimage dx= 0 dy=100 storage="&tf.panelImg[tf.panel[3]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[3]==1 ? 255 : 0" ]
[ pimage dx=100 dy=100 storage="&tf.panelImg[tf.panel[4]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[4]==1 ? 255 : 0" ]
[ pimage dx=200 dy=100 storage="&tf.panelImg[tf.panel[5]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[5]==1 ? 255 : 0" ]
[ pimage dx= 0 dy=200 storage="&tf.panelImg[tf.panel[6]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[6]==1 ? 255 : 0" ]
[ pimage dx=100 dy=200 storage="&tf.panelImg[tf.panel[7]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[7]==1 ? 255 : 0" ]
[ pimage dx=200 dy=200 storage="&tf.panelImg[tf.panel[8]]"
sh=100 sw=100 sx=0 sy=0 layer=0 opacity="&tf.panelopen[8]==1 ? 255 : 0" ]
[ return ]

最初に読み込んだ 300x300px の透明画像(empty300.png)に
atari.png、hazure.png、panel.png 画像を追加読み込みしています。
どのパネルにどの画像を読み込むかは storage の中身で判定します。


storageの中身はどうなってるの?


たとえば4番パネルに「あたり」が入っているとします。
このとき、tf.panel[3](4番のパネル)に代入されている数値は「1」です。

また、パネル画像のファイル名は、以下の配列に収められています。

 tf.panelImg[0]='panel'
 tf.panelImg[1]='atari'
 tf.panelImg[2]='hazure'


ですので、4番があたり(tf.panel[3]=1)のとき
storage="&tf.panelImg[tf.panel[3]]"tf.panelImg[1]='atari'ということになります。

せっかくなので監視式で確認してみましょう。

ss_20120508_02.jpg/p>

opacityの中身はどうなってるの?


三項演算子を利用して、パネルの可視・不可視を opacity の値で調整しています。
ここでは、「tf.panelopen[i]==1」(パネルが開いているかどうか)という条件に対して

開いている()なら、opacity=255(可視)
開いてない()なら、opacity=0(不可視)

として、パネルの開閉状態をなんやかんやしています。なんやかんやって便利な言葉ですね。


ということで、パネル当てゲーム終了です。お付き合いいただきありがとうございました!


……と、見せかけてーщ(゚д゚щ)


このパネル当てゲーム、このままだと これっぽっちも面白くありません。
当たったときの旨みもなければ、はずれた時のペナルティもないので当然です。
次回は、この「ゲームっぽい何か」にゲームっぽい要素を追加していこうと思います。
ただし、追加したところで面白くなるかどうかは保証しかねます。

それでは、また次回(´∀`*)ノシ


関連記事

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://kopacurve.blog33.fc2.com/tb.php/226-758308df
この記事にトラックバックする(FC2ブログユーザー)

Author

Recent

Category

Link

Comment

Mailform

Twitter