| 
 | 
 
								
									|  |  
 
 
 
 |  | 
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の方をコメントにして飛ばないようにした結果  
フリーズもせず自機は弾を発射できました。 
自分でもわからないことが多くてこういうとこに投稿するには、 
まだまだ足りないところが多いと思いますが
 
自分も経験不足ゆえかなかなかフリーズの原因と思われるものが見つけれません。 
必要な情報等が不足していたらその都度教えていただけると助かります。 
どうか、よろしくお願いします。
|  
 |  | 
 
 
 
 |  | 
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は使えなくなる
|  
 |  | 
 
 
 |  | 
2014/12/10(Wed) 04:58:43|NO.66372 
>>一部抜出は分からないことが多い
>>dairi(0) がほかでも使われている*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ってのはローマ字で書いてある通りの 代理で使ってます。 
一時的に変数を収納するための配列変数として使っております。
 
現在選択中のスクリプト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 
すいません、自分の思い込みでした。そりゃあそうですわ。ループから脱出できなければ止まりますよね。
 
 ご迷惑おかけしました。
 
 そして、暇人さんありがとうございました。
 
 | 
 
 
 |