HSPコンテスト2012(ふるーつぱにっく!)
HSPコンテスト2012が開催されています。
応募締め切りギリギリで提出できました。
ふるーつをいっぱいつなげて、いっぱいたべよう!
でも、こわーいおばけもいるから気を付けてね!
ということで制作上で便利だったHSPネタを紹介します。
モジュール
#module hoge #deffunc local constructor posx = 10 posy = 20 return #deffunc local destructor return #deffunc local draw gsel 0: gcopy 1,posx,posy,32,32 return #global constructor@hoge draw@hoge destructor@hoge
だいたいこんな感じで使いました。
名前空間が圧迫されている時に適応範囲を局所化できるので便利です。
再帰関数
マップ内で果物が何個連結されているかをdfsするときに再帰関数を使いました
object_id = 0 // 対象の果物 dim objects,100,100 // 果物マップ dim visited,100,100 // メモ化的なもの #defcfunc dfs int x,int y if visited(x,y)!=0: return 0 if object_id == objects(x,y): return 1 if x+1<w: visited(x,y) += dfs(x+1,y,object_id) if x-1>=0: visited(x,y) += dfs(x-1,y,object_id) if y+1<h: visited(x,y) += dfs(x,y+1,object_id) if y-1>=0: visited(x,y) += dfs(x,y-1,object_id) return visited(x,y)
こんな感じです。
名前が衝突するとめんどくさいのでvisitedのように引数パラメタごとに変数を用意しておくのがコツです。
入力モジュール
いつもやっている感じで作っちゃいました。
HSPの標準機能でもできるかもしれません。
フレーム内での値が固定化されているのがポイントかも知れません。
//-------------------------------------------------------------------- // // INPUT // //-------------------------------------------------------------------- #module inputs #const LEFT 0 #const UP 1 #const RIGHT 2 #const DOWN 3 #const B1 4 // Z #const B2 5 // X #const ESC 6 #deffunc local init prev_codes = 0 codes = 0 return #deffunc local update prev_codes = codes codes = 0: c=0 getkey c,37: if c: codes += (1<<LEFT) getkey c,38: if c: codes += (1<<UP) getkey c,39: if c: codes += (1<<RIGHT) getkey c,40: if c: codes += (1<<DOWN) getkey c,90: if c: codes += (1<<B1) getkey c,88: if c: codes += (1<<B2) getkey c,27: if c: codes += (1<<ESC) return #defcfunc local pushed int code if ((prev_codes>>code)&1)=0: if ((codes>>code)&1)==1: return 1 return 0 #defcfunc local pushing int code if ((prev_codes>>code)&1)=1: if ((codes>>code)&1)==1: return 1 return 0 #defcfunc local released int code if ((prev_codes>>code)&1)=1: if ((codes>>code)&1)==0: return 1 return 0 #global
浮動少数変数に注意
変数は動的に色んな型に変わる可能性があります。
pos=10.0
とかやっていてもいつのまにか
#const NEXT_POS 50 ... pos=NEXT_POS
とかやってしまって整数型になってしまうことがあります。
根気よくpos=double(NEXT_POS)とかやるといいと思います。(それかsetter命令を作ってラップするか)
その他
buffer -> picload "hogehoge",1 -> gcopy
redraw 0 -> メインループ -> await 1 -> redraw 1
if scene != prev_scene: gosub *change_scene
scene=prev_scene
今年もHSPコンテストは盛り上がっている模様。
みなさんも一度はチェックしてみたらいかがですか?