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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1209
alcane続・hspdxfixでの質問 (es_exnew)6解決


alcane

リンク

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の方をコメントにして飛ばないようにした結果 
フリーズもせず自機は弾を発射できました。
自分でもわからないことが多くてこういうとこに投稿するには、
まだまだ足りないところが多いと思いますが

自分も経験不足ゆえかなかなかフリーズの原因と思われるものが見つけれません。
必要な情報等が不足していたらその都度教えていただけると助かります。
どうか、よろしくお願いします。



この記事に返信する


alcane

リンク

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は使えなくなる



alcane

リンク

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と大差ないかもしれない



alcane

リンク

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と大差ないかもしれない
そういうことだったんですね。ありがとうございます。



alcane

リンク

2014/12/11(Thu) 13:45:45|NO.66407

すいません、自分の思い込みでした。
そりゃあそうですわ。ループから脱出できなければ止まりますよね。

ご迷惑おかけしました。

そして、暇人さんありがとうございました。



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