|
![](../images/spacer.gif) |
|
2014/12/9(Tue) 08:39:45|NO.66362
STGを現在作ってみてるのですが
下記のスクリプトとにてエラーが発生しました。
#include "hspdx.as"
screen_x = 800 : screen_y = 600
screen 0,1600,1200
es_ini 1024,2048,360
es_screen screen_x,screen_y,32,2,1,1
if stat=1 : goto *dderr1
if stat=2 : goto *dderr2
goto *start ; 正常に完了
*dderr1
dialog "DirectXの初期化に失敗しました",1
end
*dderr2
dialog "スクリーンの初期化に失敗しました",1
end
*start
width 800,600,250,50
gsel 0
es_cls
es_sync
wait 100
<<中略>>
*enemy_newpop
if enemy_wait < enemy_popup : return
es_exnew dairi(0),24,1023
if dairi(0) = -1 : return
dairi(1) = rnd(700)
es_set dairi(0),dairi(1),-50,3
es_type dairi(0),4
es_adir dairi(0),0,10
enemy_maxhp(dairi(0)) = 10 : enemy_hp(dairi(0)) = 10
enemy_data(dairi(0)) = 0 : enemy_angle(dairi(0)) = 0
enemy_power(dairi(0)) = 5
enemy_wait = 0
return
*enemy_newpop は 一定frameごとに敵が新規出現するようにというイメージで描いたのですが
このラベルにgosubで飛んだあと突然ゲームがフリーズしてしまいます。
何のエラーも吐かずに止まります。
ほかにも自機弾の新規出現も似たような形式で描いたのですが
*hassa
if player1_overheat >= player1_heatlevel : return
es_exnew dairi(2),24,1023
if dairi(2) = -1 : return
es_get dairi(0),0,3 : es_get dairi(1),0,5
es_set dairi(2),dairi(0),dairi(1),1
es_type dairi(2),2
es_adir dairi(2),180,30
player1_heatlevel = 0
shotpower(dairi(2)) = 5
return
試しにnewpopの方をコメントにして飛ばないようにした結果
フリーズもせず自機は弾を発射できました。
自分でもわからないことが多くてこういうとこに投稿するには、
まだまだ足りないところが多いと思いますが
自分も経験不足ゆえかなかなかフリーズの原因と思われるものが見つけれません。
必要な情報等が不足していたらその都度教えていただけると助かります。
どうか、よろしくお願いします。
![](../images/bbs/mark_main.gif)
| |
|
2014/12/9(Tue) 08:42:32|NO.66363
余談で追加ですが 調べたらhspdxってそこまで早いわけではないらしいのですが
メリット・デメリットってそれぞれ何なのでしょうか。
hgimg3というのが使い勝手もよさそうらしいのですが・・・3?4?
|
|
2014/12/9(Tue) 21:42:58|NO.66369
一部抜き出したスクリプトでは問題が見つからない事が多い
不具合を再現出来ないと意味が無い
#include "hspdx.as"
screen_x = 800 : screen_y = 600
screen 0,1600,1200
es_ini 1024,2048,360
es_screen screen_x,screen_y,32,2,1,1
if stat : end
*start
buffer 3
picload dir_exe+"\\sample\\hspdx\\testchr.bmp"
es_buffer 0,2,,,1
if stat : end
es_size 64,64,60
es_pat 3, 0,64 ; リンゴ
gsel 0,1
es_cls
es_sync
wait 100
enemy_popup=5
*main
stick ky,$1f ; カーソルキーの情報を取得
if ky&$80 : goto *owari
gosub *enemy_newpop
es_cls 0,0,255 ; 青でクリア
es_draw ; スプライト描画
es_sync ; 画面の更新
await 16 ; タスク更新
enemy_wait++
goto *main
*enemy_newpop
if enemy_wait < enemy_popup : return
es_exnew dairi(0),24,1023
if dairi(0) = -1 : return
dairi(1) = rnd(700)
es_set dairi(0),dairi(1),-50,3,1
es_type dairi(0),4
es_adir dairi(0),0,100
enemy_maxhp(dairi(0)) = 10 : enemy_hp(dairi(0)) = 10
enemy_data(dairi(0)) = 0 : enemy_angle(dairi(0)) = 0
enemy_power(dairi(0)) = 5
enemy_wait = 0
return
*owari
end
サブルーチンのnewpopを通った後に問題が起きても
newpopには問題なくて他でも使いまわしてる変数が原因だったりする
*hassaの中でもdairi(0)が使われてるけどnewpopで内容が書き換わってるのは良いの?
>調べたらhspdxってそこまで早いわけではないらしいのですが
そこまでってのが何処までなのか分からないが
Direct3D使用なら標準の描画命令(gcopy等)の10倍ぐらい描画できる(半透明ならもっとかも)
DirectXなので当然PC構成依存になる
2Dに関しては、描画の優先度があり当り判定の使いやすさからhgimg3より良いかも
2Dでもアルファ情報付きPNGを使いたい場合はhspdxは使えなくなる
![](../images/bbs/mark_main_g.gif)
| |
|
2014/12/10(Wed) 04:58:43|NO.66372
>>一部抜出は分からないことが多い
*main
es_cls 255,,
stick player1_nowkey,31
gosub *zyanpu ;自機移動用サブルーチン
if player1_nowkey&16 : gosub *hassa
gosub *enemy_newpop
es_draw
es_sync
await
player1_heatlevel++
enemy_wait++
goto *main
*zyanpu
es_apos 0,0,0,0 : movespeedx = 0 : movespeedy = 0
if player1_nowkey&1 {
movespeedx = player1_movespeed * -1
es_apos 0,movespeedx,0,player1_movelevel
}
if player1_nowkey&2 {
movespeedy = player1_movespeed * -1
es_apos 0,movespeedx,movespeedy,player1_movelevel
}
if player1_nowkey&4 {
movespeedx = player1_movespeed * 1
es_apos 0,movespeedx,movespeedy,player1_movelevel
}
if player1_nowkey&8 {
movespeedy = player1_movespeed * 1
es_apos 0,movespeedx,movespeedy,player1_movelevel
}
return
>>dairi(0) がほかでも使われている
dairiってのはローマ字で書いてある通りの 代理で使ってます。
一時的に変数を収納するための配列変数として使っております。
現在選択中のスクリプトNoが入ってるという感じです。
hassaの時には(2)なっていますが。特にこれといった意味はありません。
>>そこまでってのがどこまでかわからない
すみません
こちらのサイトを見て思ったのですが → http://blog.livedoor.jp/toropippi/archives/cat_7440.html
何とも言えなくて質問しました。
|
|
2014/12/10(Wed) 22:57:51|NO.66402
>NO.66372
だから不具合を再現できないと意味が無い
こちらでとりあえず実行できるようにしたら普通に動いてしまう
コピペしてそのまま実行できないと問題点が見えなくなる
NO.66372のに問題があるとすれば
ウェイトが0なので数秒でスプライト1000枚出し終わってる事で何か起きてるか
>何とも言えなくて質問しました。
コピー命令だと重い(描画自体は遅くないだろうけど呼び出しコストが高くて小さいサイズを大量に描画するには向いてない)
描画モードがDirect3Dのスプライトならhgimg3と大差ないかもしれない
|
|
2014/12/11(Thu) 07:31:06|NO.66406
原因があるであろう場所がわかりました。
*main
es_cls 255,,
stick player1_nowkey,31
gosub *zyanpu ;自機移動用サブルーチン
if player1_nowkey&16 : gosub *hassa
gosub *enemy_newpop
gosub *enemy_myshot
es_draw
es_sync
await
player1_heatlevel++
enemy_wait++
gosub *time_countup
goto *main
*time_countup
repeat
es_find dairi(0),4,24,1023
if dairi(0) = -1 : break
enemy_timer2(dairi(0))++
if enemy_hp(dairi(0)) <= 0 {
es_kill dairi(0)
}
loop
return
*enemy_myshot
repeat
es_find dairi(1),4,24,1023
if dairi(1) = -1 : break
es_check dairi(0),dairi(1),2,1,24,1023
if dairi(0) = -1 : continue
enemy_hp(dairi(1)) = enemy_hp(dairi(1)) - shotpower(dairi(0))
es_kill dairi(0)
loop
return
time_countupは敵機のAIを調べるために使うタイマーです。
いろいろ見たところ 敵機は無事出てくるのですが この処理のどこかでフリーズしてるようです。
とは言えどまだわからないところが多いです・・・
enemy_myshotは敵機と自機弾のあたり判定を調べてるつもりです。
このラベルもフリーズの原因のようです。
・・・共通して言えることと言えばes_find ですが使い方を間違えてるのでしょうか。
>>描画モードがDirect3Dのスプライトならhgimg3と大差ないかもしれない
そういうことだったんですね。ありがとうございます。
|
|
2014/12/11(Thu) 13:45:45|NO.66407
すいません、自分の思い込みでした。
そりゃあそうですわ。ループから脱出できなければ止まりますよね。
ご迷惑おかけしました。
そして、暇人さんありがとうございました。
|
|