まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
以前、回転する敵にレーザーを撃たせようとして試行錯誤し結局出来なかった事がありまして、それを何とかしてみました。
問題点は弾の発射する位置です。例えば敵の位置をex,eyとしたら弾の発射位置はex+16,ey+16とかにしますよね。
この方法だと敵の中心から弾を撃つ場合は良いのですが、発射位置をずらすと困った事になります。
敵は回転するのに、弾の発射位置は回転しないので、発射させたい場所と実際に発射される場所がずれてしまうんです。
つまり、発射位置も回転させなければならないという事になります。
で色々と方法を考えてみました。
考え方としては、敵の中心から円を描きます。

この画像の白い円の部分に、発射場所を敵の回転画像に合わせて移動出来れば上手くいくはず・・・と思って作りました。
スクリプトはコチラ↓
*************************************
;弾発射
if (et.enemy>110)&(et.enemy<120){
es_exnew tama,1,249
if tama=-1 : return
if et.enemy=111 {
es_ang ex+40,ey+40,px+18,py+18 : pang2=stat;弾の発射方向
bork2=42.;発射位置(敵中心からの距離)
;■左レーザー発射位置計算
boer2=-pang2+130;発射位置(左側)
a=r*boer2;角度
boex2=bork2*cos(a)+ex+40;発射位置の円の計算x軸
boey2=bork2*sin(a)+ey+40;発射位置の円の計算y軸
;■右レーザー発射位置計算
boer3=-pang2+50;発射位置(右側)
a=r*boer3;角度
boex3=bork2*cos(a)+ex+40;発射位置の円の計算x軸
boey3=bork2*sin(a)+ey+40;発射位置の円の計算y軸
}
;●左レーザー表示
es_set tama,boex2,boey2,138,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang2,800 ;移動方向
es_effect tama,16,16,0,0,pang2,ESB_ADD,256
eh.tama=pang2
ename.tama=1
;●右レーザー表示
es_exnew tama,1,249
if tama=-1 : return
es_set tama,boex3,boey3,138,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang2,800 ;移動方向
es_effect tama,16,16,0,0,pang2,ESB_ADD,256
eh.tama=pang2
ename.tama=1
}
*************************************
まず敵が発生した第1フレーム目に弾の発射方向と弾の発射位置を計算します。
敵を中心とした円を計算し、その円の任意の場所(この場合boer2=-pang2+130の130)
を常に発射位置にするようにして発射させています。
実行させるとこんな感じ

この角度でも

この角度でも、弾の発射位置はちゃんと移動してくれました^^
それから、他のHSP製ゲームをやっていると良く弾のエフェクトがぼやけてる感じになっているのがあって、どうするんやろ?
と思って色々試してみたら出来ました^^
es_effect tama,16,16,0,0,pang2,ESB_ADD,256と言う部分でエフェクトを指定しているのですが
このESB_ADDと言う指定だけで、出来てしまいました。ホント凄いですhspdxfix。
ESB_ADDの説明を見てみると転送先に転送元画像の輝度を加算する半透明です。と書かれていますが
一体、どういう計算でこんなエフェクトになるのかは、私には全くわかりませんでした(汗)
問題点は弾の発射する位置です。例えば敵の位置をex,eyとしたら弾の発射位置はex+16,ey+16とかにしますよね。
この方法だと敵の中心から弾を撃つ場合は良いのですが、発射位置をずらすと困った事になります。
敵は回転するのに、弾の発射位置は回転しないので、発射させたい場所と実際に発射される場所がずれてしまうんです。
つまり、発射位置も回転させなければならないという事になります。
で色々と方法を考えてみました。
考え方としては、敵の中心から円を描きます。
この画像の白い円の部分に、発射場所を敵の回転画像に合わせて移動出来れば上手くいくはず・・・と思って作りました。
スクリプトはコチラ↓
*************************************
;弾発射
if (et.enemy>110)&(et.enemy<120){
es_exnew tama,1,249
if tama=-1 : return
if et.enemy=111 {
es_ang ex+40,ey+40,px+18,py+18 : pang2=stat;弾の発射方向
bork2=42.;発射位置(敵中心からの距離)
;■左レーザー発射位置計算
boer2=-pang2+130;発射位置(左側)
a=r*boer2;角度
boex2=bork2*cos(a)+ex+40;発射位置の円の計算x軸
boey2=bork2*sin(a)+ey+40;発射位置の円の計算y軸
;■右レーザー発射位置計算
boer3=-pang2+50;発射位置(右側)
a=r*boer3;角度
boex3=bork2*cos(a)+ex+40;発射位置の円の計算x軸
boey3=bork2*sin(a)+ey+40;発射位置の円の計算y軸
}
;●左レーザー表示
es_set tama,boex2,boey2,138,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang2,800 ;移動方向
es_effect tama,16,16,0,0,pang2,ESB_ADD,256
eh.tama=pang2
ename.tama=1
;●右レーザー表示
es_exnew tama,1,249
if tama=-1 : return
es_set tama,boex3,boey3,138,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang2,800 ;移動方向
es_effect tama,16,16,0,0,pang2,ESB_ADD,256
eh.tama=pang2
ename.tama=1
}
*************************************
まず敵が発生した第1フレーム目に弾の発射方向と弾の発射位置を計算します。
敵を中心とした円を計算し、その円の任意の場所(この場合boer2=-pang2+130の130)
を常に発射位置にするようにして発射させています。
実行させるとこんな感じ
この角度でも
この角度でも、弾の発射位置はちゃんと移動してくれました^^
それから、他のHSP製ゲームをやっていると良く弾のエフェクトがぼやけてる感じになっているのがあって、どうするんやろ?
と思って色々試してみたら出来ました^^
es_effect tama,16,16,0,0,pang2,ESB_ADD,256と言う部分でエフェクトを指定しているのですが
このESB_ADDと言う指定だけで、出来てしまいました。ホント凄いですhspdxfix。
ESB_ADDの説明を見てみると転送先に転送元画像の輝度を加算する半透明です。と書かれていますが
一体、どういう計算でこんなエフェクトになるのかは、私には全くわかりませんでした(汗)
PR
バトルガレッガや鋳薔薇なんかでの、円を描くような爆風を出したくて作ってみました。

スクリプトはこんな感じ↓
*************************************
bork=50.+rnd(100);敵の中心から爆風までの距離
repeat 8
es_exnew temp,1,499
if temp=-1 : break
boer1=boer1+20;爆風の移動速度
a=r*boer1+80;爆風の移動距離
boex1=bork*cos(a)+ex;爆風の円の計算x軸
boey1=bork*sin(a)+ey;爆風の円の計算y軸
if cnt=0 {;爆風の最初の位置と敵の位置の差
zx=ex-boex1
zy=ey-boey1
}
es_set temp,zx+boex1,zy+boey1,21;爆風を敵の死んだ位置まで移動して表示
es_effect temp,64,64,0,0,0,ESB_ALPHA,150; 爆風設置
es_type temp,16 ; 効果type値(16)
es_flag temp,%1000001100100001
loop
*************************************
考え方としては、まず敵を中心とした円状の爆風を作ります。
で、敵の位置と爆風の最初の発生位置の差を求めて、敵の死んだ位置に爆風を持ってきて表示させるといった感じです。
あと、敵を追加しました。

まっすぐ直進してきて、画面真ん中くらいで停止し弾を発射しながら色んな方向にバックしていきます。
スクリプトはこんな感じ↓
*************************************
*enemy8;直進→自機狙い弾
if et.enemy=1 : espeed.enemy=900;敵生成時間が1の時、敵のスピードを900に
if et.enemy<50{;敵生成時間が50以下の時
espeed.enemy-20;スピードを20マイナス
if espeed.enemy<0 : espeed.enemy=0;スピードが0以下になったら0に
es_adir enemy,0,espeed.enemy ;移動方向
}
if et.enemy>51{;敵生成時間が51以上の時
es_adir enemy,0,0 ;移動方向
}
if et.enemy>120{;敵生成時間が120以上の時
if et.enemy=121:reh.enemy=100+rnd(160);敵の移動方向
es_adir enemy,reh.enemy,300 ;移動方向
}
es_ang ex,ey,px,py;敵の向きの計算
es_effect enemy,48,48,0,0,stat;敵画像を回転表示
;弾発射
if gtime¥20=0 : if jikicnt<150 : if et.enemy>51{
if (ex>0)&(ex<412)&(ey>0)&(ey<480){
es_exnew tama,1,499
if tama=-1 : return
es_set tama,ex+18,ey+18,38,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_aim tama,px+18,py+18,500 ;移動方向
es_ang ex+18,ey+18,px+18,py+18
eh.tama=stat
ename.tama=1
}
}
return
*************************************
直進してきて停止する時に、ブレーキをかけるように徐々にスピードを落としたかったので
ループの度にスピードを引いていって徐々に停止するようにしました。
弾は自機狙い弾を撃たせています。
スクリプトはこんな感じ↓
*************************************
bork=50.+rnd(100);敵の中心から爆風までの距離
repeat 8
es_exnew temp,1,499
if temp=-1 : break
boer1=boer1+20;爆風の移動速度
a=r*boer1+80;爆風の移動距離
boex1=bork*cos(a)+ex;爆風の円の計算x軸
boey1=bork*sin(a)+ey;爆風の円の計算y軸
if cnt=0 {;爆風の最初の位置と敵の位置の差
zx=ex-boex1
zy=ey-boey1
}
es_set temp,zx+boex1,zy+boey1,21;爆風を敵の死んだ位置まで移動して表示
es_effect temp,64,64,0,0,0,ESB_ALPHA,150; 爆風設置
es_type temp,16 ; 効果type値(16)
es_flag temp,%1000001100100001
loop
*************************************
考え方としては、まず敵を中心とした円状の爆風を作ります。
で、敵の位置と爆風の最初の発生位置の差を求めて、敵の死んだ位置に爆風を持ってきて表示させるといった感じです。
あと、敵を追加しました。
まっすぐ直進してきて、画面真ん中くらいで停止し弾を発射しながら色んな方向にバックしていきます。
スクリプトはこんな感じ↓
*************************************
*enemy8;直進→自機狙い弾
if et.enemy=1 : espeed.enemy=900;敵生成時間が1の時、敵のスピードを900に
if et.enemy<50{;敵生成時間が50以下の時
espeed.enemy-20;スピードを20マイナス
if espeed.enemy<0 : espeed.enemy=0;スピードが0以下になったら0に
es_adir enemy,0,espeed.enemy ;移動方向
}
if et.enemy>51{;敵生成時間が51以上の時
es_adir enemy,0,0 ;移動方向
}
if et.enemy>120{;敵生成時間が120以上の時
if et.enemy=121:reh.enemy=100+rnd(160);敵の移動方向
es_adir enemy,reh.enemy,300 ;移動方向
}
es_ang ex,ey,px,py;敵の向きの計算
es_effect enemy,48,48,0,0,stat;敵画像を回転表示
;弾発射
if gtime¥20=0 : if jikicnt<150 : if et.enemy>51{
if (ex>0)&(ex<412)&(ey>0)&(ey<480){
es_exnew tama,1,499
if tama=-1 : return
es_set tama,ex+18,ey+18,38,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_aim tama,px+18,py+18,500 ;移動方向
es_ang ex+18,ey+18,px+18,py+18
eh.tama=stat
ename.tama=1
}
}
return
*************************************
直進してきて停止する時に、ブレーキをかけるように徐々にスピードを落としたかったので
ループの度にスピードを引いていって徐々に停止するようにしました。
弾は自機狙い弾を撃たせています。
中ボスの攻撃を追加しました。とりあえず3種類の攻撃を繰り返すようにしています。
第一攻撃は10方向に5発づつ発射角度をずらしながら撃ってきます。

スクリプトはこんな感じ↓
*************************************
*enemy7tama1;10方向5連射
matu-;弾発射待ち時間をマイナス
if matu>0 : return;待ち時間が1以上ならリターン
ang+;弾の発射角度をプラス
repeat 10
es_exnew tama,1,499
if tama=-1 : return
if ang=1 : pang=-6
if ang=2 : pang=-3
if ang=3 : pang=0
if ang=4 : pang=3
if ang=5 : pang=6
es_set tama,ex+190,ey+72,135,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang+cnt*36,300 ;移動方向
es_effect tama,16,16,0,0,pang+cnt*36;エフェクト方向
ename.tama=2;弾の名前
eh.tama=pang+cnt*36;弾の移動方向(消す時の為)
loop
if ang=5:ang=0:matu=10;5発撃ったら10フレーム待つ
return
*************************************
このスクリプトは右回転で撃つのですが、これと反対のスクリプトを発射時間をずらして発射させています。
最初、「5発撃って待つ」のやり方がわからず色々悩んだ結果、待つ為の変数matuを用意して変数matuが0以上の時は発射しない。
matuが0になったら発射させる事で上手く行きました。
第2攻撃は自機狙いレーザーを5発発射場所を変えて撃ってきます。

スクリプトはこんな感じ↓
*************************************
*enemy7tama3;レーザー
es_exnew tama,1,249
if tama=-1 : return
if et.enemy=401 : es_ang ex+330,ey+110,px+18,py+18 : pang2=stat;弾の移動方向
es_set tama,ex+330,ey+110,83,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang2,800 ;移動方向
es_effect tama,16,16,0,0,pang2;エフェクト方向
eh.tama=pang2;;弾の移動方向(消す時の為)
ename.tama=1;弾の名前
return
*************************************
これを発射場所と発射時間をずらして、5回発射させています。
これは、弾の発射時に移動方向を決めて、それに続いてレーザー画像を表示させる事でレーザーっぽく見せています。
(実際は短い弾がつらなっているだけ)
第3攻撃は5方向に弾速が違う弾を撃ってきます。良くある最初に撃った弾を後から撃った弾が追い抜かしていくような感じです。

スクリプトはこんな感じ↓
*************************************
このラベルに来る前にtspeed=0を実行しておく。
*enemy7tama8;5方向追い抜き
tspeed+80;弾の速度をプラス
repeat 5
es_exnew tama,1,499
if tama=-1 : return
ang+;弾の発射角度をプラス
if ang=1 : pang=0
if ang=2 : pang=10
if ang=3 : pang=-10
if ang=4 : pang=20
if ang=5 : pang=-20
es_set tama,ex+150,ey+30,58,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang,tspeed+100 ;移動方向
es_effect tama,16,16,0,0,pang;弾のエフェクト方向
ename.tama=2;弾の名前
eh.tama=pang;弾の移動方向(消す時の為)
if ang=5:ang=0
loop
return
*************************************
これは、es_adirで弾速を設定する時にリピートする度に速度を足していっています。
しかし自分は作っている本人なので、どういう攻撃をしてくるかわかっているので
ついつい難しくなりがちなんですよね・・・
かといって弾の数を減らすと、なんか物足りない感じもしますし、その辺の調整が難しいです。
第一攻撃は10方向に5発づつ発射角度をずらしながら撃ってきます。
スクリプトはこんな感じ↓
*************************************
*enemy7tama1;10方向5連射
matu-;弾発射待ち時間をマイナス
if matu>0 : return;待ち時間が1以上ならリターン
ang+;弾の発射角度をプラス
repeat 10
es_exnew tama,1,499
if tama=-1 : return
if ang=1 : pang=-6
if ang=2 : pang=-3
if ang=3 : pang=0
if ang=4 : pang=3
if ang=5 : pang=6
es_set tama,ex+190,ey+72,135,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang+cnt*36,300 ;移動方向
es_effect tama,16,16,0,0,pang+cnt*36;エフェクト方向
ename.tama=2;弾の名前
eh.tama=pang+cnt*36;弾の移動方向(消す時の為)
loop
if ang=5:ang=0:matu=10;5発撃ったら10フレーム待つ
return
*************************************
このスクリプトは右回転で撃つのですが、これと反対のスクリプトを発射時間をずらして発射させています。
最初、「5発撃って待つ」のやり方がわからず色々悩んだ結果、待つ為の変数matuを用意して変数matuが0以上の時は発射しない。
matuが0になったら発射させる事で上手く行きました。
第2攻撃は自機狙いレーザーを5発発射場所を変えて撃ってきます。
スクリプトはこんな感じ↓
*************************************
*enemy7tama3;レーザー
es_exnew tama,1,249
if tama=-1 : return
if et.enemy=401 : es_ang ex+330,ey+110,px+18,py+18 : pang2=stat;弾の移動方向
es_set tama,ex+330,ey+110,83,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang2,800 ;移動方向
es_effect tama,16,16,0,0,pang2;エフェクト方向
eh.tama=pang2;;弾の移動方向(消す時の為)
ename.tama=1;弾の名前
return
*************************************
これを発射場所と発射時間をずらして、5回発射させています。
これは、弾の発射時に移動方向を決めて、それに続いてレーザー画像を表示させる事でレーザーっぽく見せています。
(実際は短い弾がつらなっているだけ)
第3攻撃は5方向に弾速が違う弾を撃ってきます。良くある最初に撃った弾を後から撃った弾が追い抜かしていくような感じです。
スクリプトはこんな感じ↓
*************************************
このラベルに来る前にtspeed=0を実行しておく。
*enemy7tama8;5方向追い抜き
tspeed+80;弾の速度をプラス
repeat 5
es_exnew tama,1,499
if tama=-1 : return
ang+;弾の発射角度をプラス
if ang=1 : pang=0
if ang=2 : pang=10
if ang=3 : pang=-10
if ang=4 : pang=20
if ang=5 : pang=-20
es_set tama,ex+150,ey+30,58,1 ;敵弾スプライト設置
es_type tama,32 ;敵弾type値(32)
es_adir tama,pang,tspeed+100 ;移動方向
es_effect tama,16,16,0,0,pang;弾のエフェクト方向
ename.tama=2;弾の名前
eh.tama=pang;弾の移動方向(消す時の為)
if ang=5:ang=0
loop
return
*************************************
これは、es_adirで弾速を設定する時にリピートする度に速度を足していっています。
しかし自分は作っている本人なので、どういう攻撃をしてくるかわかっているので
ついつい難しくなりがちなんですよね・・・
かといって弾の数を減らすと、なんか物足りない感じもしますし、その辺の調整が難しいです。
ここ数日悩まされていたgmodeでの不具合が、なんとか解決出来ました^^
動作検証スクリプトを試してもらっても、他のパソコンでは不具合が出ないみたいなので、これは自分のパソコンが悪いのだろうと思い
(ちなみにThink Pad R32でMOBILITY RADEONの16Mです)
色々弄っていたのですがなおらず、ふとビデオカードのドライバはアップデートしたけど設定って変えてないな?と思い
設定を弄ってみると・・・なんと!治りました^^
具体的には↓の赤い部分の設定なのですが

このDirect3Dの垂直同期(VSYNCとか言う奴ですね)の設定が「アプリケーションで設定」になっていると不具合が出るんです。
これを「常にオフ」にしておくと大丈夫でした。
ちなみに垂直同期とは、「ディスプレイが1秒間に画面を書き換える回数で、ディスプレイの画面描画の速度を表す」そうです。
(IT用語辞典より)
と言う事は、アプリケーションで設定されていないから不具合が出るのだろうと思いhspdxfixの説明書を読んでみると
ちゃんと命令がありました。
es_syncなのですが、この命令ってただのウェイト命令だと思っていたら、VSYNCを待つ命令でもあったんです。
試しにes_sync 1とかにしてもフルスクリーン時は60FPSを維持します。(FPSは画面のリフレッシュレートによって変わる)
で、この命令のp2の値を1か2(VSYNCを待たない)に設定すれば、画面のちらつきをなくす事が出来ました!
なので、昨日の検証スクリプトならes_sync 16の所をes_sync 16,2にすればOKでした。
ただ、このVSYNCを待たない設定と言うのが正しい方法なのかどうか、私にはわかりませんし
hspdxfixの説明書にも普通は設定する必要はありません
とあるので、es_sync 16,2とするよりも、私のパソコンのdirect3Dの設定を「常にオフ」にしておいた方が良いかな?と思っています。
なんにせよ、原因がわかって良かったです^^
******************************************
8/21 16:00追記
direct3Dの設定を「常にオフ」にしていると、ゲームによってはとんでもないスピードで動いてしまう事が判明しました(汗)
なので、やはりHSP側で設定した方がよさそうな感じ。
それとes_excopyでは、この不具合が出ない事もわかりました。
******************************************
動作検証スクリプトを試してもらっても、他のパソコンでは不具合が出ないみたいなので、これは自分のパソコンが悪いのだろうと思い
(ちなみにThink Pad R32でMOBILITY RADEONの16Mです)
色々弄っていたのですがなおらず、ふとビデオカードのドライバはアップデートしたけど設定って変えてないな?と思い
設定を弄ってみると・・・なんと!治りました^^
具体的には↓の赤い部分の設定なのですが
このDirect3Dの垂直同期(VSYNCとか言う奴ですね)の設定が「アプリケーションで設定」になっていると不具合が出るんです。
これを「常にオフ」にしておくと大丈夫でした。
ちなみに垂直同期とは、「ディスプレイが1秒間に画面を書き換える回数で、ディスプレイの画面描画の速度を表す」そうです。
(IT用語辞典より)
と言う事は、アプリケーションで設定されていないから不具合が出るのだろうと思いhspdxfixの説明書を読んでみると
ちゃんと命令がありました。
es_syncなのですが、この命令ってただのウェイト命令だと思っていたら、VSYNCを待つ命令でもあったんです。
試しにes_sync 1とかにしてもフルスクリーン時は60FPSを維持します。(FPSは画面のリフレッシュレートによって変わる)
で、この命令のp2の値を1か2(VSYNCを待たない)に設定すれば、画面のちらつきをなくす事が出来ました!
なので、昨日の検証スクリプトならes_sync 16の所をes_sync 16,2にすればOKでした。
ただ、このVSYNCを待たない設定と言うのが正しい方法なのかどうか、私にはわかりませんし
hspdxfixの説明書にも普通は設定する必要はありません
とあるので、es_sync 16,2とするよりも、私のパソコンのdirect3Dの設定を「常にオフ」にしておいた方が良いかな?と思っています。
なんにせよ、原因がわかって良かったです^^
******************************************
8/21 16:00追記
direct3Dの設定を「常にオフ」にしていると、ゲームによってはとんでもないスピードで動いてしまう事が判明しました(汗)
なので、やはりHSP側で設定した方がよさそうな感じ。
それとes_excopyでは、この不具合が出ない事もわかりました。
******************************************
ここ数日、gmodeでの不具合に悩まされています。
es_copy命令を使う時にgmode1か2(透明色指定コピー)を選択するとフルスクリーン時に画面がちらつくんですよね・・・
こんな感じです→検証動画(右クリック→対象をファイルに保存で見てください)
動画では初めの方に2回ちらつくんですが、常にちらつくんじゃなくて不定期にちらついたり
ちらつかなかったりで原因が良くわからないんですよね・・・
でも家のもう一台のパソコンでは不具合が出ないので、私のパソコンが悪いのかと思って、BIOSやビデオカードのドライバを
アップデートしてみたのですが変わらず、検証スクリプトを作って色々と数値を変えて試してみたのですがやっぱり変化無し
掲示板などを検索してみたのですが、同じような不具合報告もみつけれずで、どうしたもんだか・・・と言った感じです。
こんな検証スクリプトを作って考えてます↓
*************************************
*start
#include "hspdxfix.as"
;■ DirectX 初期化&チェック
dialog "fullscreenで起動しますか?「はい」を選択した場合、画面解像度を640×480に変更します。",2,"Config"
if stat=6:screenmode=0
if stat=7:screenmode=1
es_ini 1124,1124,360;スプライト最大数2048,キャラクタ最大数1024,角度360度
es_screen 640,480,16,0,screenmode,1;directX使用時の解像度640*480
if stat=1 : goto *dxerr1
if stat=2 : goto *dxerr2
goto *setup
*dxerr1
dialog "DirectXの初期化に失敗しました。",1 : end
*dxerr2
dialog "スクリーンの初期化に失敗しました。",1 : end
*dxerr3
es_bye : wait 100
dialog "VRAMの容量が不足しています。",1 : end
*setup
;■ バッファへ画像の読みこみ
buffer 1,398,144,0 ;バッファ作成
pos 0,0 : picload "boss.gif",1 ;バッファへ読み込み
es_buffer 1,0 ;オフスクリーンバッファへの転送
if stat=1 : goto *dxerr3
gsel 0
repeat
es_cls
gmode 0,440,480:es_fill 0,0,100
pos 10,45:gmode 2:es_copy 1,0,0,398,144
es_sync 16
await 1
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
loop
*************************************
HSP3.0使用 hspdxfix使用 画像は↓を使用

私のパソコンでこのスクリプトを実行すると、画面が数秒に一回(不定期)ちらつくんですよね・・・
とりあえずの回避方法はスプライトを使用すればつらつかないんですが、できればes_copy命令を使えるようにしたいので
何とかならんもんかと思っているのですが・・・
es_copy命令を使う時にgmode1か2(透明色指定コピー)を選択するとフルスクリーン時に画面がちらつくんですよね・・・
こんな感じです→検証動画(右クリック→対象をファイルに保存で見てください)
動画では初めの方に2回ちらつくんですが、常にちらつくんじゃなくて不定期にちらついたり
ちらつかなかったりで原因が良くわからないんですよね・・・
でも家のもう一台のパソコンでは不具合が出ないので、私のパソコンが悪いのかと思って、BIOSやビデオカードのドライバを
アップデートしてみたのですが変わらず、検証スクリプトを作って色々と数値を変えて試してみたのですがやっぱり変化無し
掲示板などを検索してみたのですが、同じような不具合報告もみつけれずで、どうしたもんだか・・・と言った感じです。
こんな検証スクリプトを作って考えてます↓
*************************************
*start
#include "hspdxfix.as"
;■ DirectX 初期化&チェック
dialog "fullscreenで起動しますか?「はい」を選択した場合、画面解像度を640×480に変更します。",2,"Config"
if stat=6:screenmode=0
if stat=7:screenmode=1
es_ini 1124,1124,360;スプライト最大数2048,キャラクタ最大数1024,角度360度
es_screen 640,480,16,0,screenmode,1;directX使用時の解像度640*480
if stat=1 : goto *dxerr1
if stat=2 : goto *dxerr2
goto *setup
*dxerr1
dialog "DirectXの初期化に失敗しました。",1 : end
*dxerr2
dialog "スクリーンの初期化に失敗しました。",1 : end
*dxerr3
es_bye : wait 100
dialog "VRAMの容量が不足しています。",1 : end
*setup
;■ バッファへ画像の読みこみ
buffer 1,398,144,0 ;バッファ作成
pos 0,0 : picload "boss.gif",1 ;バッファへ読み込み
es_buffer 1,0 ;オフスクリーンバッファへの転送
if stat=1 : goto *dxerr3
gsel 0
repeat
es_cls
gmode 0,440,480:es_fill 0,0,100
pos 10,45:gmode 2:es_copy 1,0,0,398,144
es_sync 16
await 1
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
loop
*************************************
HSP3.0使用 hspdxfix使用 画像は↓を使用
私のパソコンでこのスクリプトを実行すると、画面が数秒に一回(不定期)ちらつくんですよね・・・
とりあえずの回避方法はスプライトを使用すればつらつかないんですが、できればes_copy命令を使えるようにしたいので
何とかならんもんかと思っているのですが・・・
カレンダー
| 02 | 2026/03 | 04 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
リンク
カテゴリー
最新記事
(04/04)
(12/26)
(12/25)
(11/17)
(10/11)
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
最古記事