|
|
2011/11/21(Mon) 23:25:07|NO.43188
HSPのサウンドでできることについて
前進すると音が遠とおのいたり、右を向いたら右側の音が小さくなったり
左を向いたら左側の音が小さくなったりとマウスやキーで動作したら音をコントロールすることは可能ですか?
例としては、ピアノがあり、音が鳴っていて近づくと音が大きくなり、うしろにさがると音が小さくなる
右を向いたら音が右側だけ小さくなったり、左を向いたら左側だけ音が小さくなったりということを行うです。
もし可能でしたらどのように作ればよいか、や機能拡張ソフトなどが必要であるなどご指摘やご教授お願いいたします。
|
|
2011/11/22(Tue) 00:01:46|NO.43190
Easy3Dは3Dサウンドに対応しています。
まずはサンプルスクリプトを実行してみてください。
e3dhsp3_3Dsound_XAudio2.hsp
e3dhsp3_3Dsound_XAudio2_Stop.hsp
|
|
2011/11/23(Wed) 02:09:26|NO.43215
ご指摘していただいた
e3dhsp3_3Dsound_XAudio2.hsp
e3dhsp3_3Dsound_XAudio2_Stop.hsp
を実行させてみたしたがどこのプログラムをどういじればいいのかなどがなかなかわかりません。
超初心者だとやっぱりまだサウンドに手を出すのが早かったのでしょうか?
今はサンプルの
e3dhsp_ground.as
に教えていただいたe3dhsp3_3Dsound_XAudio2.hspのプログラムを突っ込んで動かそうとしていますが
なかなか同期のとりか他が難しくエラーが絶えませんです。
|
|
2011/11/23(Wed) 20:51:12|NO.43229
同期?ですか。
何と何の同期でしょうか?
何が出来て何が出来てない状況なんでしょうかよくわかりません。音はちゃんと出てますか?
3Dサウンドってやることこのぐらいでしたっけ…。
E3DLoadSound
で、音声ファイル読み込んで、
E3DSet3DSoundEmiDist
で、音が届く範囲を指定。
E3DPlaySound
で、音を再生。
E3DSet3DSoundListenerMovement
で、リスナー(耳がある場所)の情報を設定。とりあえず-1にしとけばok。
E3DSet3DSoundMovement
で、音源の場所を設定。
|
|
2011/11/24(Thu) 21:51:49|NO.43255
キャラクター(作成したゲーム)で音を出すことはできたのですが、
とりあえずキャラクターが前に進んだら音が少しずつ大きくなり、
後ろに下がったら音が小さくなるというものを作ろうと考えております。
ただいま方向キーとの組み合わせ部分で苦戦しておりますのでもしよろしければアドバイスなど
よろしくお願いいたします。
|
|
2011/11/25(Fri) 02:29:39|NO.43261
初めに、参考資料などありがとうございます。
また、すいません私が勘違いしていたみたいでBGMという感じで音が鳴っていた模様です。
E3DSet3DSoundMovement音源の場所を設定E3DSet3DSoundListenerMovement
で、リスナー設定を行えばその音源場所に近づけば、
勝手に音が大きくなったり、小さくなったりする解釈でよろしいでしょうか?
初歩的な部分かもしれませんが
E3DLoadSound dir_cur + "\\Media\\sound\\aaa.wav",musicid(1) , 0, 1 ;音楽データを読み込みます。
E3DSet3DSoundEmiDist soundid1, 15.0 ;音の届く距離を指定
E3DPlaySound 音を再生。??
E3DSet3DSoundListenerMovement −1 ???
E3DSet3DSoundMovement 音源の場所を設定。???
はてな(?)がついている部分がどのように書いていいのかや、どの場所に書いていいのかなどが
どうしてもわかりません。参考資料となるものなどがありましたらお教えいただけませんでしょうか?
プログラムについていろいろ調べてるのですが頭がぐちゃぐちゃしてしまい少し整理したいと思います。
申し訳ありません私が理解力が低いため迷惑かもしれませんがご回答よろしくお願いいたします。
|
|
2011/11/26(Sat) 01:01:09|NO.43287
>>はてな(?)がついている部分がどのように書いていいのかや、どの場所に書いていいのかなどが
どうしてもわかりません。
SEを再生する前にE3DSet3DSoundMovementで音源設定してE3DPlaySoundする。
E3DSet3DSoundListenerMovementは基本的に毎フレーム行う必要があるので、
たとえばキー入力ルーチンとか、必ず毎フレーム通る場所に置けばいい。
もし、SEの発生源が移動したりした場合は、またE3DSet3DSoundMovementしてE3DPlaySound。
各引数については、リファレンス読めば十分わかるはず。
難しいことは何も書いてないとおもうが・・・。
|
|
2011/11/26(Sat) 15:16:58|NO.43296
ちょっと長いですが、とりあえずサンプル作ってみました。
http://homepage3.nifty.com/ghpk/e3d/hsp2/e3d011.htm
↑このページのサンプルを流用しているので必要なファイルはこのページからDLしてください。
また音声ファイルはEasy3Dのサンプルに入っていますので、コピーして使ってください。
;
; 3Dサウンド
;
#include "e3dhsp3.as"
;/////////////////
;
; 初期化
;
wid = 0 ;ウインドウID
objid = -1 ;オブジェクトID
fullscreenflag = 0 ;フルスクリーンフラグ
bits = 16 ;色数ビット数(fullscreenflag = 1 のときのみ有効)
multisamplenum = 0 ;アンチエイリアスのマルチサンプル数(0,2〜16)
;scid スワップチェインID
E3DInit wid, objid, fullscreenflag, bits, multisamplenum, scid
dim keybuf, 256 ;キー入力
fcolibound = 1 ;PCとNPCが衝突したとき重ならないようにする(0:off / 1:on)
;フォントの設定
E3DCreateFont 24,, 400, , , , msgothic, fontid
;/////////////////
;
; ライトの設定
;
E3DCreateLight lid1 ;光源を作成
lightdirx1 = 1 ;平行光の向き
lightdiry1 = -1
lightdirz1 = 0
lightr1 = 255 ;平行光の色
lightg1 = 255
lightb1 = 255
E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1 ;光源を平行光源に設定
;/////////////////
;
; カメラの初期化
;
camposx = 0 : camposy = 1000 : camposz = -4200
; camposx = 0 : camposy = 0 : camposz = 4200 ;デフォルト値
E3DSetCameraPos camposx, camposy, camposz ;カメラ座標を設定
targetx = 0 ;注視点座標
targety = 0
targetz = 0
upvecx = 0 ;カメラの上方向のベクトル
upvecy = 1
upvecz = 0
E3DSetCameraTarget targetx, targety, targetz, upvecx, upvecy, upvecz ;カメラの注視点を設定
;プロジェクションの設定
proj_near = 100.0 : proj_far = 50000.0 : proj_fov = 45.0
E3DSetProjection proj_near, proj_far, proj_fov
;/////////////////
;
; 地面の作成
;
sdim pathbuf, 2048, 4
pathbuf.0 = dir_cur + "\\Media\\yama.bmp" ;地面の座標情報
pathbuf.1 = dir_cur + "\\Media\\michi.bmp" ;地面の道の情報
pathbuf.2 = dir_cur + "\\Media\\kawa.bmp" ;地面の川の情報
pathbuf.3 = dir_cur + "\\Media\\bazou.bmp" ;地面、道、川の模様を決める、BMPファイル
;地面作成用の値
mapsize = 60000.0 ;X,Z座標の最大値
mapdiv = 60 ;座標の分割数
mapheight = 3000.0 ;高さの最大値
E3DLoadGroundBMP pathbuf.0, pathbuf.1, pathbuf.2, pathbuf.3, mapsize, mapsize, mapdiv, mapdiv, mapheight, hsid0
posx0 = 0.0 : posy0 = 0.0 : posz0 = 0.0
degx0 = 0.0 : degy0 = 0.0 : degz0 = 0.0
E3DSetPos hsid0, posx0, posy0, posz0 ;地面表示位置を設定
E3DSetDir hsid0, degx0, degy0, degz0 ;地面の向きを設定
frameno0 = 0 ;モーションは使用しない。
;/////////////////
;
; 形状データのロード
;
sdim mediadir, 2048
mediadir = dir_cur + "\\Media\\tako.sig"
;PC
E3DSigLoad mediadir, hsid1
E3DSetPosOnGround hsid1, hsid0, mapheight,, 13000, 16000
E3DRotateY hsid1, 180
frameno1 = 0 ;モーションは使用しない。
E3DSetBeforePos hsid1
;NPC
E3DSigLoad mediadir, hsid3
E3DSetPosOnGround hsid3, hsid0, mapheight,, 15000, 25000
E3DSetBeforePos hsid3
E3DCreateQ axisqid
;/////////////////
;
; 音ファイルの読み込み
;
mediadir = dir_cur + "\\Media\\sbounce.wav"
E3DLoadSound mediadir, soundid, 1, 1, 5
E3DSet3DSoundEmiDist soundid, 5000.0 ;音の届く距離
startsample = 0
;/////////////////
;
; メインループ
;
*main
E3DGetKeyboardState keybuf ;キー状態取得
if keybuf.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了
gosub *MoveChara ;キャラクター移動
gosub *MoveNPChara
gosub *MoveCamera ;カメラ移動
gosub *PlaySound ;音声再生
E3DBeginScene ;-----シーンスタート
E3DChkInView scid, hsid0 ;モデルが、視野内にあるか判定
E3DChkInView scid, hsid1
E3DChkInView scid, hsid3 ;キャラクター(NPC)
;不透明部分の描画をする
E3DRender scid1, hsid0, 0, frameno0, 0 ;バックバッファにレンダリングする。(地面描画)
E3DRender scid1, hsid1, 0, frameno1, 0 ;バックバッファにレンダリングする。(タコ描画)
E3DRender scid1, hsid3, 0, frameno1, 0 ;バックバッファにレンダリングする。(タコ描画NPC)
gosub *ChkConfAxis ;キャラクター同士の当たり判定
gosub *ChkConf ;地面との当たり判定
E3DEndScene ;-----シーン終了
E3DPresent scid1 ;バックバッファの内容を、プライマリバッファに転送。描画する。
E3DSetBeforePos hsid1
E3DSetBeforePos hsid3
E3DWaitByFPS 60, chkfps1 : await 0
; title ""+chkfps1 + " FPS"
goto *main
;
; 終了処理
;
*bye
E3DDestroyLight lid1 ;ライトを破棄
E3DBye
end
;/////////////////
;
; キャラクター移動
;
; PC
*MoveChara
forwardstep = 100 ;移動速度(前進)
backstep = -forwardstep ;移動速度(後退)
degstep = 5
mdegstep = -degstep
if keybuf.VK_UP = 1 : E3DPosForward hsid1, forwardstep ;矢印上
if keybuf.VK_DOWN = 1 : E3DPosForward hsid1, backstep ;矢印下
if keybuf.VK_LEFT = 1 : E3DRotateY hsid1, mdegstep ;矢印左
if keybuf.VK_RIGHT = 1 : E3DRotateY hsid1, degstep ;矢印右
return
; NPC
*MoveNPChara
forwardstep = 50 ;移動速度(前進)
degstep = 5.0/3
mdegstep = -degstep
E3DRotateY hsid3, mdegstep
E3DPosForward hsid3, forwardstep
return
;/////////////////
;
; カメラ移動(キャラクター追跡型)
;
*MoveCamera
;キャラクターを後ろに2500移動して座標を取得。backpos
E3DGetPos hsid1, saveposx1, saveposy1, saveposz1
E3DPosForward hsid1, -2500
E3DGetPos hsid1, backposx, backposy, backposz
E3DSetPos hsid1, saveposx1, saveposy1, saveposz1
;カメラをキャラクタ後方に設置
E3DSetCameraPos backposx, backposy + 1500, backposz
E3DSetCameraTarget saveposx1, saveposy1 + 800, saveposz1, 0, 1, 0
return
;/////////////////
;
; キャラクタの地面との当たり判定
;
*ChkConf
; 地面データとキャラクター
mapminy = -100 ;地面データのY座標の最小値。実際の最小値より、少し小さな値を入れる。
repeat 2 ;キャラ2つ
if cnt = 0 : hsid_c = hsid1
if cnt = 1 : hsid_c = hsid3
E3DChkConfGround hsid_c, hsid0, 1, mapheight, mapminy, result, adjustx, adjusty, adjustz, nx, ny, nz
if ( result != 0 ) : E3DSetPos hsid_c, adjustx, adjusty, adjustz ;地面の上に移動
loop
return
;/////////////////
;
; キャラクタどうしの当たり判定
;
*ChkConfAxis
E3DChkConflict hsid1, hsid3, confflag, inviewflag
if confflag!0 {
if fcolibound ! 0 {
;衝突したときにキャラクターが重ならないように移動する
;PCとNPCをそれぞれ衝突した方向と反対方向に40移動させる
r = 40.0
; r = 50.0
E3DGetPos hsid1, posx1, posy1, posz1
E3DGetPos hsid3, posx3, posy3, posz3
vposx = posx1 - posx3 ;NCPからPCに向かうベクトル
vposy = posy1 - posy3
;ベクトルを正規化(長さ1に)する。
E3DVec3Normalize vposx, vposy, vposz, posx, posy, posz
posx1 += posx*r ;移動ベクトルに現在位置を加算
posy1 += posy*r
posz1 += posz*r
E3DSetPos hsid1, posx1, posy1, posz1
; posx3 -= posx*r ;移動ベクトルに現在位置を加算
; posy3 -= posy*r
; posz3 -= posz*r
; E3DSetPos hsid3, posx3, posy3, posz3
}
E3DDrawTextByFontID scid, fontid, 10,10,"NPCと激突しました!", 255,255,255,255 ;激突したときのメッセージ。
}
return
;/////////////////
;
; 音声再生
;
*PlaySound
; 音を繰り返し再生
setcnt++
if( setcnt >= 50 ){
E3DPlaySound soundid, startsample, 0, 0
setcnt = 0
}
; リスナーの設定
E3DSet3DSoundListenerMovement hsid1
; 音源座標の設定
E3DGetPos hsid3, posx, posy, posz ;目印にキャラクターの位置が音源とします
E3DSet3DSoundMovement soundid, posx, posy, posz, 0,0,0
E3DUpdateSound
return
やってみたら以外に躓きました。
カメラの向きはE3DSetCameraDeg命令で変更すると3Dサウンドに向きの情報が上手く伝わらないようです。(やり方がまずかったのかもしれませんが。)
E3DSetCameraTarget命令を使えば何の問題もなくカメラの向き情報も3Dサウンドに反映されました。
| |
|
2011/11/28(Mon) 14:37:26|NO.43337
サンプルプログラムありがとうございます。
いろいろと改変したりして学んでいきたいのですが,
たびたび質問してしまって申し訳ございませんが、
pcのタコのところをタコをけして、画面だけにするにはどのように書き換えればよろしいですか?
また、音源の座標設定で音が鳴る場所を少し離したり、近づけたりするにはどのように改変すれば
よろしいでしょうか?
差支えなければどうぞご教授お願いいたします。
|
|
2011/11/28(Mon) 22:15:36|NO.43347
> pcのタコのところをタコをけして、画面だけにするにはどのように書き換えればよろしいですか?
・タコ(PC)を消す
E3DRender scid1, hsid1, 0, frameno1, 0 ;バックバッファにレンダリングする。(タコ描画)
と、
gosub *ChkConfAxis ;キャラクター同士の当たり判定
をコメントにしてください。
・画面をリスナーにする。
E3DSet3DSoundListenerMovement hsid1
を
E3DSet3DSoundListenerMovement -1
に変更してください。
でもこれだと実はタコは見えなくなっただけでデータは存在しています。
モデルはE3DSetCameraTargetで座標を取得するために使ってるだけなので、ほんとうはなくても構いません。
でも自分でターゲット座標を算出するのは結構面倒です。今回のように画面上に表示しないダミー用のモデルを用意することをお勧めします。
> また、音源の座標設定で音が鳴る場所を少し離したり、近づけたりするにはどのように改変すれば
音源を移動したい。ということでしょうか?
サンプルですでに動いてますが…。
あのぐるぐるまわってるタコの座標を音源座標として利用しています。
|
|
2011/11/29(Tue) 20:21:40|NO.43349
ご回答ありがとうございます。
また質問になってしまうのですが、最初の出現する場所の指定の仕方で、音源と逆の方向(ちょっと遠く)に設定したいのですが
どのようにしればよろしいでしょうか?
また、マウスの方向による上下左右を見れるようにしたいので、
;マウス座標初期化
DefaultMouseX = ginfo_wx1 + ginfo_winx / 2
DefaultMouseY = ginfo_wy1 + ginfo_winy / 2
MauseMoveRateX = 90.0 / ginfo_winx
MauseMoveRateY = 90.0 / ginfo_winy
mouse DefaultMouseX, DefaultMouseY
*main
;カメラ回転
MouseMoveX = MauseMoveRateX * ( DefaultMouseX - ginfo_mx ) ; マウスの横移動距離を取得
MouseMoveY = MauseMoveRateY * ( DefaultMouseY - ginfo_my ) ; マウスの縦移動距離を取得
E3DSetCameraDeg CameraDegXZ + MouseMoveX, CameraDegY + MouseMoveY ; カメラの角度を描画用に設定
を突っ込んでみたのですが、あまり詳しくないので当然あまりよろしい結果にはなりませんでした。
ぜひともマウスとの方向上下左右の向きが見れるようにしたいのでご教授ほどをよろしくお願いします。
|
|
2011/11/30(Wed) 00:58:54|NO.43350
なるほどFPSみたいなイメージですか。
E3DSetCameraDegで方向変えると、なぜか3Dサウンドに方向の情報がわたされないんですよね。なぜかわかりませんが。
なのでカメラの方向はE3DSetCameraTargetで設定してやる必要があります。
まずはカメラの方向設定の方法から。
上のサンプルを使います。
次の2箇所をコメントにしてください。
E3DRender scid1, hsid1, 0, frameno1, 0 ;バックバッファにレンダリングする。(タコ描画)
gosub *ChkConfAxis ;キャラクター同士の当たり判定
次にサブルーチン「*MoveCamera」の中を書き換えます。
;/////////////////
;
; カメラ移動
;
*MoveCamera
;キャラクターを後ろに2500移動して座標を取得。backpos
E3DGetPos hsid1, saveposx1, saveposy1, saveposz1
;カメラ座標(PCの座標にカメラを設置)
E3DSetCameraPos saveposx1, saveposy1, saveposz1
;カメラ方向
E3DPosForward hsid1, 2500 ;pcを前方に移動した座標をターゲット座標にする
E3DGetPos hsid1, backposx, backposy, backposz
E3DSetPos hsid1, saveposx1, saveposy1, saveposz1
E3DSetCameraTarget backposx, backposy, backposz, 0, 1, 0
return
PCを基準にしてカメラを設置。
方向は常にPCの前方というイメージです。
この方法ならPCを回転させれば同じ方向にカメラが向くはず。
E3DSetCameraDegが使えれば楽なんですけどね…何か間違えたかな。3Dサウンドに反映されない。
マウスの移動量を角度に置き換えるのは…私はやったこと無いんでよくわかりません。
どなたかおねがいします。大丈夫のような気がします。
動作確認のため視覚化してみた。
mx = 0.0 : my = 0.0
MauseMoveRateX = 1.0
MauseMoveRateY = 1.0
;マウス座標初期化
DefaultMouseX = ginfo_wx1 + ginfo_winx / 2
DefaultMouseY = ginfo_wy1 + ginfo_winy / 2
mouse DefaultMouseX, DefaultMouseY
*main
redraw 1 : await 16 : redraw 0 : color 255, 255, 255 : boxf : color : pos 0,0
;移動量取得
MouseMoveX = MauseMoveRateX * ( DefaultMouseX - ginfo_mx ) ; マウスの横移動距離を取得
MouseMoveY = MauseMoveRateY * ( DefaultMouseY - ginfo_my ) ; マウスの縦移動距離を取得
mouse DefaultMouseX, DefaultMouseY
;結果表示
mx += MouseMoveX
my += MouseMoveY
pos 10, 10
mes "(" + mx + ", " + my + ")"
pos mx+ginfo_winx/2, my+ginfo_winy/2
mes "●"
goto *main
| |
|
2011/11/30(Wed) 02:28:12|NO.43351
> 最初の出現する場所の指定の仕方で、音源と逆の方向(ちょっと遠く)に設定したいのですが
ありゃ、
E3DSetPosOnGround hsid3, hsid0, mapheight,, 15000, 25000
が効いてませんね。なんでだろう…
かわりに
E3DSetPos hsid3, 15000, 0.0, 25000
としてみてください。初期位置を好きな場所に設定できると思います。
*ChkConfがあるので高さは地面位置になるはずなので気にしなくていいはず。
|
|
2011/11/30(Wed) 03:42:18|NO.43352
SetPosOnGroundは使う前にE3DChkInViewを呼んでおく必要がありますよ。
|
|
2011/11/30(Wed) 22:16:34|NO.43382
ご回答ありがとうございます
最初の出現する場所の指定の仕方で、音源と逆の方向(ちょっと遠く)に設定したいの質問
でプログラムを書き換えることで様々な場所に変更できるようになりましたありがとうございます。
FPSみたいなイメージのほうはなかなかうまくいきませんorz
初歩的な質問で申し訳ないのですがスクリーンサイズを800×600にしたいのですが、
初めのスクリーン宣言のところをどう書けばよろしいでしょうか?
二つの音源を別々の場所で鳴らすことは可能ですか?例としては、音源としているタコさん
(NPC)を2匹に増やして別々の場所で違う音を鳴らすことです。
ちょっとずつですがHSPを学ばせていただいています。もしよろしければご教授よろしくお願いいたします。
|
|
2011/12/1(Thu) 00:05:38|NO.43387
> FPSみたいなイメージのほうはなかなかうまくいきませんorz
これはキャラクターの動かし方になれれば問題なくなってくると思います。
とりあえずPCが画面上に写って見える状態でいろいろと動かしてみて動かし方になれるといいかと。
それになれれば、あとはカメラをそのPCに持たせるイメージです。(キャラクターの情報を元にカメラを設置する。)
> 初歩的な質問で申し訳ないのですがスクリーンサイズを800×600にしたいのですが、
E3DInitより上の行で、これを実行してください。
screen 0, 800, 600
詳しくはヘルプ参照。
> 二つの音源を別々の場所で鳴らすことは可能ですか?例としては、音源としているタコさん
> (NPC)を2匹に増やして別々の場所で違う音を鳴らすことです。
可能です。
E3DLoadSound mediadir1, soundid1, 1, 1, 5
とするとmediadir1の音ファイルが読み込まれると同時に、その音に対して自動的にID番号(3Dサウンドを識別する番号)が割り当てられます。このIDは変数soundid1に出力されています。
さらにもう一度
E3DLoadSound mediadir2, soundid2, 1, 1, 5
とすると、今度はmediadir2の音ファイルが読み込まれると同時に、その音に対して自動的にさっきとちがう新しいID番号が割り当てられます。このIDは変数soundid2に出力されています。
読み込んだ音声ファイルの再生は、E3DPlaySound命令で行います。
E3DPlaySound soundid1, startsample, 0, 0
を実行するとmediadir1の音声ファイルが再生され、
E3DPlaySound soundid2, startsample, 0, 0
を実行するとmediadir2の音声ファイルが再生されます。
音が鳴る場所の設定はE3DSet3DSoundMovement命令で行います。使い方は先程と同じく、音をIDで指定して使います。
あっと、NPCタコさんの追加を忘れていました。
タコさんもE3DSigLoad命令でファイルを読み込んだときに、管理用のhsidと呼ばれるID番号が割り当てられます。
NPCタコさんの場合、変数hsid3に入っています。これを手がかりにしてNPCタコさんを参考にすればいいかと思います。
でも目印いらないんだったらE3DSet3DSoundMovement命令使うときに直接座標入れてやればタコさんいらないんですが。
> SetPosOnGroundは使う前にE3DChkInViewを呼んでおく必要がありますよ。
なるほどそうでしたか。ありがとうございます。
今さら気づいたこと。
NO.43296のリンク先ってHSP2用だったんですね。HSP3用はこっちでした。失礼しました。
http://homepage3.nifty.com/ghpk/e3d/e3d3015.htm
| |
|
2011/12/1(Thu) 02:46:05|NO.43393
ご回答ご教授ありがとうございます。アドバイスにもとにやったところ
目印なしのE3DSet3DSoundMovement命令使うときに直接座標入れて音を鳴らすことに
成功しましたありがとうございます。ですががやっぱり、NPCを目印としてほしいので、hsid4をつくって同じ
タコさん作ってみようとして、hsid3が扱われている命令を2つに増やして一つをhsid4にかえて動かしてみると
別々のところにタコさん(目印)と音源ができましたが、
当たり判定のところがうまくいっておらずタコさん山にめり込んでました。(;w;)
当たり判定のところをhsi4(NPC2個作ったときの)命令の仕方などありましたらお教えいただけないでしょうか?
また、そんなことしなくても増やせるよってのがありましたらご教授お願いいたします。
|
|
2011/12/1(Thu) 23:04:55|NO.43400
順調ですねー。
> 当たり判定のところがうまくいっておらずタコさん山にめり込んでました。(;w;)
ループ回数あたりが上手く設定できてないのかな。
こんな感じにすると動くはずなんで試してみてください。
;/////////////////
;
; キャラクタの地面との当たり判定
;
*ChkConf
; 地面データとキャラクター
mapminy = -100 ;地面データのY座標の最小値。実際の最小値より、少し小さな値を入れる。
repeat 3 ;キャラ2つ改め3つ
if cnt = 0 : hsid_c = hsid1
if cnt = 1 : hsid_c = hsid3
if cnt = 2 : hsid_c = hsid4
E3DChkConfGround hsid_c, hsid0, 1, mapheight, mapminy, result, adjustx, adjusty, adjustz, nx, ny, nz
if ( result != 0 ) : E3DSetPos hsid_c, adjustx, adjusty, adjustz ;地面の上に移動
loop
return
キャラクターの数だけループしてます。
キャラクター1個につきそれぞれE3DChkConfGroundを実行しています。
> また、そんなことしなくても増やせるよってのがありましたらご教授お願いいたします。
Easy3Dでは、キャラクターを1個作ったら、それぞれ全てのモデルに対して1個ずつ移動や判定を行わなければなりません。
その点は簡単にはなりませんね。
しかしHSPの標準機能であるrepeat命令などのループと配列変数を上手く使えば、もっと効率的にスクリプトの変更ほとんどなしに10個でも100個でも好きな数のキャラを配置して動かすことも出来ます。
でもこれはHSPにもうちょっと慣れてからがいいのかも?
------
そろそろ音の話からEasy3DとHSPの話になってきたので、ここで資料紹介。
「HSP+Easy3Dで作る3Dアクションゲーム」
http://www.amazon.co.jp/HSP-Easy3D%E3%81%A7%E4%BD%9C%E3%82%8B3D%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0%E2%80%95%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A7%E3%82%82%E7%B0%A1%E5%8D%98%E3%81%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%8C3D%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3RPG%E3%80%8D-I-BOOKS-%E9%AD%94%E5%A5%B3%E3%82%AA%E3%82%A4%E3%83%A9/dp/4777516369
「最新HSP3.3プログラミング入門」
http://www.amazon.co.jp/gp/product/4798031445/ref=as_li_ss_tl?ie=UTF8&tag=hsptv0d-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4798031445
本はとりあえず立ち読みしてみることをお勧め。買えとは言わない。
Easy3D wiki
http://easy3d.wikiwiki.jp/
他にも解説や入門サイトがいろいろあります。
| |
|
2011/12/2(Fri) 00:24:28|NO.43401
ご回答ありがとうございます。
本のほうは、「HSP+Easy3Dで作る3Dアクションゲーム」のほうを買わせていただきました。
最後にちょっとまた質問してしまうのですが、音ファイルの読み込みで読み込む音データは
大きい容量データ(長い音)などは、取り込めないのでしょうか?
MIDIで拡張子同じの音を作ったのですが読み込めませんでしたので少し残念でした;w;
HSPのフリー素材など探したほうがよろしいのかなっと思うのですが、良いサイトなどありました
らご教授よろしくお願いします。
改めまして長い間たくさんの回答していただいて本当にありがとうございました。m−−m
また、自分がいたらないばかりに、質問を書き込むかもしれませんが、そのときは、お付き合いしていただければ光栄です。
|
|
2011/12/2(Fri) 05:04:23|NO.43403
Easy3Dの音機能はマイクロソフトのXAudio2というのを使っています。
XAudio2ではMIDIを鳴らすことは出来ません。
wavやoggなどを使うようにしてください。
|
|