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コンテストは盛り上がっている模様。
みなさんも一度はチェックしてみたらいかがですか?