|
|
2014/10/6(Mon) 16:49:36|NO.65455
こんにちは。
以前から何度かアクションゲームについて質問したのですが
マップチップサイズずつの移動でのあたり判定はだいぶ仕組みが理解できたのですが
マップチップサイズずつではなくもっと細かく移動する方法が分かりません。
マップチップサイズ・キャラサイズは32*32です。
ウィンドウサイズを640*480でプレイヤーは
boxf 288,208,320,240の位置に固定で考えています。
上下左右にスクロールできるようにする予定です。
とりあえずマップサイズずつは↓のサイトを参考にしました。
http://www.antares.cn/hsp/sample/index.html#graphic
scroll.as
どうすれば細かく移動できるようにできるでしょうか?よろしくお願いします。
|
|
2014/10/8(Wed) 17:20:01|NO.65473
#define maxx 32 //マップサイズ
#define maxy 32
#define size 32 //マップチップサイズ
//●当たり判定を一本化する。プレイヤーが壁にめり込むとp1に1を返すマクロを作成。
#define chk(%1,%2,%3) if map((%2)/size,(%3)/size)!0:%1=0:else:\
if map((%2+size-1)/size,(%3)/size)!0:%1=0:else:\
if map((%2)/size,(%3+size-1)/size)!0:%1=0:else:\
if map((%2+size-1)/size,(%3+size-1)/size)!0:%1=0:else:\
%1=1
//ランダムマップ作成
dim map,maxx,maxy:repeat 300:map(rnd(maxx),rnd(maxy))=1:loop
repeat maxy:map(maxx-1,cnt)=1:map(0,cnt)=1:loop
repeat maxx:map(cnt,maxy-1)=1:map(cnt,0)=1:loop
jumpct=0.0:px=size:py=size //プレイヤーの位置と座標初期化
repeat //●メイン
stick ky,15
redraw 0
color 255,255,255:boxf //背景クリア
jumpct+=0.2 //ジャンプカウンタ増加
if jumpct>=size:jumpct=-0.001+size //ジャンプカウンタがチップサイズを上回ることはない。
py+=jumpct //ジャンプカウンタ反映
chk ans,px,py //プレイヤーがめり込まなかったかチェック
if ans=0:{ //めり込んだ場合
//プレイヤーの座標をめり込まない位置に逃がし、ジャンプカウンタをリセットする
if jumpct>0:py=py/size*size:else:py=py/size*size+size
jumpct=0.0
}
if ky&1:chk ans,px-2,py:px-2 //キー操作によってプレイヤが壁にめり込まなければ移動させる
if ky&4:chk ans,px+2,py:px+2 //キー操作によってプレイヤが壁にめり込まなければ移動させる
chk ans,px,py+1 //プレイヤーが接地しているかチェック
if ans=0:if ky&16:jumpct=-8.0 //接地しており、スペースキーが押されていればジャンプする
camx=px-ginfo_winx/2:camy=py-ginfo_winy/2 //カメラの位置を設定
color 255:boxf px-camx,py-camy,px-camx+size-1,py-camy+size-1:color ,255 //プレイヤー描画
//マップ描画
repeat ginfo_winx/16:tx=cnt:lx=tx+camx/size
repeat ginfo_winy/16:ty=cnt:ly=ty+camy/size
if lx<0 | ly<0 | lx>=maxx | ly>=maxy:continue
x=tx*size-camx\size:y=ty*size-camy\size
if map(lx,ly)!0:boxf x,y,x+size-1,y+size-1
loop
loop
redraw 1:await 15 //画面を再描画
loop
記事を検索していたらDripさんの書き込みに上のようなsampleがあったのですが
いくつかわからないことがあります。
//●当たり判定を一本化する。プレイヤーが壁にめり込むとp1に1を返すマクロを作成。
#define chk(%1,%2,%3) if map((%2)/size,(%3)/size)!0:%1=0:else:\
if map((%2+size-1)/size,(%3)/size)!0:%1=0:else:\
if map((%2)/size,(%3+size-1)/size)!0:%1=0:else:\
if map((%2+size-1)/size,(%3+size-1)/size)!0:%1=0:else:\
%1=1
これは何をしているのでしょうか。%3とか\とか訳の分からない記号が
でてきてまったくわかりません。
chk ans,px,py //プレイヤーがめり込まなかったかチェック
if ans=0:{ //めり込んだ場合
//プレイヤーの座標をめり込まない位置に逃がし、ジャンプカウンタをリセットする
if jumpct>0:py=py/size*size:else:py=py/size*size+size
jumpct=0.0
}
これはなにをしているのでしょうか。
分かる方がいたら回答お願いします。
長くなってしまいすいません。

| |
|
2014/10/8(Wed) 18:07:31|NO.65474
> //●当たり判定を一本化する。プレイヤーが壁にめり込むとp1に1を返すマクロを作成。
> #define chk(%1,%2,%3) if map((%2)/size,(%3)/size)!0:%1=0:else:\
> if map((%2+size-1)/size,(%3)/size)!0:%1=0:else:\
> if map((%2)/size,(%3+size-1)/size)!0:%1=0:else:\
> if map((%2+size-1)/size,(%3+size-1)/size)!0:%1=0:else:\
> %1=1
>
> これは何をしているのでしょうか。%3とか\とか訳の分からない記号が
> でてきてまったくわかりません。
この場合の¥は、本来ならば1行書きのスクリプトですが、それを見やすく
するために数段に分けて書くための「つながってますよ」という合図です。計算ではない。
次に chk(%1,%2,%3)
%1、%2、%3は chkという名のマクロを実行するときの引数になります。
この場合、次の質問の先頭に chk ans,px,py と使用してあるように
%1にはマクロで実行したあたり判定の結果を入れる
%2にはプレイヤーの座標X座標であるpxが入る
%3にはプレイヤーの座標Y座標であるpyが入る
以上をマクロで受けたうえで、マクロを実行しているのです。
> chk ans,px,py //プレイヤーがめり込まなかったかチェック
> if ans=0:{ //めり込んだ場合
> //プレイヤーの座標をめり込まない位置に逃がし、ジャンプカウンタをリセットする
> if jumpct>0:py=py/size*size:else:py=py/size*size+size
> jumpct=0.0
> }
>
> これはなにをしているのでしょうか。
コメントに書いてある通りのことをやってます。
先に説明した chk ans,px,py マクロを実行し、ansに結果が入ります。
その結果をみて、0なら地面にめり込んだと判断し、めり込んだ分を戻してあげているわけです。
> if jumpct>0:py=py/size*size:else:py=py/size*size+size
の部分の size はスクリプトの始めにdefineで定義されているように、32の数値が入ります。
分解すると
if jumpct > 0 {
py = py / 32 * 32
} else {
py = py / 32 * 32 + 32
}
と同じ意味になります。
何にせよ、せっかくサンプルがあるんですから、自分でいろんな数値を変えて遊んで、
自身でピンと来た方が理解度も高まりますし、その方が楽しいですよ。
あとはマニュアルを読みましょう。色々載ってます。

| |
|
2014/10/8(Wed) 18:24:43|NO.65475
\は改行だったんですか!計算式の記号だと思っていました。
だいぶ理解できて来たのですがあたらに0=空間,1=ブロック,2=ブロック2
としてブロック1とブロック2を区別したいのですがchkを使うと空間かブロック
かしか区別できないのでブロックのIDを取得できるようにするにはどうすればいいですか?
また外部ファイルから0,1,2,3...30,31...とマップをやりたいのですが
//ランダムマップ作成
dim map,maxx,maxy:repeat 300:map(rnd(maxx),rnd(maxy))=1:loop
repeat maxy:map(maxx-1,cnt)=1:map(0,cnt)=1:loop
repeat maxx:map(cnt,maxy-1)=1:map(cnt,0)=1:loop
jumpct=0.0:px=size:py=size //プレイヤーの位置と座標初期化
を編集すればできると思ったのですがファイルに0,1,...の,が入っているのでどうすれば
mapに代入できるかわかりません。
よろしくお願いします。
|
|
2014/10/9(Thu) 16:08:22|NO.65483
E.Tさん、こちらから質問しますが、
HSPというか、プログラミングの基礎はどのあたりまでできますか?
変数の扱い、配列の扱い、分岐とループの扱い。
これまでどんなゲームを自力で作りましたか。(ルーレットや、数当てゲームとか)
ゲームプログラムをしたいのであれば、まずこれをきちんと理解していることが前提です。
> //ランダムマップ作成
> dim map,maxx,maxy:repeat 300:map(rnd(maxx),rnd(maxy))=1:loop
> repeat maxy:map(maxx-1,cnt)=1:map(0,cnt)=1:loop
> repeat maxx:map(cnt,maxy-1)=1:map(cnt,0)=1:loop
> jumpct=0.0:px=size:py=size //プレイヤーの位置と座標初期化
この部分はマップを作っているのですが、例えば
> dim map,maxx,maxy:repeat 300:map(rnd(maxx),rnd(maxy))=1:loop
の部分は一行で色々やってますので、分解すると、
dim map,maxx,maxy //ここは配列を宣言。32x32のマップ
repeat 300 //300回くりかえします
map(rnd(maxx),rnd(maxy)) = 1 //0〜31までの範囲でランダムで位置を指定します
loop
300回繰り返すループの中で、=1があるように、配列の300か所がランダムで1に書き換えられるわけです。
ということは1を2に変えるとブロック番号2になりますね。
0か1か2かにしたい場合、どうすればよいでしょうか。(もう答えがでているに等しいですが)
で、
ゲームの作り方とHSPプログラミングの基礎をきちんと勉強するためには、HSPの入門書もたくさんあるようですし、
1冊買って(もしくは図書館で借りて)しっかり理解したうえで作り始めたほうが、良いと思います。
どうしても掲示板やHPに掲載されているスクリプトは、モジュールなどは良いにしても
改造してそれをそのまま自分のゲームに使ったりするのは難しいと思います。
1から自身で作れるようになった方が良いと思いますので。
|
|
2014/10/9(Thu) 16:47:56|NO.65484
>E.Tさん、こちらから質問しますが、
>HSPというか、プログラミングの基礎はどのあたりまでできますか?
ある程度の命令はわかっています。
>これまでどんなゲームを自力で作りましたか。
ゲームはあんまり作ってないです…
>1冊買って(もしくは図書館で借りて)しっかり理解したうえで作り始めたほうが、良いと思います。
本は1冊持っています。しっかりこの本は読んだのでこの本に書いてあることは
ほとんど理解しています。
> dim map,maxx,maxy:repeat 300:map(rnd(maxx),rnd(maxy))=1:loop
は自分でも分解してランダムで入れているということはわかりました。
しかしファイル(csv)だと「,」が入っているため配列に入れる方法が分かりません。
,がなければ普通にできるのですが…
それとブロック番号を取得する方法がわかりません。
|
|
2014/10/9(Thu) 18:36:59|NO.65485
csvの各要素を配列に入れたいのであれば
split
命令について調べてみるといいかもしれません。
|
|
2014/10/12(Sun) 19:12:22|NO.65529
返信遅れてすいません。
なんとか自力でできそうです。
ありがとうございました
|
|