HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0821
HSP熊エラーが出てしまいます9未解決


HSP熊

リンク

2017/8/21(Mon) 14:31:42|NO.81047

本を参考に作りました。でも実行すると#Error 38 in 340 (script0.hsp) 外部DLLへの呼び出しに失敗しました
と出ます。どうすればいいでしょうか。
#include "e3dhsp3.as"

dim keybuf, 256

;スクリーンのサイズ
screenw = 640 : screenh = 480
;スクリーンの位置
screenx = 300 : screeny = 100
screen 0, screenw, screenh, 0, screenx, screeny
;ウィンドウのタイトル
title "sample"
;デバック情報をdbg.txtに出力
E3DEnableDbgFile
;初期化
E3DInit 0, -1, 0, 16, 0, scid1

;フォントの作成
E3DCreateFont 20, 10, 800, 0, 0, 0, "MS ゴシック", fontid1

;ライトIDの取得
E3DCreateLight lid1
;ライトの作成
lightdirx1 = 0.1 : lightdiry1 = -0.1 : lightdirz1 = 0.1

lightr1 = 255 : lightg1 = 255 : lightb1 = 200
E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1

;プロフェッションの作成
proj_near = 800.0 : proj_far = 100000.0 : proj_fov = 60.0
E3DSetProjection proj_near, proj_far, proj_fov


;音楽データを読み込みます。
E3DLoadSound dir_cur + "\\Media\\sound\\firewind.wav",musicid(1) , 0, 1
;効果音を読み込みます。
E3DLoadSound dir_cur + "\\Media\\sound\\bun.wav",soundid(1), 1, 4
E3DLoadSound dir_cur + "\\Media\\sound\\bosu.wav",soundid(2), 1, 4


;主人公キャラデータ読み込み
pathbuf = dir_cur + "\\Media\\Hero\\he1.sig"
E3DSigLoad pathbuf, hsid1

;モーションデータを読み込む命令です。
pathbuf = dir_cur + "\\Media\\Hero\\motion(he\\mo(he.moa"
E3DLoadMOAFile hsid1, pathbuf, 5

;主人公の設定
HP = 10
最大HP = 10
初期値 = 10
必要経験値 = 初期値
攻撃力 = 3
Lv = 1
取得経験値 = 10



;主人公の装備データを読み込みます。
pathbuf = dir_cur + "\\Media\\item\\Sword.sig"
E3DSigLoad pathbuf, weid1



;主人公モデルの座標を設定
posx1 = 0.0 : posy1 = 210.0 : posz1 = -6000.0
E3DSetPos hsid1, posx1, posy1, posz1
adjustx0 = posx1 : adjusty0 = posy1 : adjustz0 = posz1

;主人公モデルの向きを設定
diry1 = 0.0
E3DSetDir hsid1, 0, diry1, 0

;主人公の座標を保存(E3DChkConfGroundで保存された座標を使用します。
E3DSetBeforePos hsid1



;クォータニオンを作成します。
;武器を腕にセットするときの姿勢座標取得に必要になります。
E3DCreateQ dirQ

;武器をセットするボーンのIDを取得します。
E3DGetBoneNoByName hsid1, "buki_X-", bon1



;マップデータの読み込み
E3DLoadmqoFileAsGround dir_cur + "\\Media\\Field\\Map1.mqo", 60.0 ,gid




;壁データの読み込み
E3DLoadmqoFileAsGround dir_cur + "\\Media\\Field\\Wall1.mqo", 60.0, wid


;背景データの読み込み
E3DCreateBG scid1, dir_cur + "\\Media\\Field\\Dark.bmp", "n", 0, 0, 0, 0

stag = 1;移動マップを指定


敵数=3
repeat 敵数
pathbuf = dir_cur + "\\Media\\Enemy\\m1.sig"
E3DSigLoad pathbuf, Enid(cnt)
pathbuf = dir_cur + "\\Media\\Enemy\\motion(m1\\mo(m1.moa"
E3DLoadMOAFile Enid(cnt), pathbuf, 5


;敵モンスターモデルの座標を設定
if cnt=0:adjustxE(cnt)=-10000.0 : adjustyE(cnt)=210.0 : adjustzE(cnt)=-18400.0
if cnt=1:adjustxE(cnt)=0.0: adjustyE(cnt)=210.0 : adjustzE(cnt)=-10000.0
if cnt=2:adjustxE(cnt)=10000.0 : adjustyE(cnt)=210.0 : adjustzE(cnt)=-18400.0
E3DSetPos Enid(cnt), adjustxE(cnt), adjustyE(cnt), adjustzE(cnt)

;敵モンスターモデルの向きを設定
diry=0.0
E3DSetDir Enid(cnt), 0, diry, 0
E3DSetBeforePos Enid(cnt)

;repeat命令で使う(cnt)を変数として用いる場合
;小数点以下まで使うのかそうでないのか=0か=0.0のように定義していないと
;エラーが起こります。以下のような表記をすればこのエラーは回避できます。
eventnoE(cnt) = 0
resultE(cnt) = 0
motidE(cnt) = 0
dmpcnt(cnt) = 0
framE(cnt) = 0
EnDed(cnt) = 0
Endtim(cnt) = 0
posEndx(cnt) = 0.0
posEndy(cnt) = 0.0
posEndz(cnt) = 0.0
scle(cnt) = 0.0
EnHP(cnt) = 10
;敵モンスター装備作成
pathbuf = dir_cur + "\\Media\\item\\club.sig"
E3DSigLoad pathbuf, weidE(cnt)
;武器をセットするボーンの座標を読み込む
E3DGetBoneNoByName Enid(cnt),"buki_X-", bonE(cnt)

loop

repeat 敵数
E3DDestroyHandlerSet Enid(cnt)
E3DDestroyHandlerSet weidE(cnt)
;[script9.hsp]の[Source2]がここに入ります
loop

*main



E3DGetKeyboardCnt keybuf
if keybuf( VK_ESCAPE ) != 0 : goto *bye ; [ESC]で終了


gosub *MoveChara
gosub *MoveCamera

;ラベルを追加します。
gosub *Setweapon


;主人公のモーションを実行します。
E3DSetNewPoseByMOA hsid1, eventno
;主人公のモーションの番号をmotidに、現在のフレーム数をframに代入します。
;条件などにモーション番号や、フレーム数を用いる時に使います。
E3DGetMotionFrameNo hsid1, motid, fram


repeat 敵数
;主人公のモーションを実行します。
E3DSetNewPoseByMOA Enid(cnt), eventnoE(cnt)
;主人公のモーションの番号をmotidに、現在のフレーム数をframに代入します。
E3DGetMotionFrameNo Enid(cnt), motidE(cnt), framE(cnt)

loop
//////

;視野内にあるかどうかを、判定します
E3DChkInView scid1, hsid1

;[script4.hsp]の[Source3]がここに入ります
E3DChkInView scid1, gid

;[script5.hsp]の[Source2]がここに入ります
E3DChkInView scid1, wid



;武器を新たに表示するため、武器の視野内判定を追加します。
E3DChkInView scid1, weid1




repeat 敵数
E3DChkInView scid1, Enid(cnt)
E3DChkInView scid1, weidE(cnt)
loop




gosub *ChkConf ; 必ず E3DChkInViewより後で呼んでください。

gosub*ChkConf2; 必ず E3DChkInViewより後で呼んでください。

gosub*Warp
;レンダリングを実行する前には必ずこのメソッドを呼び出し
;レンダリングの終了時、および再度E3DBeginSceneを呼び出す前には、
;必ず E3DEndSceneを呼び出す。
E3DBeginScene scid1

;不透明モデルの表示


E3DRender scid1, gid, 0


E3DRender scid1, hsid1, 0

;武器を新たに表示するため、不透明部分の描画を追加します。。
E3DRender scid1, weid1, 0

repeat 敵数
if EnDed(cnt)<30{
E3DRender scid1, Enid(cnt), 0
E3DRender scid1, weidE(cnt), 0
}
loop


;半透明モデルの表示


E3DRender scid1, gid, 1, , , , , 1


E3DRender scid1, hsid1, 1, , , , , 1


;武器を新たに表示するため、半透明部分の描画を追加します。
E3DRender scid1, weid1, 1, , , , , 1



repeat 敵数
if EnDed(cnt)<30{
E3DRender scid1, Enid(cnt), 1, , , , , 1
E3DRender scid1, weidE(cnt), 1, , , , , 1
}
loop


;ここではラベルを追加します。ラベル名を*Setsoundとします。
gosub *Setsound




gosub *DrawText
E3DEndScene
E3DPresent scid1

;一秒間に表示される画像の数を設定します。
;必ず、HSPの標準命令、”await 0”とセットで使用してください。
E3DWaitbyFPS 60, chkfps1
await 0

E3DSetBeforePos hsid1




if マップ移動=1:gosub *changemap

goto *main

*bye
;ゲームを終了します
E3DBye
end
*MoveChara

;キャラクターのモーション番号を初期化して0にします。
;これがないと、同じモーションを延々と繰り返します。
eventno = 0
;モーションが初期化されると同時に移動禁止を解きます。
;Source4の移動禁止命令をモーション番号を条件に解除します。
if motid = 1 : 移動禁止 = 0


移動距離 = 0
if 移動禁止 = 0{
if keybuf( VK_LEFT ) != 0 :{
diry1 = 90.0
移動距離 = 100
eventno = 1
}
if keybuf( VK_RIGHT ) != 0 :{
diry1=-90.0
移動距離=100
eventno=1
}
if keybuf( VK_UP )!=0 :{
diry1=180.0
移動距離=100
eventno=1
}
if keybuf( VK_DOWN )!=0:{
diry1=0.0
移動距離=100
eventno=1
}
}



;[Z]で攻撃をさせる命令をします。攻撃中移動しないように
;移動禁止も命令しておきます。
if keybuf( 'Z' ) = 1 : eventno=2 : 移動禁止 = 1



E3DSetDir hsid1, 0, diry1, 0
E3DPosForward hsid1,移動距離



;敵の行動
repeat 敵数
eventnoE(cnt)=0
if EnHP(cnt)>0{
;敵と主人公の位置から敵の動きを決める
E3DGetPos hsid1, posx1, posy1, posz1
E3DGetPos Enid(cnt), posx, posy, posz
vecx = posx-posx1
vecy = posy-posy1
vecz = posz-posz1
E3Dvec3length vecx,vecy,vecz,length1
if length1>800:{
;敵の距離が遠かったため主人公を追尾します
eventnoE(cnt)=1
E3DDirToTheOtherXZ Enid(cnt),hsid1
E3DPosForward Enid(cnt),10
}
if length1<=800:{
;敵の距離が近いので主人公を攻撃します
eventnoE(cnt)=2
;攻撃がヒットしたためダメージエフェクトを表示し、HPを減らします
if motidE(cnt)=3 && framE(cnt)=10{
HP-=1:効果音2=1:画面点滅=5
}
E3DDirToTheOtherXZ Enid(cnt),hsid1
if length1<300:{
;敵が主人公と重ならないようにします
E3DPosForward Enid(cnt),-100
}
}
}
;HPが0になると死亡時のアクション時間が進行する
if EnHP(cnt)<1:EnDed(cnt)+=1
;敵を倒すと経験値がもらえるようにする。
if EnDed(cnt)=1:経験値+=取得経験値
;一定時間で敵が復活するようにする
if EnDed(cnt)>100:{
EnDed(cnt)=0
EnHP(cnt)=10
if cnt=0:posx=-10000.0: posy=210.0: posz=-18400.0
if cnt=1:posx=-10000.0: posy=210.0: posz=1000.0
if cnt=2:posx=10000.0: posy=210.0: posz=-18400.0
E3DSetPos Enid(cnt), posx, posy, posz
}
;ダメージ中に敵が吹き飛ぶようにする
if Endtim(cnt)>0 && Endtim(cnt)<6: E3DSeparateFrom Enid(cnt),hsid1,200
;このタイミングで効果音をならす
if Endtim(cnt)=10:効果音2=1
;ここでダメージ時間を経過させる。
if Endtim(cnt)>0:Endtim(cnt)-=1
loop

;レベルアップの設定
if 経験値 > 必要経験値{
経験値 = 必要経験値
攻撃力+=1
HP=10+Lv*3
Lv+=1
repeat Lv
R=Lv*経験値
loop
必要経験値 = 初期値+R
}



return

*Setsound
;BGMを繰り返す命令をします。ゲームのバックサウンドなどに使用します。
;音楽が演奏されていない場合playingに0が入ります。
E3DIsSoundPlaying musicid(1), playing
;演奏中でない場合
if playing = 0 : E3DPlaySound musicid(1), 1

;モーション番号3の5フレーム目を条件に音を鳴らします。
if motid = 3 && fram=5 : 効果音1= 1
;実際に音を鳴らします。
if 効果音1= 1 {

E3DPlaySound Soundid(1), 0
効果音1=0
}
if 効果音2= 1 {

E3DPlaySound Soundid(2), 0
効果音2=0
}
return

;追加ラベルの内容を書き込みます。
*Setweapon
;まず武器を装備する手のボーンの座標を取得
E3DGetBonePos hsid1,bon1,1,motid,fram,bposx,bposy,bposz
;武器を手のボーンの座標にセット
E3DSetPos weid1,bposx,bposy,bposz
;武器を装備する手のボーンの姿勢をクォータニオン形式で取得
E3DGetBoneQ hsid1, bon1, motid, fram, 2, dirQ
;クォータニオンにコピーされた手のボーンの姿勢の座標を、武器の姿勢の座標にセットします。
E3DSetDirQ2 weid1, dirQ
repeat 敵数
E3DDestroyHandlerSet Enid(cnt)
E3DDestroyHandlerSet weidE(cnt)
;[script9.hsp]の[Source2]がここに入ります
loop

return



*changemap
;データ削除(削除しないとマップ移動のたびに
;同じデータが重ねて読み込まれます。主人公データは最初しか読み込まないので削除しません。
E3DDestroyBG
E3DDestroyHandlerSet gid
E3DDestroyHandlerSet wid

;敵を攻撃した時の当り判定
repeat 敵数
if motid=3 && fram=10 && EnHP(cnt)>0:{
E3DGetPos hsid1, posx1, posy1, posz1
E3DPosForward hsid1,500 ;主人公を500前進させる
E3DGetPos hsid1, posxA, posyA, poszA;主人公を1000先の座標を取得
E3DSetPos hsid1, posx1, posy1, posz1 ;主人公の位置をもとにもどす
E3DGetPos Enid(cnt), posx, posy, posz;敵位置を取得
vecx = posx-posxA
vecy = posy-posyA
vecz = posz-poszA
;この命令で主人公の500先の位置から周囲1000以内に
;敵がいるかどうかを判別することができる。
E3Dvec3length vecx,vecy,vecz,length1
if length1<1000:{
;ここで敵のダメージアクション時間と、ビルボードを表示する場所を取得しておく
Endtim(cnt)=20
;乱数をセットする
range=5
E3DRand range, rand
rand-=2
DM = 攻撃力+rand
EnHP(cnt)-=DM
posEndx(cnt)=posx:posEndy(cnt)= posy:posEndz(cnt)= posz
}
}

loop


マップ移動=0
if stag=2{

repeat 敵数
E3DChkConfGround Enid(cnt), gid, mode, diffmaxy.0, -1.0, resultE(cnt), adjustxE(cnt), adjustyE(cnt), adjustzE(cnt), nx0, ny0, nz0
if ( resultE(cnt) != 0 ){
E3DSetPos Enid(cnt), adjustxE(cnt), adjustyE(cnt), adjustzE(cnt)
}
loop

;マップデータの読み込み
E3DLoadmqoFileAsGround dir_cur + "\\Media\\Field\\Map2.mqo",60.0 ,gid,0
;壁データの読み込み
E3DLoadmqoFileAsGround dir_cur + "\\Media\\Field\\Wall2.mqo",60.0 ,wid,0
;背景データ読み込み
E3DCreateBG scid1, dir_cur + "\\Media\\Field\\Dark.bmp", "n", 0, 0, 1, 10
;主人公をマップに配置

E3DSetPos hsid1, posx1, posy1, posz1
adjustx0=posx1:adjusty0=posy1:adjustz0=posz1
E3DSetBeforePos hsid1
}
if stag=1{
敵数=0
;マップデータの読み込み
E3DLoadmqoFileAsGround dir_cur + "\\Media\\Field\\Map1.mqo",60.0 ,gid,0
;壁データの読み込み
E3DLoadmqoFileAsGround dir_cur + "\\Media\\Field\\Wall1.mqo",60.0 ,wid,0
;背景データ読み込み
E3DCreateBG scid1, dir_cur + "\\Media\\Field\\Dark.bmp", "n", 0, 0, 1, 10

E3DSetPos hsid1, posx1, posy1, posz1
adjustx0=posx1:adjusty0=posy1:adjustz0=posz1
E3DSetBeforePos hsid1
goto*main
}
return


*MoveCamera
;カメラを作成
;主人公の座標をカメラ座標とカメラの注視点にセットして
;カメラ座標を微調整し整ます。
E3DGetPos hsid1, saveposx, saveposy, saveposz

backposx = saveposx
backposy = saveposy + 5000;カメラの位置をY座標+5000増加
backposz = saveposz - 7000;カメラの位置をZ座標7000減少
;カメラの位置を設定
E3DSetCameraPos backposx, backposy , backposz
;カメラの注視点を設定
E3DSetCameraTarget saveposx, saveposy , saveposz, 0.0, 1.0, 0.0
return

*ChkConf

;敵を攻撃した時の当り判定
repeat 敵数
if motid=3 && fram=10 && EnHP(cnt)>0:{
E3DGetPos hsid1, posx1, posy1, posz1
E3DPosForward hsid1,500 ;主人公を500前進させる
E3DGetPos hsid1, posxA, posyA, poszA;主人公を1000先の座標を取得
E3DSetPos hsid1, posx1, posy1, posz1 ;主人公の位置をもとにもどす
E3DGetPos Enid(cnt), posx, posy, posz;敵位置を取得
vecx = posx-posxA
vecy = posy-posyA
vecz = posz-poszA
;この命令で主人公の500先の位置から周囲1000以内に
;敵がいるかどうかを判別することができる。
E3Dvec3length vecx,vecy,vecz,length1
if length1<1000:{
;ここで敵のダメージアクション時間と、ビルボードを表示する場所を取得しておく
Endtim(cnt)=20
;乱数をセットする
range=5
E3DRand range, rand
rand-=2
DM = 攻撃力+rand
EnHP(cnt)-=DM
posEndx(cnt)=posx:posEndy(cnt)= posy:posEndz(cnt)= posz
}
}

loop


;地面の当り判定
;キャラクターが地面を這うように移動させる命令です。

mode=1
diffmaxy=300.0

E3DChkConfGround hsid1, gid, mode, diffmaxy, -1.0, result0, adjustx0, adjusty0, adjustz0, nx0, ny0, nz0

if ( result0 != 0 ){
E3DSetPos hsid1, adjustx0, adjusty0, adjustz0
}

repeat 敵数
E3DChkConfGround Enid(cnt), gid, mode, diffmaxy.0, -1.0, resultE(cnt), adjustxE(cnt), adjustyE(cnt), adjustzE(cnt), nx0, ny0, nz0
if ( resultE(cnt) != 0 ){
E3DSetPos Enid(cnt), adjustxE(cnt), adjustyE(cnt), adjustzE(cnt)
}
loop



return



*ChkConf2
; 壁とキャラクタのあたり判定
;キャラクターを壁で跳ね返らせる命令です。
resultwall = 0
E3DChkConfWall hsid1, wid, 50, resultwall, adjustx1, adjusty1, adjustz1, nx1, ny1, nz1

if resultwall != 0{
E3DSetPos hsid1, adjustx1, adjusty1, adjustz1
}


return



*Warp
;ワープポイントの設定
if stag=1 && adjustz1<-14500{
マップ移動=1 : stag = 2 : posx1=0.0: posy1=100.0: posz1=-1000.0
}
if stag=2 && adjustz1>5000{
マップ移動=1 : stag = 1 : posx1=0: posy1=100: posz1=-11000
}

if HP < 1 : マップ移動=1 : stag = 1 : HP = 最大HP : posx1=0: posy1=100: posz1=-6800

return


*DrawText
;文字を表示させる命令です
textposx=10: textposy=10
strchk="chkfps1:"+chkfps1
E3DDrawTextByFontID scid1,fontid1,textposx, textposy,strchk,1000,255,255,255





return



この記事に返信する


通りすがり

リンク

2017/8/21(Mon) 23:36:17|NO.81054

;モーションデータを読み込む命令です。
pathbuf = dir_cur + "\\Media\\Hero\\motion(he\\mo(he.moa"

ファイルパスとファイル名が違いますね。


外部DLLへの呼び出しに失敗しましたは ファイルがないときに出るはず。



HSP熊

リンク

2017/8/22(Tue) 17:23:32|NO.81059

どうゆうことですか?
ファイル名はあっているっぽく、
エラーの行数から敵に関係するEnidが関係してそうですが、
どのようにすればいいか分かりません。
できるだけ具体的にお願いします。



ソラ

リンク

2017/8/22(Tue) 17:35:30|NO.81060

existを使ってファイルが本当に存在するのか確認してみてください。



MillkeySoftw

リンク

2017/8/22(Tue) 19:29:31|NO.81062

dir_cur は、スクリプトエディタの最後に読み込みした場所に設定されます。
カレントフォルダが移動されてしまうと、dir_cur では読み込み不能になってしまうのでご注意ください。

実行ファイルがおかれているフォルダに対しての各フォルダを指定する場合、dir_exe + "\\media" などの dir_exe で絶対パスで指定するようにしましょう。



HSP熊

リンク

2017/8/22(Tue) 19:32:39|NO.81063

主人公だけで実行した時成功したので、
存在するはずの主人公のファイルも無いとでました。



HSP熊

リンク

2017/8/22(Tue) 19:48:12|NO.81064

MillkeySoftwさん
具体的にどうすればいいのですか?



ソラ

リンク

2017/8/22(Tue) 20:09:01|NO.81065

HSPスクリプトエディタでf1押すとヘルプが表示されます。
そこで命令や関数の意味を調べることができますよ。

で、そもそも文法に関してもよくわってないように感じます。
以下のスレで初心者向けのサイトが紹介されているので、確認してみてはどうでしょうか。
http://hsp.tv/play/pforum.php?mode=pastwch&num=69565



通りすがり

リンク

2017/8/22(Tue) 21:44:53|NO.81068

ファイルパスと名前が間違ってない前提

moaと同じフォルダ内に moaに登録されてるquaファイルがあるか見てみよう。
moaはテキスト形式で書いてあるから、メモ帳で


あと
謎の/////////(消すか無効に)
プロフェッションはプロジェクション



MillkeySoftw

リンク

2017/8/23(Wed) 00:36:08|NO.81073

よく見たら、これ初期化されていない配列変数に対して、DLL 側が代入しようとしてる為にエラーが発生しているんじゃないの?

;音楽データを読み込みます。 E3DLoadSound dir_exe + "\\Media\\sound\\firewind.wav",musicid(1) , 0, 1
musicid(1) って代入先が指定されてるけど、musicid という変数が事前に初期化されていない。
DLL側に変数再確保の処理が入ってないので普通にバッファオーバーフローエラー。

pathbuf = dir_cur + "\\Media\\Enemy\\m1.sig" E3DSigLoad pathbuf, Enid(cnt)
の Enid も同じ理由だと思う。ID 系を代入しているすべての変数を事前に初期化してみて。



ONION software Copyright 1997-2023(c) All rights reserved.