語らいの一時オンライン

HSP3.3でTouch the Numbersを作る!

2013/4/13

HSPで作るスマホゲーム

HSPでスマホゲームが作れるようになるとは本当に良い時代です。
ある程度HSPをいじったことがある方であれば、最小限の労力でスマホゲームは作れます。
スマホゲームの利点は何と言っても、「皆いつも持ち歩いているゲーム機」でもあるということです。
自分でスマホアプリを作れるならば、その場で友達に配ることも可能です。
(サーバーにアップして、フリーウェアなどでQRコードを作成し、読み取ってもらうなど)
これってワクワクしませんか?
実際、私はその場で作ってその場で配るということをやったりしましたが、今までにない体験でした!
この素晴らしい体験を是非皆さんにも味わっていただきたいと思います。
では、早速始めていきましょう!


今回作るのは大ヒットした『Touch the Numbers』もどきです。
画像の作成も含めて6時間程度で完成させました(半分はバグ取り)。
タイムの算出は少々いい加減な処理をしているのは目を瞑っていただけると幸いです。

作成には「HSP3Dish」を使用します。
基本は通常のHSP3と同じですが、いくつかの仕様が若干異なります。
詳しくはこちらのページを参照して下さい。

それでは、プログラムの中身の解説です。
今回もプログラム中に注釈を入れていますので、ポイントのみ解説していきます。
「*block_ini」ではブロック(パネル)をランダムに配置しています。
まずは1から25まで順番に並べた上で、ランダムに選んだ2つのブロックを30回入れ替えることでバラバラに配置しています。
全てのブロックの場所をランダム値で置いていくということをしていないのがポイントです。
何故かというと、全てランダムに置いていくと、まだ置いていない場所に残りのブロックを置くのが困難になるからです。
こういう場合、フラグを立てて置いたか置いていないか判断することになります。
例えば、1から25まで順番にX座標とY座標をランダムで決めていくとして、最後の25番になると当然置ける場所は1か所なわけですが、なかなかランダム値がその場所にならないということが起こりえます。
ランダム値の範囲から置かれた場所を除外するという手もあるでしょうが、少々複雑な処理になってしまいます。
そのようなことをするくらいであれば、普通に並べた後で一定回数入れ替えてやった方が処理が単純で常に一定の速度で完了するというメリットがあります。

		

#include "hsp3dish.as" celload "number.png",1 celdiv 1,60,60,30,30 mmload"PulseMeter.wav",0,0 //セーブデータ exist"ranking.dat" if strsize=-1{ besttime=double(20.0) }else{ notesel dat noteload"ranking.dat" noteget besttime,0 besttime=double(besttime) } dim bx,25//ブロックのX座標 dim by,25//ブロックのY座標 dim bf,5,5//ブロックがあるフラグ ddim r,25//ブロックの回転角度増減用 ddim kaiten,25//ブロックの回転角度 ddim zx,25//ブロックの大きさ(X) ddim zy,25//ブロックの大きさ(Y) dim anime,25//ブロックアニメのフラグ *tit cls redraw 0 color 0,0,0:boxf color 255,255,255:pos 10,160:mes"Touch the 25 panels" pos 20,200:mes"BEST TIME:"+besttime objsize 250,40 pos 35,240:button"PLAY(SOUND ON)",*s_on pos 35,320:button"PLAY(SOUND OFF)",*s_off redraw 1 stop *s_on sound=1 goto *block_ini *s_off sound=0 goto *block_ini *block_ini for i,0,25 r.i=0.0//ブロックの回転角度 zx.i=1.0//ブロックの大きさ(X) zy.i=1.0//ブロックの大きさ(Y) kaiten.i=0.0 anime.i=0 next cls for i,0,5:bx.i=i:by.i=0:next//1段目 for i,5,10:bx.i=i-5:by.i=1:next//2段目 for i,10,15:bx.i=i-10:by.i=2:next//3段目 for i,15,20:bx.i=i-15:by.i=3:next//4段目 for i,20,25:bx.i=i-20:by.i=4:next//5段目 randomize for i,0,30 o=rnd(25)//入れ替え1つ目のX座標保管用 p=rnd(25)//入れ替え1つ目のY座標保管用 x1=bx.o:y1=by.o//入れ替え1つ目 x2=bx.p:y2=by.p//入れ替え2つ目 bx.o=x2//入れ替え1つ目 by.o=y2 bx.p=x1//入れ替え2つ目 by.p=y1 next *put for i,3,0,-1 redraw 0 ; 描画開始 color 0,0,0:boxf ; 画面クリア color 255,255,255:pos 140,200:mes i redraw 1 ; 描画終了 await 1000 ; 待ち時間(1/60秒) next redraw 0 color 0,0,0:boxf for i,0,25 pos bx.i*60+40,by.i*60+30:celput 1,i next objsize 120,30 pos 100,350:button"Retry",*block_ini pos 100,410:button"Title",*tit redraw 1 *main stick st mx=mousex:my=mousey xx=bx.now*60+40:yy=by.now*60+30 if st=256{ if (abs(mx-xx)<30 & abs(my-yy)<30){ if sound:mmplay 0 anime.now=1 now++ } if now=25:goto *hantei } tm+=1 redraw 0 color 0,0,0:boxf for i,0,25 if i>=now:pos bx.i*60+40,by.i*60+30:celput 1,i//通常のパネル表示 //アニメ処理 if anime.i{ pos bx.i*60+40,by.i*60+30:celput 1,i,zx.i,zy.i,kaiten.i r.i+=0.002:kaiten.i=r.i*180/3.14 zx.i=1.0-r.i*5 zy.i=1.0-r.i*5 if zx.i<=0:zx.i=1.0:zy.i=1.0:r.i=0.0:kaiten.i=0.0:anime.i=0 } next rec=double(tm*100/60)/100 color 255,255,255:pos 10,320:mes"TIME:"+rec title"x:"+abs(mx-(bx.now*60+40))+"y:"+abs(my-(by.now*60+30)) redraw 1 await 1000/60 goto *main *hantei redraw 0 cls color 0,0,0:boxf color 255,255,255:pos 20,160:mes"YOUR TIME:"+rec if rec

一応それなりに本家に近いものが出来ましたが、このままではただの物真似に過ぎません。
是非皆さん独自のアイディアをプラスしてオリジナルゲームに仕上げてみて下さい。


HSP参考書


この本には開発環境の構築や配布方法等が詳しく書かれているので、是非参考にしてみて下さい。

メインページへ戻る

コンタクト


掲示板

メール

リンク用バナー

バナー
バナー