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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0729
アイドル自作東方STG。東方隙間風の体験版をリリースしました!112解決


アイドル

リンク

2017/7/29(Sat) 11:09:16|NO.80729

皆さんのアドバイスやフォローのお陰でようやく自作ゲームが完成しました。
体験版のためまだ1面のみですが少し楽しんでいただけたら幸いです!


「不具合、要望、質問」などありましたら、こちらか私の掲示板に書き込んでくださいませ。
それではよき弾幕ライフを。
http://aitinn.wiki.fc2.com/wiki/%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8



この記事に返信する


ZAP

リンク

2017/7/29(Sat) 17:48:41|NO.80739

1プレイして気づいた点を。

・背景とキャラの明度差があまりないので、溶け込んで見づらいときがある。

あとはSTGとしての完成度を高める為の助言というか要望。

・やはり爆発グラフィックは欲しい。爆発があるとないとでは爽快感が違う。
・STGだし、ジョイパッドには対応して欲しい。

やりたいことはハッキリしているように見えたので、完成までがんばってほしいです。



チャーくん

リンク

2017/7/29(Sat) 18:27:39|NO.80740

弾幕アレルギーですが気になったのでDLしちゃいました
起動しようとするとウィンドウが表示された後、真っ白の状態で内部エラー38が発生します…

OSはWindows 10 Pro 1703 Creators Update (64bit)です
もっと詳しい情報が必要だったら言ってください



ÐℒℑÑĒℜ

リンク

2017/7/29(Sat) 21:24:23|NO.80742

>NO.80740
>OSはWindows 10 Pro 1703 Creators Update (64bit)
僕も全く同じOSです。
>起動しようとするとウィンドウが表示された後、真っ白の状態で内部エラー38が発生します…
これも同じですね。改善して欲しいです。
出来ればソースを出してくれたら原因とか解析出来るのですが...



アイドル

リンク

2017/7/29(Sat) 22:52:14|NO.80743

ZAPさん。ありがとうございます。

>>・背景とキャラの明度差があまりないので、溶け込んで見づらいときがある。
やはり桜は見づらい時がまだありますか・・・
石畳も弾幕が見づらくなっている原因になっているんですよね・・・
もっと暗くするしかないかな・・・

>>・やはり爆発グラフィックは欲しい。爆発があるとないとでは爽快感が違う。
やはりほしいですよね。
私の中で効率的に処理する方法が思いつかなくってやってなかったのです。
いや、一括で倒されたっていうフラグを持ってもらって、
フラグが立ったら処理するものを・・・あ、敵のループ回数か・・それでやめたのか・・

>>・STGだし、ジョイパッドには対応して欲しい。
昔JoyToKeyっていうのを使ってました。
このゲームで使えるかどうかわかりませんが・・・
オプションで用意できるのかな・・・リプレイでさえあんな苦労したのに・・・



アイドル

リンク

2017/7/29(Sat) 23:00:37|NO.80744

チャーくんさん。ありがとうございます。


>>起動しようとするとウィンドウが表示された後、真っ白の状態で内部エラー38が発生します…
>>OSはWindows 10 Pro 1703 Creators Update (64bit)です
内部エラー38が出ちゃう原因がちょっとわからないですね・・・
プラグインは「HSPDXFIX.DLL」を使ってますが、それがないとそのエラーがでます。
けれどプレイ出来ている人もいるので、原因を調査してきます。



 -以下デバックに使用したPC-
Windows 8.1 64ビット(6.3, ビルド 9600)
メモリー:4096MB
グラボ:NVIDIA GeForce GTX 770
DirectXバージョン: DirectX 11
BIOS:P2.00Z
ビデオメモリ:6028MB
普通にプレイできる


Windouws 8
1.9GHz
4GB
普通にプレイできる


Windouws 10
1.35GHz
8G
処理落ち(FPS:5)


Windouws 7
1.8GHz
8G
ショットを打ちながら斜め移動ができない



アイドル

リンク

2017/7/29(Sat) 23:07:26|NO.80745

ÐℒℑÑĒℜさん。ありがとうございます。


>僕も全く同じOSです。
ふぇぇ・・Windows 10 Proになにかあるのかな・・・
原因がわからない・・・
なお、上でもいってますがプラグインは「HSPDXFIX.DLL」を使っているのでそれがないとそのエラーがでます。


>これも同じですね。改善して欲しいです。
>出来ればソースを出してくれたら原因とか解析出来るのですが...
ソースはクソ長く1万行あるので、とてもお見せ出来るようなものではないです・・・
ちなみに冒頭部分はおくなっています。



#include "hspogg.as";音のために入れる #include "d3m.hsp" ;FPSをチェックする #include "hspdxfix.as";DXライブラリ使用 #const WM_SYSKEYDOWN $104 ;F10,Altキー無効 title "東方隙間風" ;DXライブラリ準備 width ,,450,200 ;ウィンドウの位置 es_ini ;system初期化 es_screen 640,480 ,0,0,1,1 font "MS ゴシック",20,1



MillkeySoftw

リンク

2017/7/29(Sat) 23:32:28|NO.80746

Windows 10 Pro Insider Preview (1703 Build 16251)
ダウンロードしたZIP の展開ファイルそのままで正常に稼働。

[気になったこと]
FPS は最大で 30なのかな?
ピンクの敵[中間]の女の子が出現すると著しく処理落ちが発生する。

一番簡単なところでしか試してないからその他のバグなどは調べてない。



アイドル

リンク

2017/7/30(Sun) 07:18:16|NO.80748

MillkeySoftwさん。ありがとうございます。


>>ダウンロードしたZIP の展開ファイルそのままで正常に稼働。
やはり「HSPDXFIX.DLL」が入ってないことが原因っぽいですね。


>>FPS は最大で 30なのかな?
「readme.txt」の「8.バージョン情報」に書いてあるけど60前後を保つようになっています。


>>ピンクの敵[中間]の女の子が出現すると著しく処理落ちが発生する。
思ったより処理に負荷がかかっているようです。
ゲーミングPCじゃないと動かないかも・・・・軽量化出来るかわかりませんがやってみます。
特にでかいピンク色の敵(でかい敵)が出てくると重くなる傾向があるようです。


>>一番簡単なところでしか試してないからその他のバグなどは調べてない。
一番出やすいところは新規機能のリプレイです(ぼそ



暇人

リンク

2017/7/30(Sun) 08:44:40|NO.80749

>内部エラー38が出ちゃう原因がちょっとわからないですね・・・
hspdx.txt(今HSPに同梱されてるのはHSPDXFIXと同じもの)には
※本プラグインの実行にはMSVCR71.DLLが必要になります。 エラーが出て実行
できない場合は作者サイト上にてファイルを用意していますのでダウンロード
してください。
と書いてある

でも、MSVCR71.dllが無いって最初にダイアログが出た後にエラー38が出るけど・・・
後考えられるのはDirectXの更新を一度もしてない可能性(OSインストールだけじゃ全ては入ってはいない)
http://www.microsoft.com/ja-jp/download/details.aspx?id=35
をやってみる

>>NO.80748
>思ったより処理に負荷がかかっているようです。
描画内容に比べて負荷が高すぎるので
多分Direct3DとDirectDrawを併用してる
全てDirect3Dを使用する設定を1して
es_bufferのテクスチャ使用フラグを1にする
(この場合画像サイズに制限が出るので注意、詳しくはhspdx.txt内Direct3D描画についてを参照)
描画命令は全てes_ex系を使いes_clsも使用しない
es_fmes、es_mes、es_fmesbuf、es_mesbuf等はデバッグ目的以外じゃ
メインゲーム中に常時表示には使わない



チャーくん

リンク

2017/7/30(Sun) 10:25:04|NO.80750

ダウンロードしてきたmsvcr71.dllをアプリケーションのあるフォルダに入れると
エラーが発生せずに実行できました…が、やはりネットブックだと遅くなりますね…
CPUもGPU(CPU内蔵)も揃いにそろってクソなので…20fpsが限界みたいです。

他の方からも出てますが、背景が暗くて弾幕がわかりづらいです。
東方原作のスクショを見てみると背景は暗めに設定されているみたいです。

将来的には、使用するフォントを変えてみたり、BGMを繋ぎ目なしでループさせたり、
背景を3D的な?動かし方にするといいと思います。



jsAster

リンク

2017/7/30(Sun) 13:11:38|NO.80752

東方アレルギー()ですがDLしてみました。

Win10
i5-6400
GTX750TiでFps40安定でした。



ソラ(元スペース)

リンク

2017/7/30(Sun) 13:42:53|NO.80754

OS:windows 10 Home 1703 Creators Update (64bit)
CPU:i7-2600
RAM:8.0
グラボ:GTX760
ビデオメモリ:6133MB
いくつか気になった点を。
・トップ画面が直感的に操作できない。マウス操作も出来るようにしてほしい。
・画面が小さい。
・重すぎる。大抵のオンゲ(TERA等)は高画質設定で余裕で動くけどこれだけは60でない。



あり

リンク

2017/7/30(Sun) 14:17:28|NO.80757

OS : Windows 7
CPU : AMD A6-3400M
GPU : Radeon HD 6550M
FPS : 平均62前後

6年ほど前のノートPCでは処理速度に問題はありませんでしたので
動作が重いのはOSやGPUが古いDirectXに対応できていない事が
原因ではないでしょうか?


ゲーム内容についてはボス戦で移動範囲が限定される攻撃ばかりなのに
自機は真正面にしか弾を撃てないのが厳しいですね。
難易度が上がるとさらに大変な事になるので初心者向きではないと感じました。

初っ端からラスボス級の敵と戦ったり、なぜか電車がやって来たりといった
要素は世界観的な問題は置いておくとして個人的には面白いと思います。



アイドル

リンク

2017/7/30(Sun) 14:39:58|NO.80758

暇人さん。ありがとうございます。


>>※本プラグインの実行にはMSVCR71.DLLが必要になります。 エラーが出て実行
色んなPCでエラー出なかったので「MSVCR71.DLL」のことをすっかり忘れていました・・・

>>後考えられるのはDirectXの更新を一度もしてない可能性(OSインストールだけじゃ全ては入ってはいない)
>>http://www.microsoft.com/ja-jp/download/details.aspx?id=35
なるほど、こういう案内も今後必要になってくるってことなんですね。
初めてユーザーにゲームを出したもんだから、全然考慮しきれてませんね・・・参考になります!


>>描画内容に比べて負荷が高すぎるので
>>多分Direct3DとDirectDrawを併用してる
>>全てDirect3Dを使用する設定を1して
やはり描画周りが重いですよね。
お恥ずかしながら「Direct3DとDirectDraw」っていう単語自体初めて聞きました。
「es_set」を見てみたのですがp5に設定があるのですね。
こういう命令系で「Direct3D」を使う設定にしてみます。

「es_screen」のp6では「1」にしてありますね。
ちなみに描画処理はこうなっているので「gmode 4,18,19,255 : es_copy 5,0,0」変えないとダメですね。見直すとひどい・・・


>>es_bufferのテクスチャ使用フラグを1にする
p3までしか設定していなかったので、p5まで設定してみます。

>>(この場合画像サイズに制限が出るので注意、詳しくはhspdx.txt内Direct3D描画についてを参照)
>>描画命令は全てes_ex系を使いes_clsも使用しない
>>es_fmes、es_mes、es_fmesbuf、es_mesbuf等はデバッグ目的以外じゃメインゲーム中に常時表示には使わない
「es_cls」は画面クリアに使ってますね・・・
「es_ex系」は一部の描画にしか使っていませんでした。
例えばボムとかだとこんな感じなので、それと似たようなことをしてみようと思います。
es_excopy 3,381,482, 381,449, 381,449, 0,0,0, ESB_ALPHA,100


これがゲームを出すってことか・・・対応大変だぁ((( ゜□゜)))
色々アドバイスありがとうございます!対応してみます。



アイドル

リンク

2017/7/30(Sun) 15:04:51|NO.80759

チャーくんさん。再度ありがとうございます!


>>ダウンロードしてきたmsvcr71.dllをアプリケーションのあるフォルダに入れると
>>エラーが発生せずに実行できました…が、やはりネットブックだと遅くなりますね…
>>CPUもGPU(CPU内蔵)も揃いにそろってクソなので…20fpsが限界みたいです。
おぉ、「msvcr71.dll」を入れると動作するのですね。次アップするときは同梱しておきます。
ノートPCでもデバックしましたがやはり重いですよね・・・
要求されるスペックが多きすぎたので、
これも課題になりそうですがまずは描画の軽量化を目指そうと思います。


>>他の方からも出てますが、背景が暗くて弾幕がわかりづらいです。
>>東方原作のスクショを見てみると背景は暗めに設定されているみたいです。
そうですね。今回のことで東方が何故暗めの背景なのかわかりました。
βテストで指摘され、一度桜を暗くしたのですがまだ見づらいですよね・・・
「背景全体的に暗めにする、自機を明るくするか、弾幕を明るくする」どれかやってみようと思います。


>>将来的には、使用するフォントを変えてみたり、BGMを繋ぎ目なしでループさせたり、
>>背景を3D的な?動かし方にするといいと思います。
使用するフォントですか、「LOGO!」ってやつを使っているので調整は可能ですね。
http://www.vector.co.jp/soft/dl/win95/art/se150487.html

BGMはなるべく自然にループするようにしてありますが、ポーズ画面からの復帰は地味にずれます。
なるべくずれないようにしたけどこれが今の私の限界ですね・・・

東方本家でも背景の3D的な描画はやってみたいと思っています!
とはいえ、それ用の画像やらなにゃやら必要になるので、これもすぐにはできそうもないです(´・ω・`)
(ちなみにドットは簡単な物以外描けないので、背景はお借りしたものです)



アイドル

リンク

2017/7/30(Sun) 15:07:35|NO.80760

jsAsterさん。ありがとうございます。


>>Win10
>>i5-6400
>>GTX750TiでFps40安定でした。

ひ・・ひぇ〜。やっぱ負荷がかかって(´・ω・`)
上記スペックでもFPS40はさすがにまずいですね・・・
まずは描画軽量化を目指します!



アイドル

リンク

2017/7/30(Sun) 15:21:26|NO.80761

ソラ(元スペース)さんありがとうございます。


いくつか気になった点を。
>>・トップ画面が直感的に操作できない。マウス操作も出来るようにしてほしい。
マウスか・・・う〜んできるのかな・・・
本家東方では無い機能なのでイメージが沸かないんですよね。

オプションの「デフォルト」の選択が←→ではなく、↑↓なのかよっていうのと、
「ZUN館モード」の中で切り替えもしにくいかも。
東方紺珠伝を参考にしたけど、少々わかりずらいかもしれない。


>>・画面が小さい。
オプションでサイズの変更をできるようにしたほうがよさそうですね。
ただ「es_screen」を使うとアスペクト比を気にしないといけないようなので、サイズ変更できるんでしょうかね・・・
「hspdxfix.as」を使ってから日が浅いので実力が不足していて申し訳ないです。可能な限りやってみます。


>>・重すぎる。大抵のオンゲ(TERA等)は高画質設定で余裕で動くけどこれだけは60でない。
>>OS:windows 10 Home 1703 Creators Update (64bit)
>>CPU:i7-2600
>>RAM:8.0
>>グラボ:GTX760
>>ビデオメモリ:6133MB
やはり【重さ】が一番の壁になってそうですね。
最優先として画像の描画の軽量化をしてみます。



アイドル

リンク

2017/7/30(Sun) 15:39:30|NO.80762

ありさん。ありがとうございます。


>>OS : Windows 7
>>CPU : AMD A6-3400M
>>GPU : Radeon HD 6550M
>>FPS : 平均62前後
>>6年ほど前のノートPCでは処理速度に問題はありませんでしたので
>>動作が重いのはOSやGPUが古いDirectXに対応できていない事が
>>原因ではないでしょうか?
古いDirectXについては、案内を「readme.txt」に記載すればある程度回避できそうですね。
OSやGPUは、まずは描画の軽量化をしてから判断してみようかと思います。


>>ゲーム内容についてはボス戦で移動範囲が限定される攻撃ばかりなのに
>>自機は真正面にしか弾を撃てないのが厳しいですね。
>>難易度が上がるとさらに大変な事になるので初心者向きではないと感じました。
なるほどですね。
確かに行動範囲が限定されていましたね。全然気が付かなかった・・・
自由に動かないといけないショットなのに、自由に動けないとはこれまたいかに・・・

ホーミングを入れた時期があったのですが、処理に失敗してそれっきりやめてました。
パワーアップしたらホーミング弾が1個か2個追加されてもいいかもしれません。
(パワーアップするのはボス手前ぐらいなので、そこら辺は別課題で考えます)


>>初っ端からラスボス級の敵と戦ったり、なぜか電車がやって来たりといった
>>要素は世界観的な問題は置いておくとして個人的には面白いと思います。
二番目のボス八雲は東方妖々夢のラスボスでだったり。
ノーマルではいきなし難しい弾幕をぶつけているので、
ノーマルが難しいっていう声があまりにも多かったら調節してみようかと思っています。

少しでも楽しめたら幸いです><



No name

リンク

2017/7/30(Sun) 15:44:29|NO.80763

●ウィンドウがアクティブになっているときだけキー操作ができるようにしてほしい。
●全画面に対応してほしい。



MillkeySoftw

リンク

2017/7/30(Sun) 16:07:02|NO.80766

[バグ]
タイトルにて、ファイルアクセス(I/O)が無限に行われている。



暇人

リンク

2017/7/30(Sun) 17:29:25|NO.80767

>>NO.80758
>ちなみに描画処理はこうなっているので「gmode 4,18,19,255 : es_copy 5,0,0」変えないとダメですね。見直すとひどい・・・
全てDirect3D系にすれば描画内容的には2,3ms程度だと思う

>「es_cls」は画面クリアに使ってますね・・・
es_exboxfで事足りるでしょう
てかスクロールシューティングなら背景描画で前の画面は全て書き換わってるんじゃ・・・

>>NO.80761
>オプションでサイズの変更をできるようにしたほうがよさそうですね。
お手軽なサイズ変更方法↓
座標等の変更必要なし

#include "hspdx.as" screen 0,150,100 mes "スクリーンサイズ" pos 30 button goto "通常",*label button goto "1.5倍",*label button goto "2倍",*label sr=1.0 stop *label if stat=1 { sr=1.5} if stat=2 { sr=2.0} screen 0,sr*640,sr*480,2 es_ini onexit *owari es_screen 640,480,32,,1,1 width sr*640,sr*480 gsel 0,1 *start buffer 3 picload "testchr.bmp" es_buffer 0,,,,1 gsel 0 *main stick ky,$1f if ky&$80 : goto *owari color 0,60,60 es_exboxf 0,0,640,480 pos 100,100 es_excopy 0,0,0,256,128,256,128 es_draw es_sync 16 await 0 goto *main *owari es_bye end
PC側の設定次第で拡大時にアンチエリアシングがかかるけど・・・



アイドル

リンク

2017/7/30(Sun) 18:05:19|NO.80768

No nameさん。ありがとうございます。


>>●ウィンドウがアクティブになっているときだけキー操作ができるようにしてほしい。
デバックしているとき何度か思ってた部分ですね。
今月末までにどうしてもリリースしたかったので後回しになってました。
不具合が発生しなければ次のアップデートで入れようと思います。

>>●全画面に対応してほしい。
全画面に対応した場合、サイズによる動作がどうなるのかまったく検討がつかないんですよね。
HSPの基準命令なら多分できると思うのですが、
hspdxfix.asを使ったサイズ変更の場合、アスペクト率を保たないといけない?ようなので、
実装できるのかちょっとわからないですが、出来そうならやってみます。



アイドル

リンク

2017/7/30(Sun) 18:13:34|NO.80769

MillkeySoftwさん。ありがとうございます。


>>タイトルにて、ファイルアクセス(I/O)が無限に行われている。
何故これが判明したのかちょっとお聞きしたいのですが・・・

メインループで「リプレイファイルが存在しているか、データーが変わってないか」取得しているため毎回アクセスしています。
なのでフラグ管理などで1回チェックさせるようにしてみようかと思います。

ゲームクリア後に更新する仕様にすれば問題なさそうかな。
後保険として、リプレイを再生する画面(本を読み返す)の時に処理するようにしてみます。



アイドル

リンク

2017/7/30(Sun) 19:01:05|NO.80770

暇人さん。再度ありがとうございます。


>>全てDirect3D系にすれば描画内容的には2,3ms程度だと思う
全てes_excopyで処理してみようと思います。


>>es_exboxfで事足りるでしょう
>>てかスクロールシューティングなら背景描画で前の画面は全て書き換わってるんじゃ・・・
あぁあああああ。基準命令の名残でes_clsを使ってました・・・
メインループ内には必要ないので削除します。


>>お手軽なサイズ変更方法↓
>>座標等の変更必要なし
>>PC側の設定次第で拡大時にアンチエリアシングがかかるけど・・・
おぉ、こんな方法があるんですね。
参考にしてみます!
-----------------------------------------------------
>>es_bufferのテクスチャ使用フラグを1にする
→p3までしか設定していなかったので、p5まで設定してみます。
サイズ制限がちょっと厳しそう(画像サイズが256ドット)
いったん「es_excopy」で処理してどうなるかで判断してみようかと思います。
ボム、背景とか表示する画像が大きいので、
画面の4分割のサイズを描画したやつを、それぞれ配置する方法になりそうです。



ソラ(元スペース)

リンク

2017/7/30(Sun) 19:29:30|NO.80771

>>>>タイトルにて、ファイルアクセス(I/O)が無限に行われている。
>>何故これが判明したのかちょっとお聞きしたいのですが・・・

タスクマネージャーのI/O読み取りで確認できるはずです。
https://gyazo.com/b2e03fb169ee19ae87aecbfad342b9a5



暇人

リンク

2017/7/30(Sun) 19:45:38|NO.80772

>>NO.80770
>サイズ制限がちょっと厳しそう(画像サイズが256ドット)
今のPCなら1024*1024ぐらいは大丈夫だろう
縦横同サイズも今は気にしなくて大丈夫だと思う
2の累乗サイズの画像を使っとけば問題ないと思う
(2の累乗になるように勝手に引き伸ばされたりする)



mirage17

リンク

2017/7/30(Sun) 20:45:09|NO.80773

モデル名
ドスパラ GALLERIA XT
OS
Windows 10 Home 64bit
バージョン 1703
CPU
インテル Core i7-7700
メモリ
8GB DDR4 SDRAM
SSD
500GB SSD
ハードディスク
2TB HDD
グラフィック機能
NVIDIA GeForce GTX1060 6GB (CUDA 1280)
サウンド
マザーボード 標準 オンボードHDサウンド
FPS
17〜62

購入して1カ月半の新しいPCで動作確認しました。
ゲームスタート時はFPS62出ていましたが、
ゲーム中で、敵の数や弾幕など(スプライト)が多い
時は、最大で、FPS17まで落ちて、少し重たい感じです。
PCはドスパラのゲームに最適化された、静音ゲームPCなので、
最新のオンライン3Dゲームなども動くPCなので、FPS17は
意外でした。ゲームとしては、面白かったです。
なお、このゲームはSSDではなくHDDから実行した結果です。

DirectXですが、基本は、DirectXランタイムがあれば、
正常動作しない時に、動く場合もありますが、それでも動かない場合は、
開発者用ですが、DirectXSDKを導入するとHSPの過去作品が、
動く場合もありましたね。

弾幕だけでなく電車や迷路みたいなのも出てきて、新鮮な部分もありました
ので、将来オリジナルゲームを作ってHSPプログラムコンテストに参加
したら、入賞できそうなぐらい、2Dシューティングの技能を感じました。
楽しい時間がすごせました。ありがとうございます。



アイドル

リンク

2017/7/30(Sun) 21:50:59|NO.80774

ソラ(元スペース)さん。ありがとうございます。

>>タスクマネージャーのI/O読み取りで確認できるはずです。
こんな確認方法があったんですね。
処理がうまくいったかはこれでも確認したほうがよさそうですね。
なるほど・・・PCゲームならではの考慮もでねば。


暇人さん。
>>今のPCなら1024*1024ぐらいは大丈夫だろう
>>縦横同サイズも今は気にしなくて大丈夫だと思う
>>2の累乗サイズの画像を使っとけば問題ないと思う
>>(2の累乗になるように勝手に引き伸ばされたりする)
あ、そうなんだー。
試しにes_bufferのp5を1にして処理に問題なかったんだけど、不具合が怖くって戻しちゃった。
自分のPCの環境がいい方だったので、1にしてから念の為色んなPCで見てみます。
2の累乗サイズならなんとかなりそうかな。



MillkeySoftw

リンク

2017/7/30(Sun) 21:57:20|NO.80775

ふと気になったことが・・・
すべてのスプライトの座標の管理って自前? それとも HSPDX 任せ?
(GPUデバッガー通したら 1秒間に 16000回のGPU命令を発行させてたので、気になって。)



田中

リンク

2017/7/30(Sun) 22:09:32|NO.80776

はじめまして。
ゲームプレイさせて頂きました。

皆様からいろいろ意見をもらってるとは思いますが、僕個人からも
感想と共にいくつかお返ししようと思い投稿しました。

■改善点
1.FPSの安定化
 ・原因はおそらく当たり判定だと思います。
  (迷路のところで一気に落ちたので)
 ・リプレイ機能
  (細かく見てないからわかりませんが、1フレームごとにファイルに書きに行ってるとかが
   遅くなる原因になってそうだと思いました)

2.演出について
 ・弾着表現
  敵に弾がぶつかった際に相手がダメージを負っていることを分かるようにする。
  (あの電車がダメージを受けてるのかがわからない)
 ・背景がつぶれてる(?)
  神社が横に引き伸ばしたように見えるので、神社を小さくするか、もう少し高い位置で
  戦っているように見せてあげるか、方法を考えた方がいいと思いました。

■感想
思ってた以上に機能の実装がされていて、すごく作りたい!って気持ちが伝わるゲームでした。
道中の弾幕は薄かったですが、ボス戦の弾幕は遊べるものになっていて、おもしろかったです。
(ラグってたのでめっちゃギリギリが狙えたので、60FPS出るようになったらきついかもですが・・・w)
引き続き楽しみながら作っていってください!!



アイドル

リンク

2017/7/30(Sun) 22:12:39|NO.80777

mirage17さん。ありがとうございます。


>>時は、最大で、FPS17まで落ちて、少し重たい感じです。
>>PCはドスパラのゲームに最適化された、静音ゲームPCなので、
>>最新のオンライン3Dゲームなども動くPCなので、FPS17は
>>意外でした。ゲームとしては、面白かったです。
実は私もドスパラのカスタマイズPCです。
私よりスペックがいいはずなのにどういうことなんだろう・・・

OS:Windows 8.1 64ビット(6.3, ビルド 9600)
CPU:intel(R) Core(TM)2 i5-4670 CPU @ 3.40GHz(4CPUs),〜3.4GHz
メモリー:4096MB
グラボ:NVIDIA GeForce GTX 770
DirectXバージョン: DirectX 11
BIOS:P2.00Z
ビデオメモリ:6028MB


>>DirectXですが、基本は、DirectXランタイムがあれば、
あるかどうか確認して処理をすればできそうな気がしますね。
ただ、優先順位としてはものすごく低くなりそうで、
命令も二度手間になりそうなので、対応は難しいかもしれませんね。

どこまで対応できるのか、自分の力量などを考慮しながら考えないといけませんね。


>>弾幕だけでなく電車や迷路みたいなのも出てきて、新鮮な部分もありました
やはり電車と迷路がインパクトできですよね。
ここらへんはやりたかった所だったので、色んなユーザーさんに引っかかってくれてうれしいです。


>>ので、将来オリジナルゲームを作ってHSPプログラムコンテストに参加
>>したら、入賞できそうなぐらい、2Dシューティングの技能を感じました。
>>楽しい時間がすごせました。ありがとうございます。
コンテストに出すかはちょっとわからないですね。
3面まで作ってそれをコミケに出すのが私の第一最終目標です。

まだまだ至らない点多いですが、楽しんでいただけたら幸いです。



アイドル

リンク

2017/7/30(Sun) 22:57:11|NO.80778

MillkeySoftwさん。


>>ふと気になったことが・・・
>>すべてのスプライトの座標の管理って自前? それとも HSPDX 任せ?
>>(GPUデバッガー通したら 1秒間に 16000回のGPU命令を発行させてたので、気になって。)
GPUデバッガー・・・これまた知らないものが・・・
スプライトの座標の管理っていうのがお恥ずかしながらわからないのです・・・
二次元配列で用意したものを、グループごとに処理しています。
例えば「敵」であれば下記の用に用意してあります。
---------------
二次元配列で用意する(ゲーム始まる前に実行します)

TEK_x(0,0) = xxx,xxx,xxx,xxx,xxx ;グループ1 TEK_x(0,1) = xxx,xxx,xxx,xxx,xxx ;グループ2 ...ect
メインループの敵出現処理です。

repeat TEK_Gmax ;グループ数 TEK_G = cnt repeat TEK_MAX ;敵の最大数 if TEK_f(cnt,TEK_G) = 0 : TEK_TIM(cnt,TEK_G) += 1 ;タイム ;画面外の敵を消す if TEK_x(cnt,TEK_G) <= -160 : TEK_f(cnt,TEK_G) = 2 ;← if TEK_x(cnt,TEK_G) >= 600 : TEK_f(cnt,TEK_G) = 2 ;→ if TEK_y(cnt,TEK_G) <= -190 : TEK_f(cnt,TEK_G) = 2 ;↑ if TEK_y(cnt,TEK_G) >= 740 : TEK_f(cnt,TEK_G) = 2 ;↓ switch TEK_G case 0 ;1グループ目 if TEK_TIM(cnt,TEK_G) >= 100 { if TEK_f(cnt,0) = 0 : TEK_f(cnt,0) = 1 ;敵のフラグを「立てる」 if TEK_f(cnt,0) = 1 { ;敵のフラグが「立ってたら実行」 if TEK_y(cnt,0) <= xxx : TEK_y(cnt,0) += 1 ;移動 if TEK_y(cnt,0) >= xxx : TEK_x(cnt,0) -= 1 ;移動 } } swbreak



アイドル

リンク

2017/7/30(Sun) 23:22:31|NO.80779

田中さんありがとうございます。


>>■改善点
>>1.FPSの安定化
>> ・原因はおそらく当たり判定だと思います。
>>  (迷路のところで一気に落ちたので)
あー・・迷路は古いソースをそのまま使っているので修正しなければいけませんね。
当たり判定ではなく配置に問題ありそうです。
配列で置いてあるように見えますが「cnt」で置いてあるんですよ・・・


>>・リプレイ機能
>>(細かく見てないからわかりませんが、1フレームごとにファイルに書きに行ってるとかが
>>遅くなる原因になってそうだと思いました)
1フレームごとに数値を増加して、ステージクリアした時に保存するか選択できるため、
メインループ内では「数値の増加」しか処理していないのです。
(保存する前にメモ帳で「replay1.dat」などを開くと、どのタイミングで保存されているかわかると思います)


>>2.演出について
>> ・弾着表現
>>  敵に弾がぶつかった際に相手がダメージを負っていることを分かるようにする。
>>  (あの電車がダメージを受けてるのかがわからない)
ザコ敵は1発で倒せるし、でかい敵も多くないのでやってなかったのですが、確かに必要な部分ですね。
これも爆風同様、効率的な処理ができれば実装できるかも(どっちかというとエフェクトを作れるか次第かな)

そして、普通のSTGだと、戦車とか飛行機の翼とかにダメージ与えられますね。
ダメージが与えられない物と、与えられる物の区別もできるようにしたほうがいいかもですね。
(2番目ボスでノーマルだと出現するやつらとか)


>> ・背景がつぶれてる(?)
>>  神社が横に引き伸ばしたように見えるので、神社を小さくするか、もう少し高い位置で
>>  戦っているように見せてあげるか、方法を考えた方がいいと思いました。
あー、ドットは簡単な物しか描けないので、一部お借りしている素材なんですよね。
元のサイズが128*192なので、無理やり修正した結果ああなった感じなんですよね。
なるほど高い位置か・・高差はSTGでは必要不可欠な要素ですね!


>>■感想
>>思ってた以上に機能の実装がされていて、すごく作りたい!って気持ちが伝わるゲームでした。
>>道中の弾幕は薄かったですが、ボス戦の弾幕は遊べるものになっていて、おもしろかったです。
>>(ラグってたのでめっちゃギリギリが狙えたので、60FPS出るようになったらきついかもですが・・・w)
>>引き続き楽しみながら作っていってください!!
何せ5年間という長期間粘ってましたからなぁ。愛はあります。
やはり道中の弾幕の薄さが気になりますか。
β版で指摘されてノーマルだけ増加してみましたが、イージはちょっとさみしいかもですね。

はい><引き続き頑張ってみます!



MillkeySoftw

リンク

2017/7/31(Mon) 00:01:20|NO.80780

こんなやり方もあるよというアドバイス

敵 A は、1 フレーム目に出現する、尚出現したら 1 フレーム毎に 1ドット上方に進む。
(これ、本来は DirectX 側[HSPDX]がやってくれる)

それをアイドルさんが自前で計算及び位置情報の再配置の指示を出しちゃってるので結果的に重くなる。
敵 A は 1 フレームで動ける距離が確定しているので、目的地に到着するフレーム数も逆算できるよね。

逆算できるってことは、目的地に到着するまで方向転換及び移動等の指示はいらないということだよね。
そうすると仮に方向転換のフレームが 2000 だとすると、[フレーム 2000 : 敵 A : 180度転換]という予定を立てておけばいい。
(方向転換前に敵 A が倒されているならその予定を無視すればいいだけ)



暇人

リンク

2017/7/31(Mon) 00:12:16|NO.80781

es_copyとes_excopyの簡単な速度比較
スペースで切り替え

#include "hspdx.as" es_ini onexit *owari es_screen 640,480,32,,1,1 *start buffer 3 picload "testchr.bmp" es_buffer 0 es_buffer 1,,,,1 gsel 0 title "es_copy" es_timer s_time,0 *main stick ky,32 if ky&$80 : goto *owari if ky&16 { ex^1 if ex=0 {title "es_copy"}else{title "es_excopy"} } color 0,60,60 es_exboxf 0,0,640,480 if ex=0 { repeat 300 pos rnd(600),rnd(400) es_copy 0,0,0,256,128 loop }else{ repeat 300 pos rnd(600),rnd(400) es_excopy 1,0,0,256,128,256,128 loop } es_draw color 255 pos 50,50 es_fmes "FPS="+FPS es_sync 16 await 0 fps_cnt++ es_timer n_time,0 if (n_time-s_time)>=1000 {s_time=n_time:FPS=fps_cnt:fps_cnt=0} goto *main *owari es_bye end
自分の環境だとes_copyでFPS30ぐらい
es_excopyならFPS60でCPU使用率最大で40%(コア1個に換算)ぐらい



アイドル

リンク

2017/7/31(Mon) 08:51:10|NO.80782

MillkeySoftwさん。再度ありがとうございます。


>>敵 A は、1 フレーム目に出現する、尚出現したら 1 フレーム毎に 1ドット上方に進む。
>>(これ、本来は DirectX 側[HSPDX]がやってくれる)
es_aposを使えば出来るのかな。
このプラグインを使ってから日が浅いので全然わかんないんですよね・・・まだ手を出すべきではなかったかも。

>>敵 A は 1 フレームで動ける距離が確定しているので、目的地に到着するフレーム数も逆算できるよね。
>>逆算できるってことは、目的地に到着するまで方向転換及び移動等の指示はいらないということだよね。
>>そうすると仮に方向転換のフレームが 2000 だとすると、[フレーム 2000 : 敵 A : 180度転換]という予定を立てておけばいい。
>>(方向転換前に敵 A が倒されているならその予定を無視すればいいだけ)
フレーム数はフレームレートを取得して、処理すればできそうな気がしますが、
これもイメージがぱっよ思い浮かばないの(´・ω・`)

両方共調べるのまでに時間かかりそうなので、いったんお返事のみで。



ÐℒℑÑĒℜ

リンク

2017/7/31(Mon) 12:49:00|NO.80783

本当だ...
圧縮ファイルだとちゃんと起動できる。
ありがとうございます。

ちなみにIPが違うのは別PCなんで成りすましので//



ÐℒℑÑĒℜ

リンク

2017/7/31(Mon) 13:00:29|NO.80784

☓ちなみにIPが違うのは別PCなんで成りすましので//
○ちなみにIPが違うのは別PCなんで成りすましじゃないので//



MillkeySoftw

リンク

2017/7/31(Mon) 13:20:16|NO.80785

>>フレーム数はフレームレートを取得して、処理すればできそうな気がしますが、
>>これもイメージがぱっよ思い浮かばないの(´・ω・`)
フレームレート 1秒 60 FPS として設計してるよね?

1秒後に目的地に到達させたければ、[60フレーム / 目的地までの距離 = 1フレームで進む距離]
で計算結果が出るよね。それを HSPDX のスプライト移動量に設定してあげればいい。

以下、HSPDX サンプルをちょこっと弄ったやつ。

#include "hspdx.as" #include "hsp3util.as" ; ; HSPDX.DLL sample1 ; スプライトを表示、カーソルキーで上下左右に移動。 ; スペースキーで、リンゴを発射。たくさん発射。 ; 左上にベンチマークを表示。 ; [ESC]キーで終了 ; ;------------------------------------------------------------------ es_ini ; system初期化 onexit *owari es_screen 640,480,32,,1,1 ; スクリーン初期化 if stat=1 : goto *dderr1 if stat=2 : goto *dderr2 goto *start ; 正常に完了 *dderr1 dialog "DirectXの初期化に失敗しました。",1 end *dderr2 dialog "スクリーンの初期化に失敗しました。",1 end *dderr3 es_bye wait 100 dialog "VRAMの容量が不足しています。",1 end ;------------------------------------------------------------------ *start buffer 3,,,1 bmppalette "testchr.bmp" picload "testchr.bmp" es_buffer 0,2 if stat : goto *dderr3 es_size 64,64,100 es_pat 0, 64,64 ; 顔 es_pat 1, 0,64 ; リンゴ gsel 0,1 es_cls es_sync wait 100 myx=100:myy=100 es_set 0,myx,myy,0 ; メインのスプライト es_type 0,1 //グループ 1 として設定[顔] a=0 tt=0 ky=0 FrameCounter = 0 ;フレームカウンタ *main stick ky,$1f ; カーソルキーの情報を取得 gosub *keychk if ky&$10 : gosub *ringo // if ky&$80 : goto *owari es_pos 0,myx,myy es_cls 0,0,255 ; 青でクリア es_draw ; スプライト描画 ;現在表示中のスプライト個数 et = 0 ef = 0 repeat es_find et,0,et : if et = -1 : break et+ ef+ loop ;衝突判定 ce = 0 repeat es_check ce,0,2 : if ce = -1 : break es_clear ce,1 ;顔にリンゴが衝突したらリンゴを消す loop if (tt >= 1){ ;文字列描画 pos 0,0 : es_mes "処理時間="+tt+" / FPS="+(1000/tt)+" / スプライト個数="+ef ; 文字列を描画 pos 0,15 : es_mes "現在のフレーム : "+FrameCounter } es_sync 16 ; 画面の更新(1000 / 60 = 16.6666666 小数点以下切り捨てなので 16) tt=stat ; ベンチマークを取得 await 0 ; タスク更新 FrameCounter++ ; フレームカウンタ加算 goto *main *ringo ; リンゴ発射 ; es_new a,2 es_set a,320,240,1 es_adir a,rnd(320),300 //ここの第三引数をいじるとリンゴのスピードが変化する。 es_type a,2 //グループ 2 として設定[リンゴ] return *owari es_bye end *keychk ; カーソルキー入力で自分(変数myx,myy)を動かすサブルーチン ; (カーソルキーを同時に押すことにより斜めにも移動できます) ; if ky&2 : goto *go_up ; 上を押しているか? if ky&8 : goto *go_down ; 下を押しているか? goto *keychk2 ; 左右のチェックにジャンプ *go_up if myy>-32 : myy-=8 goto *keychk2 *go_down if myy<380 : myy+=8 *keychk2 if ky&1 : goto *go_left ; 左を押しているか? if ky&4 : goto *go_right ; 右を押しているか? return *go_left if myx>-32 : myx-=8 return *go_right if myx<580 : myx+=8 return



No Name

リンク

2017/7/31(Mon) 16:34:17|NO.80786

ウィンドウがアクティブになっていないときでもZキーとXキーが反応してしまう。
ginfo_actでウィンドウがアクティブになっていないか調べる方がいいと思います。

repeat redraw 0 color 255,255,255:boxf if ginfo_act!-1{ getkey z,90 getkey x,88 if z=1:pos 0,0:color 0,0,0:mes "Zキーが押されました" if x=1:pos 0,0:color 0,0,0:mes "Xキーが押されました" } redraw 1 await 16 loop



アイドル

リンク

2017/7/31(Mon) 20:14:32|NO.80792

暇人さん。再度ありがとうございます><


うぉおお・・・
こんな感じで切り替えできるんですね。参考にしてみます!

「FPS」
es_copy:61前後
ex_excopy:62前後
あれ・・・昨日「ex_excopy」見た時は64だったような・・・

「CPU」
es_copy:10%前後
ex_excopy」:8%前後



アイドル

リンク

2017/7/31(Mon) 20:17:39|NO.80793

ÐℒℑÑĒℜさん。報告ありがとうございます。


>>圧縮ファイルだとちゃんと起動できる。
おぉ、よかったです><
まさかこんな落とし穴があるとは・・・

何か「意見、要望」などございましたら遠慮なく言ってくださいませ。



アイドル

リンク

2017/7/31(Mon) 20:23:13|NO.80794

MillkeySoftwさん。ありがとうございます。


>>1秒後に目的地に到達させたければ、[60フレーム / 目的地までの距離 = 1フレームで進む距離]
>>で計算結果が出るよね。それを HSPDX のスプライト移動量に設定してあげればいい。
ソースをいじくって理解を深めようと思います。
今は応急処置で画像の軽量化を優先します><すいません。



アイドル

リンク

2017/7/31(Mon) 20:47:27|NO.80795

No Nameさん。ありがとうございます。

>>ginfo_actでウィンドウがアクティブになっていないか調べる方がいいと思います。
おぉ、これなら私にもできますね。
不具合も出にくいから画像軽量化と一緒にやってみようと思います。



アイドル

リンク

2017/7/31(Mon) 20:48:36|NO.80796

ちょっとここから先はお返事遅れます。


下記の優先度で修正してバージョン0.1としてアップする予定です。
簡単なものなら一緒に修正できるので、
要望ご意見などがございましたら遠慮なく言ってくださいませ。


「画像軽量化」
1.es_clsを削除。
2.es_bufferのテクスチャ使用フラグを1(2の累乗サイズの画像を使う)
3.es_excopyにしてどんだけ軽量化されるか見る。

「その他」
1.ウィンドウのアクィブチェック
2.タイトルにて、ファイルアクセス(I/O)が無限に行われている。
3.背景の画像を暗くするか、自機を明るくすか、弾幕をあかるくする



7かず

リンク

2017/8/2(Wed) 19:09:23|NO.80807

面白そうだったので落としました。
ものすごくどうでもいい話かもしれませんが、winXP(ver2002 SP3)だと
とてもサクサク動きました。(50FPSを下回ることはなかったです)
これからの改良に期待です。



アイドル

リンク

2017/8/3(Thu) 22:54:34|NO.80815

7かずさん。ありがとうございます!

>>ものすごくどうでもいい話かもしれませんが、winXP(ver2002 SP3)だと
>>とてもサクサク動きました。(50FPSを下回ることはなかったです)
>>これからの改良に期待です。
XPはダウンロード案内が出来ない関係(マイクロソフトの更新ない)
でサポート対象外だったので動くか心配でしたのでありがたい報告です!


1.es_clsを削除。
2.es_bufferのテクスチャ使用フラグを1
3.es_excopyにしてどんだけ軽量化されるか見る。
上記完了しているので、下記対応で不具合がでなければ0.1として、
「8/5(土)、8/6(日)」ぐらいを目安にバージョンアップする予定です。

2の累乗サイズの画像を使う
「その他」
1.ウィンドウのアクィブチェック
2.タイトルにてファイルアクセス(I/O)が無限に行われている。
3.背景の画像を暗くするか、自機を明るくすか、弾幕をあかるくする



アイドル

リンク

2017/8/5(Sat) 11:37:28|NO.80832

自作東方STG。東方隙間風を0.1にバージョンアップしました。
https://yahoo.jp/box/Cg7NjP

主に画像処理を軽量化しましたが、
応急処置のため処理落ちする可能性がございます。
具体的な改善はしばらく時間がかかる見込みです。


次のアップデート0.2は、敵や弾の処理をフレームによる配置に修正する予定です。
下記の要望などはバージョン0.3以降に追加していく予定です。

「グラフィク」
・やはり爆発グラフィックは欲しい。爆発があるとないとでは爽快感が違う。
・敵に弾がぶつかった際に相手がダメージを負っていることをわからない(東方の円形ゲージに修正する予定)

「機能」
・STGだし、ジョイパッドには対応して欲しい。
・トップ画面が直感的に操作できない。マウス操作も出来るようにしてほしい。

「画面サイズ」
・画面が小さい。
・全画面に対応してほしい。

「システム」
・フォント変更、BGM繋ぎ目なしでループ、背景を3D化

「ゲームバランス」
・自機は真正面にしか弾を撃てないのが厳しいですね(パワーアップしたらホーミング弾が1個など考えておく)
■■■■■■■■■■■■■■■■■■■
■■■■バージョン0.1内容■■■■■■■
■■■■■■■■■■■■■■■■■■■
【発生している不具合】
・アイテムを自動回収できないときがある。
(再現率が1/5ぐらいで原因がわかってないため別スレッドで解決するつもり)

【修正内容】
・7.注意事項の内容を追記。
・「msvcr71.dll」を同梱。
・画像処理を少しだけ軽量化して修正。
・背景画像を少し暗くして見やすく修正。
・リプレイファイルのアクセスが無限に行われたのを修正。
・ウィンドウがアクィブ時のみキー入力を受け付ける用に追加。

【HSP向けの内容】
「画像軽量化」
1.es_clsを削除。
2.es_bufferのテクスチャ使用フラグを1
3.es_excopyに変更。
4.2の累乗サイズの画像に修正

「その他」
1.ウィンドウのアクィブチェック(if ginfo_act!-1)
2.リプレイファイルのアクセス無限

(起動時にリプレイ読み込みフラグを立てる、
その後フラグを0にすることにより一度しかアクセスしないようにした。
リプレイ保存した後にリプレイ読み込みフラグを立ててデータを読み込み、
フラグを0にすることにより一度しかアクセスしないように修正)



暇人

リンク

2017/8/5(Sat) 13:22:22|NO.80833

zipに
東方隙間風.exe
東方隙間風(0.1).exe
の二つ入ってますよ・・・



アイドル

リンク

2017/8/5(Sat) 16:39:23|NO.80838

暇人さん。

すいません言い忘れてました。わざと入れてあります。
動作確認した人とか比較用に入れてみたのですがいらなかったかもしれませんね。



暇人

リンク

2017/8/5(Sat) 18:33:24|NO.80840

190MBぐらいでエラー出てDL出来ないので無いほうが良かったかなと・・・
ブラウザ変えたらDL出来たのでプレイしてみました。

イージーでもFPS30ぐらいで敵が出だしたら20以下になってたのが
常時60以上をキープできてました。

ノーマルで多くの敵が同時に出現する時は一時的に負荷が増えましたが
処理落ちまでは行きませんでした。(最大でも1コア換算50%程度)
ボス戦でも同じ感じでFPSが下がる事は無かった

もっと処理軽減をしたいなら何処で負荷が高いか
処理ごとに時間を計って特定した方が良い



アイドル

リンク

2017/8/5(Sat) 18:57:52|NO.80841

暇人さん、再度ありがとうございます。


>>90MBぐらいでエラー出てDL出来ないので無いほうが良かったかなと・・・
それなら無い方がよさそうですね。
普段火狐だったので火狐でびDLしか確かめていませんでした。
なるほどこういうこともおきるのか・・・


>>イージーでもFPS30ぐらいで敵が出だしたら20以下になってたのが
>>常時60以上をキープできてました。
おぉ、効果そんなにあったのか。
自分のPCだとわからんから困ってた。


>>もっと処理軽減をしたいなら何処で負荷が高いか
>>処理ごとに時間を計って特定した方が良い
これについては調べたほうがよさそうですね。
今までやったことないのでちょっとわからないですが。
アドバイスと報告助かります。



mirage17

リンク

2017/8/5(Sat) 20:14:27|NO.80842

最近購入したドスパラのGALLERIA XTで再度
東方隙間風を0.1に挑戦しました。
(スペックは過去の私のコメントを参照してね。)
新しいバージョンのゲームで、FPS見ましたが、
FPS60以上を常にキープしていました。
スプライト(敵や弾幕など)が多いときや、
列車や迷路の所でも、イージーモードでは、
FPS60〜62出てました。良いのでは
ないでしょうかね。



暇人

リンク

2017/8/5(Sat) 21:30:55|NO.80843

>>NO.80841
>>今までやったことないのでちょっとわからないですが。

サブルーチン等で処理を別けてるなら簡単に出来る
HSPのサンプルを計測してみる

#module #uselib "kernel32.dll" #func QueryPerformanceFrequency "QueryPerformanceFrequency" sptr #func QueryPerformanceCounter "QueryPerformanceCounter" sptr //モジュール初期化 #deffunc QueryPerformance_init dim qpf,2 dim qpc,2 ddim qpt,1 QueryPerformanceFrequency varptr(qpf) if stat=0 {return -1} pf2=((4294967296.0+qpf)\4294967296.0)//符号付きintを正の数のdoubleにする pf2=(pf2+4294967296.0*qpf(1))//64ビットintをdoubleにする QueryPerformanceCounter varptr(qpc) if stat=0 {return -1} stqpc=((4294967296.0+qpc)\4294967296.0) stqpc=(stqpc+4294967296.0*qpc(1)) return 0 //---------QueryPerformance_init実行からの時間を単位を指定して取得-------- //GetQPtime(p1) // p1 = 何分の1秒かを指定(省略時1000)[ミリ秒なら1000] //整数部が指定単位になる #define global ctype GetQPtime(%1=1000) _GetQPtime(%1) #defcfunc _GetQPtime int q QueryPerformanceCounter varptr(qpc) qpt=((4294967296.0+qpc)\4294967296.0) return ((qpt+4294967296.0*qpc(1))-stqpc)/pf2*q #global QueryPerformance_init randomize celload dir_exe+"\\sample\\game\\face.bmp" ; 画像ファイル face_id=stat celdiv face_id,64,64,32,32 ; パーツのサイズと中心位置 screen 0,640,480 facemax=500 ; 物体の最大数 gosub *faceini tim_move10=0.0 tim_draw10=0.0 tim10=0.0 font "MS ゴシック",16,1 *main redraw 0 ; 描画始め tim=GetQPtime() tfps++ color 0,64,0 boxf ; 背景を消す tim_move=GetQPtime() gosub *facemove ; 物体を動かす tim_move=GetQPtime()-tim_move tim_move10+tim_move if (tfps\10)=0 {tim_move10_s=str(tim_move10/10):tim_move10=0.0} tim_draw=GetQPtime() gosub *facedraw ; 物体を描画 tim_draw=GetQPtime()-tim_draw tim_draw10+tim_draw if (tfps\10)=0 {tim_draw10_s=str(tim_draw10/10):tim_draw10=0.0} tim=GetQPtime()-tim tim10+tim if (tfps\10)=0 {tim10_s=str(tim10/10):tim10=0.0} color 255,255,255 pos 30,30 mes "main 1フレーム = "+tim mes "  10フレーム平均 = "+tim10_s mes "facemove 1フレーム = "+tim_move mes "  10フレーム平均 = "+tim_move10_s mes "facedraw 1フレーム = "+tim_draw mes "  10フレーム平均 = "+tim_draw10_s redraw 1 ; 描画終わり await 20 goto *main *faceini ; 物体の初期化 ; dim facex,facemax dim facey,facemax dim facepx,facemax repeat facemax facex(cnt)=rnd(640) ; X位置を決める facey(cnt)=rnd(480) ; Y位置を決める facepx(cnt)=rnd(5)-2 ; X位置の増分を決める loop return *facemove ; 物体を動かす ; repeat facemax facex(cnt)+=facepx(cnt) ; 横方向に動かす facey(cnt)+=4 ; 下に動かす if facey(cnt)>480 { ; 下まで行ったら上に戻す facey(cnt)=-64 facex(cnt)=rnd(640) ; X位置を決める facepx(cnt)=rnd(5)-2 ; X位置の増分を決める } loop return *facedraw ; 物体を描画 ; gmode 2 ; 画像モード repeat facemax pos facex(cnt),facey(cnt) celput face_id ; 画像の描画 loop return



アイドル

リンク

2017/8/5(Sat) 21:31:11|NO.80844

ダウンロードできないのはやばいので中身差し替えました。
https://yahoo.jp/box/dGO7Ab


mirage17さん。再度ありがとうございます。

>>新しいバージョンのゲームで、FPS見ましたが、FPS60以上を常にキープしていました。
>>スプライト(敵や弾幕など)が多いときや、列車や迷路の所でも、
>>イージーモードでは、FPS60〜62出てました。
おぉ、そんなに効果あるのかこれ・・・
私のPCではFPS60前後だけど、たまに「ん?」って思う時があるんだよね。
けれどFPSは下がってないという・・・
なのでここまで効果あったことに驚いています。

ただ決定的な軽量化にはいたってないので、新しいことを覚えていきます。



暇人

リンク

2017/8/5(Sat) 22:43:43|NO.80845

>>NO.80844
>ただ決定的な軽量化にはいたってないので、新しいことを覚えていきます。
NO.80778のを見る限りステージに出現する敵総数が多いだけで処理が増えるようになってる
敵の待機から発生して移動も全部同じループ内でしてるのを
待機から発生させたら移動等は別処理にした方が後々楽になると思う


他に気になったのが
> if TEK_f(cnt,TEK_G) = 0 : TEK_TIM(cnt,TEK_G) += 1 ;タイム
これだと1ステージの敵全てを毎フレームカウンター増加させてると思うんだけど
ステージフレームカウンターか何か用意して使えば良い気がする

STFC++ //ゲームメインループ内で実行 //敵発生の所で switch TEK_G case 0 ;1グループ目 if STFC >= 100 {//ってすれば良い



MillkeySoftw

リンク

2017/8/5(Sat) 23:08:50|NO.80846

修正お疲れ様です。バージョン 0.1 の動作改善確認できました。
以前のバージョン FPS 20 → 0.1バージョン FPS 60

[一部バグ]
リプレイ及びセーブデータを消して再度実行すると、「内部エラー 12 (ファイルが存在しないエラー)」が発生する。



アイドル

リンク

2017/8/6(Sun) 09:37:02|NO.80851

暇人さん。ソースありがとうございます。

>>サブルーチン等で処理を別けてるなら簡単に出来る
そういえば基準命令の名残でメインループに描画の処理していました・・・
ソースを改造しながら処理落ちの原因を調べようと思います。

まぁ、迷路の配置方法が古かったりするので直さないとなぁ。
--------
>>NO.80778のを見る限りステージに出現する敵総数が多いだけで処理が増えるようになってる
>>敵の待機から発生して移動も全部同じループ内でしてるのを
>>待機から発生させたら移動等は別処理にした方が後々楽になると思う
確かに、いない敵の処理をしちゃってますね。


>>他に気になったのが
> if TEK_f(cnt,TEK_G) = 0 : TEK_TIM(cnt,TEK_G) += 1 ;タイム
>>これだと1ステージの敵全てを毎フレームカウンター増加させてると思うんだけど
>>ステージフレームカウンターか何か用意して使えば良い気がする
なんでこれまで二次元配列でやっちゃんだんだろう・・・
別の用意してそれで一括処理の方がいいですね。



アイドル

リンク

2017/8/6(Sun) 09:45:05|NO.80852

MillkeySoftwさん。報告ありがとうございます。


>>修正お疲れ様です。バージョン 0.1 の動作改善確認できました。
>>以前のバージョン FPS 20 → 0.1バージョン FPS 60
色んな人の報告を受けて、ほぼほぼFPS60に保てるようになったかもしれませんね。
ただたまに「かくん」てするときがあるので、それを修正しないとですね。

>>リプレイ及びセーブデータを消して再度実行すると、
>>「内部エラー 12 (ファイルが存在しないエラー)」が発生する。
「ファイル自体を消した、実行中に書き換えた」場合そうなってしまいますね。
データ類がないのはイレギュラーなので優先度が低いですが、
ファイルがない時の保険をかけておくべきなのかな。



暇人

リンク

2017/8/6(Sun) 16:03:48|NO.80856

NO.80843のモジュールは倍精度浮動小数点数が必要なのに
hspdxは単精度浮動小数点数になってしまうため使えないので修正

#module #uselib "kernel32.dll" #func QueryPerformanceFrequency "QueryPerformanceFrequency" sptr #func QueryPerformanceCounter "QueryPerformanceCounter" sptr //モジュール初期化 #deffunc QueryPerformance_init ddim qpf,1 ddim qpc,1 ddim qpt,1 QueryPerformanceFrequency varptr(qpf) if stat=0 {return -1} pf2=double(strf("%I64u",qpf)) QueryPerformanceCounter varptr(qpc) if stat=0 {return -1} stqpc=double(strf("%I64u",qpc)) return 0 //---------QueryPerformance_init実行からの時間を単位を指定して取得-------- //GetQPtime(p1) // p1 = 何分の1秒かを指定(省略時1000)[ミリ秒なら1000] //整数部が指定単位になる #define global ctype GetQPtime(%1=1000) _GetQPtime(%1) #defcfunc _GetQPtime int q QueryPerformanceCounter varptr(qpc) return (double(strf("%I64u",qpc))-stqpc)/pf2*q #global
まぁ、hspdxのes_timerでもミリ秒で取得出来るけど・・・



アイドル

リンク

2017/8/8(Tue) 16:06:09|NO.80866

暇人さん。補足ありがとうございます。


あれから「タイトル、敵、背景」だけのソースにして、敵の移動と描画をgosubで別々にして処理してみました。
どこが重いのか調べるために、現在リリースしている処理のままにして下記(*1)のような感じで見たところ、

"main1F "+tim   → 0.67
"10F平均 "+tim10_s → 0.70
"移動1F "+tim_move   → 0.28
"10F平均 "+tim_move10_s → 0.27
"描画1F "+tim_draw   → 0.38
"10F平均 "+tim_draw10_s → 0.41

40匹敵が出て来るところになると一気に上記の数字になるので、
やはりスプライトの処理は必要だとわかりました。


下記(*1)

下記の部分はどういう処理なのかまだわからないため、とりあえず冒頭入れて、 >>#module >>〜〜 >>QueryPerformance_init ;2次元配列で準備 TEK_MAX = 5 ;敵の最大数(5) TEK_Gmax = 22 ;グループ数(22) dim TEK_f,TEK_MAX,TEK_Gmax ;フラグ dim TEK_x,TEK_MAX,TEK_Gmax ;X dim TEK_y,TEK_MAX,TEK_Gmax ;Y *タイトル 〜〜 goto *初期化 〜〜〜〜 ;******初期化****** *初期化 TEK_x(0,0) = 390,390,390,390,390 ;グループ1 右上 TEK_y(0,0) = -10,-50,-90,-130,-170 ;グループ1 右上 TEK_x(0,1) = 35,35,35,35,35 ;グループ2 左上 TEK_y(0,1) = -10,-50,-90,-130,-170 ;グループ2 左上 〜〜 〜〜〜〜 ;******ゲーム内メイン****** *ゲーム内メイン es_cls ;画面クリア tim = GetQPtime() tfps++ tim_move = GetQPtime() gosub *その他 gosub *敵の移動 ;移動1フレーム tim_move = GetQPtime()-tim_move tim_move10+tim_move if (tfps\10) = 0 { tim_move10_s = str(tim_move10/10) : tim_move10 = 0.0 } tim_draw = GetQPtime() gosub *敵の描画 ;描画1フレーム tim_draw = GetQPtime()-tim_draw tim_draw10 + tim_draw if (tfps\10) = 0 { tim_draw10_s = str(tim_draw10/10) : tim_draw10 = 0.0 } ;main tim = GetQPtime()-tim tim10+tim if (tfps\10) = 0 { tim10_s = str(tim10/10) : tim10 = 0.0 } pos 420,170 : es_mes "main1F "+tim pos 420,190 : es_mes "10F平均 "+tim10_s pos 420,210 : es_mes "移動1F "+tim_move pos 420,230 : es_mes "10F平均 "+tim_move10_s pos 420,250 : es_mes "描画1F "+tim_draw pos 420,270 : es_mes "10F平均 "+tim_draw10_s pos 420,300 : es_mes "TEK_TIM " + TEK_TIM ;FPS pos 430,415 : es_excopy 2,0,431, 28,16 fps_MOJ = "00" + str(d3getfps()) fps_SUTOK = strmid (fps_MOJ,-1,2) repeat 2 fps_SEI = int(strmid (fps_SUTOK,cnt,1)) ;整数値に変換 pos cnt*12 + 470,415 : es_excopy 2,fps_SEI * 11+185,197, 12,14 loop await 16 es_sync ;画面更新 goto *ゲーム内メイン ;***************敵の描画**************** *敵の描画 repeat TEK_Gmax ;グループ数(22) TEK_G = cnt repeat TEK_MAX ;敵の最大数(5) if TEK_f(cnt,TEK_G) = 1 { ;敵フラグが「立ってたら実行」 pos TEK_x(cnt,TEK_G), TEK_y(cnt,TEK_G) : es_excopy 5,0,0, 18,20 } loop loop return ;***************敵の移動**************** *敵の移動 if TEK_TIM <= 2810 : TEK_TIM += 1 ;敵が出るタイム repeat TEK_Gmax ;グループ数(22) TEK_G = cnt repeat TEK_MAX ;敵の最大数(5) ;画面外の敵を消す if TEK_x(cnt,TEK_G) <= -160 : TEK_f(cnt,TEK_G) = 2 ;← if TEK_x(cnt,TEK_G) >= 600 : TEK_f(cnt,TEK_G) = 2 ;→ if TEK_y(cnt,TEK_G) <= -190 : TEK_f(cnt,TEK_G) = 2 ;↑ if TEK_y(cnt,TEK_G) >= 740 : TEK_f(cnt,TEK_G) = 2 ;↓ ;移動 switch TEK_G case 0 ;1グループ目 if TEK_TIM >= 100 { if TEK_f(cnt,0) = 0 : TEK_f(cnt,0) = 1 ;敵のフラグを「立てる」 if TEK_f(cnt,0) = 1 { ;敵のフラグが「立ってたら実行」 if TEK_y(cnt,0) <= 300 : TEK_y(cnt,0) += 1 ;特定の場所に行くまで↓に移動 if TEK_y(cnt,0) >= 301 : TEK_x(cnt,0) -= 1 ;←に移動 } } swbreak case 1 ;2グループ目 if TEK_TIM >= 300 { if TEK_f(cnt,1) = 0 : TEK_f(cnt,1) = 1 ;敵のフラグを「立てる」 if TEK_f(cnt,1) = 1 { ;敵のフラグが「立ってたら実行」 if TEK_y(cnt,1) <= 300 : TEK_y(cnt,1) += 1 ;特定の場所に行くまで↓に移動 if TEK_y(cnt,1) >= 301 : TEK_x(cnt,1) += 1 ;→に移動 } } swbreak 〜〜 〜〜〜〜 swend loop loop return ;**********その他*********** *その他 SKRORU_c += 2 ;スクロール速度 pos 32,SKRORU_c+10 es_excopy 9,0,0 ,380,450 - SKRORU_c ;下の部分 if SKRORU_c not= 0 { ;0以外の時「実行」 pos 32,10 es_excopy 9,0,450 - SKRORU_c ,380,SKRORU_c ;上の部分 } if SKRORU_c >= 450 : SKRORU_c = 0 ;スクロール数を「リセット」 return



アイドル

リンク

2017/8/8(Tue) 16:15:44|NO.80867

スプライト処理はMillkeySoftwさんの参考にして、チマチマと理解しています(タブンネ)
四角形でも「es_size」のp3を100にすると見た目まんまになるのでそこは調節すればいけそう?

また、スプレイトで宣言した場合は、当たり判定は「es_check」を使わないとダメなのかな?
円形の場合は今まで下記の様な感じで処理してたんだけど、どうやらそうもいかなさそうで。

DK_tx = TE_x - TEK_TM_x DK_ty = TE_y - TEK_TM_y DK_tx *= DK_tx DK_ty *= DK_ty if(DK_tx + DK_ty <= 16.0) { ;大きさ(17,17) → 8*8 = 64(ちょん避けの為16) DK_HIT += 1 }
普通の円形は「円形半分*円形半分=判定」でいいんだけど、
東方の場合詐欺判定が多いので「=判定/4」の数値がいい感じだったんだよね。
この辺込みでURLを参照にしながらやろうと思う。多分1〜2ヶ月こもってくると思います。

「es_check」で検索したら過去に同じような人がいたので参考にしてみます。
ってかこちらも暇人さんですね。
http://hsp.tv/play/pforum.php?mode=pastwch&num=52885



7かず

リンク

2017/8/8(Tue) 16:26:45|NO.80868

新バージョンで背景の透過ができませんでした。

どうやらDirectXの最近のバージョンのどれかではHSPの背景色を切り抜くことができないらしい
です。前のバージョンでは、半透明・回転表示の時のみ背景色が表示されてしまっていたのですが、
今回のバージョンだと、画面がほぼすべて緑色になってしまいました。



アイドル

リンク

2017/8/8(Tue) 20:53:58|NO.80869

7かずさん。ありがとうございます。


>>新バージョンで背景の透過ができませんでした。
>>どうやらDirectXの最近のバージョンのどれかではHSPの背景色を切り抜くことができないらしいです
なんとそんなことが起きるんですか。

>>前のバージョンでは、半透明・回転表示の時のみ背景色が表示されてしまっていたのですが、
前のバージョンを上げる前に、回転表示が処理される際、その物体の周りが緑色が表示される不具合がありました。
修正して上記のことが発生しないことを確認してリリースしたのですが、
「DirectXの最近のバージョンのどれか」で発生するとなると、どのように手を打ったらいいのかわからない(´・ω・`)


>>今回のバージョンだと、画面がほぼすべて緑色になってしまいました
タイトルコールにある「フェアリー園児ぇるぅ」の周りに緑があるって感じですよね。
それも0.1の改善をしている最中に気がついて修正したのですが、これもなってしまうんですね。


緑色を透明に指定しているんだけど、この方法を変えればいいのかな。
・cvload
・アルファチャネルつきの画像描画機能(Artlet2D)
とかあるみたいだけど、現状描画による処理速度に苦しんでいる最中なので対応は難しいかも。
でも情報はすごくありがたいしできれば対応したい。


ちなみに今は下記のような感じ。

;準備 buffer 5 picload "teki.bmp" ;敵画像 es_buffer 5,,$00ff00,,1 gsel 0,1 gmode 1 〜〜〜 〜〜〜〜 *ゲーム内メイン ;描画 pos TEK_x(cnt,TEK_G), TEK_y(cnt,TEK_G) : es_excopy 5,0,0, 18,20 await 16 es_sync ;画面更新 goto *ゲーム内メイン



暇人

リンク

2017/8/8(Tue) 21:31:27|NO.80870

>NO.80868
>どうやらDirectXの最近のバージョンのどれかではHSPの背景色を切り抜くことができないらしい
これはHSPとは別でPC環境の問題になって来る・・・

↓の方法を試してみるとか

hspdxfix.dllを使用したゲームで画像の透過処理がされない
http://hsp.tv/play/pforum.php?mode=pastwch&num=77280



MillkeySoftw

リンク

2017/8/8(Tue) 21:54:33|NO.80871

なんとなくスプライト管理のサンプルスクリプトを作ってみた。
(顔が4方向に移動して画面外に移動するだけだけどね。)

ただこの方法でも、ゲーム中にスプライトを作成するので処理落ちが発生する。

#include "hspdx.as" #include "hsp3util.as" #module _HSPDX_SUPPORT_ #define global ES_EVENT_SPRITE_CREATE 1 #define global ES_EVENT_SPRITE_RUN 2 #define global ES_EVENT_SPRITE_STOP 3 #define global ES_EVENT_SPRITE_DELETE 4 /***************************************************** イベント用領域を新規作成します。 既にイベント領域が作られている場合、既存のイベントデータをすべて抹消し再作成します。 *****************************************************/ #deffunc es_EventCreate /* struct EventData{ int EventEnable; int EventFrameNo; int SPRITEID; int EventCategory; int ActionData_0; int ActionData_1; int ActionData_2; int ActionData_3; } */ _EventIndexSize = 4 * 8 ;イベント一つの構造体サイズ sdim _EventData,_EventIndexSize * 10000 ;イベント最大 10000個まで _EventDataLength = 0 ;イベント登録数 _EventDataActive = 0 ;イベントの現在のインデックス _DirectFrame = 0 ;現在のフレーム数(カウンタ) return /***************************************************** イベント用領域に新しいイベントデータを登録します。 *****************************************************/ #deffunc es_EventAdd int EventFrame,int SPRITEID,int EventCategory,int ActionData_0,int ActionData_1,int ActiveData_2,int ActionData_3 dim _EventIndexData,8 ;注意 : モジュール内共有 _EventIndexData(0) = 1,EventFrame,SPRITEID,EventCategory,ActionData_0,ActionData_1,ActionData_2,ActionData_3 memcpy _EventData,_EventIndexData,32,32 * _EventDataLength,0 _EventDataLength++ return /***************************************************** イベント処理メイン(ここでイベントの発生を管理します。 *****************************************************/ #deffunc es_EventAction repeat memcpy _EventIndexData,_EventData,32,0,_EventDataActive * 32 if _EventIndexData(0) == 0 : break if _EventIndexData(1) != _DirectFrame : break ;該当フレームのイベントデータじゃない場合その時点でループを抜ける ;該当フレームのイベントがある場合 switch _EventIndexData(3) case ES_EVENT_SPRITE_CREATE: ;スプライト作成処理 es_set _EventIndexData(2),_EventIndexData(4),_EventIndexData(5),0 swbreak; case ES_EVENT_SPRITE_RUN: ;スプライト移動指示 es_adir _EventIndexData(2),_EventIndexData(4),_EventIndexData(5) swbreak swend ;一つの処理が終わったらイベントの現在のインデックスを加算する _EventDataActive++ loop _DirectFrame++ return #global _HSPDX_SUPPORT_ ;スクリプトメイン es_ini ; system初期化 onexit *owari ;プログラム終了時の移動先 es_screen 640,480,32,,1,1 ; スクリーン初期化 ;スプライト用画像を読み込み buffer 4,,,1 bmppalette dir_exe+"\\sample\\hspdx\\testchr.bmp" picload dir_exe+"\\sample\\hspdx\\testchr.bmp" ;DRAM スプライトバッファ作成 es_buffer 0,2 ;スプライト作成 es_size 64,64,100 es_pat 0,64,64 //顔スプライト es_pat 1,0,64 //リンゴ ;画面操作先をデフォルト(0)に戻す gsel 0 ;メインループ前処理 es_cls es_sync ;ここでイベント(ステージ全体)の登録 es_EventCreate es_EventAdd 0,1,ES_EVENT_SPRITE_CREATE,100,-64 //リンゴを x.100 y.-64 位置に作成 es_EventAdd 0,1,ES_EVENT_SPRITE_RUN,0,300 //上記作成と同時にスプライトに移動指示(角度,スピード) es_EventAdd 150,1,ES_EVENT_SPRITE_RUN,80,300 es_EventAdd 250,1,ES_EVENT_SPRITE_RUN,160,300 es_EventAdd 350,1,ES_EVENT_SPRITE_RUN,240,300 es_EventAdd 450,1,ES_EVENT_SPRITE_RUN,0,300 es_EventAdd 550,1,ES_EVENT_SPRITE_RUN,80,300 es_EventAdd 650,1,ES_EVENT_SPRITE_RUN,160,300 es_EventAdd 750,1,ES_EVENT_SPRITE_RUN,240,300 es_EventAdd 850,1,ES_EVENT_SPRITE_RUN,0,300 ;メインループ *main es_cls es_EventAction es_draw ;スプライト描画 es_sync 16 await 0 goto *main ;プログラム終了時 *owari es_bye end



チャーくん

リンク

2017/8/8(Tue) 21:55:48|NO.80872

こちらではゲームの時は普通に表示されますが、タイトル画面や難易度選択の時にパチュリー以外
表示されないみたいです
FPSはCPUもGPUも揃いにそろってクソなので30で安定でした。



暇人

リンク

2017/8/9(Wed) 00:55:29|NO.80874

※hsptv_img.pngがあるフォルダが間違ってので修正して再掲載

スプライトの有利性
アニメーション、当たり判定、直線移動なら一度指定すれば良い
サイズはパターン登録時にするだけで良い
描画はes_drawがやってくれる(オプションで優先順位での描画もできる)
範囲外のスプライトは自動で削除される(生きてるスプライトだけ検索して処理すれば良い)

↓弾最大923発だして当たり判定のサンプル

#module #uselib "kernel32.dll" #func QueryPerformanceFrequency "QueryPerformanceFrequency" sptr #func QueryPerformanceCounter "QueryPerformanceCounter" sptr //モジュール初期化 #deffunc QueryPerformance_init ddim qpf,1 ddim qpc,1 ddim qpt,1 QueryPerformanceFrequency varptr(qpf) if stat=0 {return -1} pf2=double(strf("%I64u",qpf)) QueryPerformanceCounter varptr(qpc) if stat=0 {return -1} stqpc=double(strf("%I64u",qpc)) return 0 //---------QueryPerformance_init実行からの時間を単位を指定して取得-------- //GetQPtime(p1) // p1 = 何分の1秒かを指定(省略時1000)[ミリ秒なら1000] //整数部が指定単位になる #define global ctype GetQPtime(%1=1000) _GetQPtime(%1) #defcfunc _GetQPtime int q QueryPerformanceCounter varptr(qpc) return (double(strf("%I64u",qpc))-stqpc)/pf2*q #global QueryPerformance_init #include "hspdx.as" es_ini 1024 //スプライト最大1024個設定 es_screen 640,480,32,,1,1 buffer 3,512,512 picload dir_exe+"\\hsptv\\hsptv_img.png",2 es_buffer 0,0,0,,1 es_size 64,64,50,0 es_pat 0,0,192,24 es_pat 1,64,192,24 es_new myno,0 es_set myno,320-32,240-32,0 es_type no,1 es_link 0,1 es_link 1,0 es_size 32,32,100,0 repeat 4 es_pat 10+cnt,cnt*32,96,10 loop es_link 10,11 es_link 11,12 es_link 12,13 es_link 13,10 gsel 0 *gmain stick ky,$1f if ky&$e0 : goto *owari color 0,80,80 es_exboxf 0,0,640,480 gosub *tama tim_check=GetQPtime() hcnt=0 no=100 //100からが弾なので、ここから検索 repeat //スプライトの最大数は1024と設定してますが、使えるNOは0〜1023になる //es_checkは検索開始より終了のが小さいと通常の逆にナンバーを辿って検索する //これが問題で当たったNO+1を次の検察開始に使ってると //1023が当たった場合1023+1で1024になり検索終了の方が小さくなって //1024から逆に検索して、又1023が検索されて無限ループに・・・(if no=1023 {break} を追加でも良いが・・・) //なのでスプライトの最大数までes_checkする場合は個数をそのまま指定して回避 es_check no,myno,8,0,no,1024 if no<0 {break} //円判定いたいならここで判定すればかなり軽減できるでしょう hcnt++ //当たった数 no++ //重要:当たったNOの次から検索再開するので+1(これ忘れると無限ループ) loop tim_check=GetQPtime()-tim_check tim_draw=GetQPtime() es_draw tim_draw=GetQPtime()-tim_draw tim_find=GetQPtime() tcnt=0 no=100 //100からが弾なので、ここから検索 repeat es_find no,8,no if no<0 {break} tcnt++ //弾の数 no++ //重要:見つかったNOの次から検索再開するので+1(これ忘れると無限ループ) loop tim_find=GetQPtime()-tim_find es_exboxf 0,0,150,110,,,,,es_bfcalc(ESB_DESTCOLOR ,ESB_ZERO ),128 pos 5,5:es_mes "tim_check="+tim_check pos 5,5+20:es_mes "tim_draw ="+tim_draw pos 5,5+20*2:es_mes "tim_find ="+tim_find pos 5,5+20*3:es_mes "hcnt="+hcnt pos 5,5+20*4:es_mes "tcnt="+tcnt es_sync 16 await 0 fcnt++ goto *gmain *tama repeat 10 es_new no,100 if no<0 {break} es_set no,rnd(640),rnd(480),10,1 es_effect no,16+rnd(64),16+rnd(64),,,,es_bfcalc(ESB_ONE ,ESB_INVSRCCOLOR ),256 es_type no,8 es_aim no,320-16,240-16,10+rnd(500) loop return *owari end
描画と判定の軽さは頼った方が良いと思う



アイドル

リンク

2017/8/9(Wed) 08:22:49|NO.80875

暇人さん。フォローありがとうございます。

>>これはHSPとは別でPC環境の問題になって来る・・・
やっぱりそうなってしまうのですね><
これは「readme.txt」の「■4.困ったことがあったら」に追記しておきます。



MillkeySoftwさん。スクリプロありがとうございます。
>>なんとなくスプライト管理のサンプルスクリプトを作ってみた。
>>(顔が4方向に移動して画面外に移動するだけだけどね。)
>>ただこの方法でも、ゲーム中にスプライトを作成するので処理落ちが発生する。
ほぇ〜。こんな感じに移動もできるんですね。
他のソース解析もあるのでいったんお返事のみで><



チャーくんさん。

>>こちらではゲームの時は普通に表示されますが、タイトル画面や難易度選択の時にパチュリー以外
>>表示されないみたいです
画像の周りに緑色ですかね?
それだと上でやり取りしていることになりそうですね。

>>FPSはCPUもGPUも揃いにそろってクソなので30で安定でした。
ぐはー。やはりきちんとした対応しないと改善が見込めないってことか



エイカ

リンク

2017/8/9(Wed) 19:22:40|NO.80876

頑張っておられますね!
私もダウンロードさせて頂きました!

今は困らないと思いますが
念のため、一言

確か、oggを使用する際には
何か文面を記載する必要があったはずです
それが抜けてるかもしれませんよ

引き続き頑張ってくださいね!(*^_^*)



チャーくん

リンク

2017/8/10(Thu) 13:15:59|NO.80884

>チャーくんさん。

>画像の周りに緑色ですかね?
>それだと上でやり取りしていることになりそうですね。

いいえ、緑色の背景色の切り抜きはうまくいっているようです。
タイトル画面の背景、メニューの文字などがすべて真っ黒で見えない状態です。



アイドル

リンク

2017/8/12(Sat) 19:20:30|NO.80926

暇人さん。ソースありがとうございます。


正直まだ理解していない状態でして・・・(まともな当たり判定になっていない)
円形どころか四角形さえよくわかってない状態なので、
ソースに対してまともな返答が出来なくってすいません。
とりあえず時間がそれなりに経過してしまったのでお返事のみとなりますorz


ヘルプとソースを参考にチマチマとやっていきます。

#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini es_screen 640,480 ,0,0,1,1 font "MS ゴシック",20,1 buffer 4 picload "jiki.bmp" ;自機画像 es_buffer 4,,$00ff00,,1 es_size 28,42,100 ;自機 es_pat 5, 0,0 ;自機 ;画像の大きさの半分を指定する es_set 5, JIKI_x-14,JIKI_y-21, 5,1,1 ;自機 es_size 9,9,100 ;低速 /* p1=キャラクタのXサイズ p2=キャラクタのYサイズ p3=ヒットチェック領域(%) */ es_pat 4,46,43 ;低速 /* p1=キャラクタNo. p2=キャラクタパターンの左上X座標 p3=キャラクタパターンの左上Y座標 */ ;画像の大きさの半分を指定する es_set 4, TE_x-4,TE_y-4, 4,1,2 ;低速 /* p1=スプライトNo. p2=スプライトX座標 p3=スプライトY座標 p4=キャラクタNo. p5=描画モード(0=DirectDraw、1=Direct3D) */ buffer 5 picload "teki.bmp" ;敵画像 es_buffer 5,,$00ff00,,1 es_size 18,19,100 ;弾 es_pat 1,70,0 ;弾 /* p1=キャラクタNo. p2=キャラクタパターンの左上X座標 p3=キャラクタパターンの左上Y座標 */ ;画像の大きさの半分を指定する es_set 1,TAMA_x-9,TAMA_y-9, 1,1,3 ;弾 /* p1=スプライトNo. p2=スプライトX座標 p3=スプライトY座標 p4=キャラクタNo. p5=描画モード(0=DirectDraw、1=Direct3D) */ gsel 0,1 JIKI_x = 190 : JIKI_y = 330 ;自機の座標 TAMA_x = 220 : TAMA_y = 330 ;弾 ;****************メインループ*********** *メイン es_cls es_draw ; スプライト描画 pos 400,20 : es_mes "自機x " + JIKI_x pos 400,40 : es_mes "自機y " + JIKI_y pos 400,60 : es_mes "TE_x " + TE_x pos 400,80 : es_mes "TE_y " + TE_y pos 400,100 : es_mes "hit " + hit pos 400,120 : es_mes "ce " + ce ; pos 400,140 : es_mes "HIT " + HIT ;*************カウンター**************** gosub *自機の移動 gosub *青玉 ;自機 es_pos 5,JIKI_x,JIKI_y : es_set a,JIKI_x,JIKI_y, 5,1,1 es_type 5,5 ;グループ1 ;弾 es_pos 1,TAMA_x,TAMA_y : es_set a, 320,240, 1,1,3 es_type 1,1 ;グループ2 /* p1=スプライトNo. p2=スプライトX座標 p3=スプライトY座標 p4=キャラクタNo. p5=描画モード(0=DirectDraw、1=Direct3D) p6=優先順位(-32768〜32767) */ ce = 0 es_check ce,5,5 /* p1=結果が代入される変数名 p2=チェックの対象となるスプライトNo. p3=検索対象となるtype値 */ if ce = 1 : hit += 1 ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_pos 4,TE_x,TE_y : es_set a,TE_x,TE_y, 4,1,2 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 1.0 ;自機の低速スピード } else { JIKISpd = 2.0 ;自機のスピード } es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動 if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動 if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動 if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動 return ;***************青玉************** *青玉 /* 以前の場合 TM_tx = TE_x - TEK_TM_x TM_ty = TE_y - TEK_TM_y TM_tx *= TM_tx TM_ty *= TM_ty if(TM_tx + TM_ty <= 16.0) { ;大きさ(17,17) → 8*8 = 64(ちょん避けの為16) HIT += 1 } */ return



アイドル

リンク

2017/8/12(Sat) 19:31:17|NO.80927

エイカさん。


>>私もダウンロードさせて頂きました!
ありがとうございます!

>>確か、oggを使用する際には
>>何か文面を記載する必要があったはずです
>>それが抜けてるかもしれませんよ
そうだったんですね。
音は全て、「.wav」形式でdmmplayでやっているので問題ないですね。
oggにする時になったら気をつけてみます。
ちなみに著作権関連は最新の注意を払っています!

>>引き続き頑張ってくださいね!(*^_^*)
大変ですががんばります(´Д`)
画像軽量化成功して要望も出来る限りこなしたら2面作りたいです・・・
------------------
チャーくんさん。

>>いいえ、緑色の背景色の切り抜きはうまくいっているようです。
>>タイトル画面の背景、メニューの文字などがすべて真っ黒で見えない状態です。
真っ黒で見えないとな・・・
これもDirectXが関連しているんだろうか。
申し訳ございませんが私はわからないです><

描画の切り替え機能ってあってもいいかもしれないけど、
重いうえに不具合も出やすいことが予想されるので、対応は難しいかもですね><
(他の作業がないときにもっと具体的な策を探してみます)



暇人

リンク

2017/8/12(Sat) 21:04:09|NO.80928

>>NO.80926

> es_type 5,5 ;グループ1
typeは2の累乗で設定する
es_check,es_find等で1と2のtypeを一緒に検索する時は3を指定すれば両方検索できる
後、es_typeはes_pat後一回すれば良い(変更しないなら)



暇人

リンク

2017/8/12(Sat) 21:19:29|NO.80929

>タイトル画面の背景、メニューの文字などがすべて真っ黒で見えない状態です。
もしかしてサイズ制限に引っかかってる?
(サイズ制限でes_bufferが失敗してもstatは0が返る)
↓のは背景と es_excopy透過テスト って文字を二つ表示するサンプル

#include "hspdx.as" es_ini es_screen 640,480,32,,1,1 *start buffer 3,1024,512 picload dir_exe+"\\sample\\hspdx\\hspdx.bmp",1 es_buffer 0,0,0,,1 buffer 3,256,256 color boxf pos 8,8 font "MS 明朝",48,1+2+16 color 255,255,255 mes "es_excopy\n透過テスト" es_buffer 1,0,0,,1 buffer 3,256,128 color 0,255,0 boxf pos 8,8 font "MS 明朝",48,1+2+16 color 255,255,255 mes "es_excopy\n透過テスト" es_buffer 2,0,$ff00,,1 gsel 0 *main stick ky,$1f if ky&$80 : goto *owari gmode 0,640,480 pos 0,0 es_excopy 0,0,0 gmode 1,256,256 pos 200,100 es_excopy 1,0,0 gmode 1,256,256 pos 200,250 es_excopy 2,0,0 es_draw es_sync 16 await 0 goto *main *owari end



チャーくん

リンク

2017/8/13(Sun) 00:13:39|NO.80932

>暇人 さん
 よくわからないままとりあえず実行してみたんですが、背景と透過された文字2つが
 表示されました。サイズ制限は関係なかったってことでしょうか…?



そういえば東方新作に暗い背景に黒弾幕でわざと見づらくして殺しにかかってたのがいましたね



暇人

リンク

2017/8/13(Sun) 00:52:45|NO.80933

>>NO.80932
> 表示されました。サイズ制限は関係なかったってことでしょうか…?
NO.80929のでは引っかからなかったって事でしょう
東方隙間風が1024*512より大きいのを使ってるかどうかは分からないので・・・


> buffer 3,1024,512
> picload dir_exe+"\\sample\\hspdx\\hspdx.bmp",1
これを

buffer 3,2048,2048 picload dir_exe+"\\hsptv\\bg03.jpg",1
に置き換えて実行しても背景(宇宙)と文字が表示されるなら
東方隙間風の方に何か問題がある可能性も・・・
(画像を違うのにしてるのはes_bufferに失敗しても前回の内容が残ってる場合があるので失敗してても分からない事がある)



アイドル

リンク

2017/8/13(Sun) 20:47:20|NO.80938

暇人さん。ありがとうございます。


>>typeは2の累乗で設定する
ヘルプを見たら「1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768」
って書いてありました!知らなかったです・・・orz
16種類しかないので予め決めないといけないんですね。
自機系は1、敵キャラは2、弾幕は4みたいにわければいいのかな。

>>es_check,es_find等で1と2のtypeを一緒に検索する時は3を指定すれば両方検索できる
複数調べたい場合はtypeの合計値を見ればできるのはヘルプを見てわかったんだけど、、
スプライトとキャラの管理するところから入っているので、とりあえず単体で判定して理解したいところです(´Д`)

>>後、es_typeはes_pat後一回すれば良い(変更しないなら)
そうなんですかー。
円形ようやく出来たので直してみました><

#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini es_screen 640,480 ,0,0,1,1 font "MS ゴシック",20,1 buffer 4 picload "jiki.bmp" es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42,100 es_pat 2, 0,0 ;画像の大きさの半分を指定する es_set 2, JIKI_x-14,JIKI_y-21, 2,1,1 ;---低速--- es_size 9,9,50 es_pat 3,46,43 ;画像の大きさの半分を指定する es_set 3, TE_x-4,TE_y-4, 3,1,3 ;""""""""""""""""""" buffer 5 picload "teki.bmp" es_buffer 5,,$00ff00,,1 ;---弾--- es_size 18,19,50 es_pat 1,70,0 ;画像の大きさの半分を指定する es_set 1,TAMA_x-9,TAMA_y-9, 1,1,1 gsel 0,1 JIKI_x = 214 : JIKI_y = 313 ;自機の座標 TAMA_x = 220 : TAMA_y = 330 ;弾 ;****************メインループ*********** *メイン es_cls es_draw ; スプライト描画 pos 400,20 : es_mes "自機x " + JIKI_x pos 400,40 : es_mes "自機y " + JIKI_y pos 400,60 : es_mes "TE_x " + TE_x pos 400,80 : es_mes "TE_y " + TE_y pos 400,100 : es_mes "hit " + hit pos 400,120 : es_mes "EN_HIT " + EN_HIT ;*************カウンター**************** gosub *自機の移動 ;自機 es_pos 2,JIKI_x,JIKI_y es_set JIKI,JIKI_x,JIKI_y, 2,1,2 ;-----弾----- es_pos 1,TAMA_x,TAMA_y es_set 1, TAMA_x,TAMA_y, 1,1,1 es_type 1,16 ;グループ2 EN_HIT = 0 es_check EN_HIT,3,16 if EN_HIT = 1 : hit += 1 ;-----低速移動----- TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_pos 3,TE_x,TE_y es_set JIKI,TE_x,TE_y, 3,1,3 es_type 3,2 ;グループ1 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 1.0 ;自機の低速スピード } else { JIKISpd = 2.0 ;自機のスピード } es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動 if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動 if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動 if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動 return



アイドル

リンク

2017/8/13(Sun) 21:25:13|NO.80939

暇人さん。フォローありがとうございます!!

>>もしかしてサイズ制限に引っかかってる?
>>(サイズ制限でes_bufferが失敗してもstatは0が返る)
>>↓のは背景と es_excopy透過テスト って文字を二つ表示するサンプル

>>東方隙間風が1024*512より大きいのを使ってるかどうかは分からないので・・・
大きいやつだと「2400*1360」ですね。
この中にタイトルで表示されるものが全て入っています。
その画像から「pos 370,110 : es_excopy 1,0,736, 124,32」みたいな感じで取り出して使っております。
(ちなみに一番大きな画像は、タイトルなどの「640*480」です。)

もしこの方法に問題あるのなら分割して作成しようと思います。
しかし「es_buffer」のP1「オフスクリーンバッファID」は0〜63までしか確保できないので、
ただ単に拡張すればいいという話でもないので出来る範囲になってしまいそうです。



チャーくんさん。
>>よくわからないままとりあえず実行してみたんですが、背景と透過された文字2つが
>>表示されました。サイズ制限は関係なかったってことでしょうか…?
私側に原因ありそうですが一応念のため、
「NO.80933」をやってみてどのような結果になったか教えていただけ出ると助かります。

>>そういえば東方新作に暗い背景に黒弾幕でわざと見づらくして殺しにかかってたのがいましたね
これを見て初めて知りました。

東方では発売日から1週間はネタバレ禁止という暗黙のルールがある・・・
っと思ったら人それぞれっぽいですが、一応気にしてくれるとうれしいなと思ったり。



暇人

リンク

2017/8/13(Sun) 21:58:16|NO.80940

>>NO.80938
>自機系は1、敵キャラは2、弾幕は4みたいにわければいいのかな。
そんな感じ


>後、es_typeはes_pat後一回すれば良い(変更しないなら)
あ、間違ってた
はes_patじゃ無くてes_set後でした・・・



暇人

リンク

2017/8/13(Sun) 22:21:38|NO.80941

>>NO.80939
>大きいやつだと「2400*1360」ですね。
あぁ、2048より大きいと古いPCなんかは引っかかるかも・・・
2048まで大丈夫ならNO.80933の変更しても表示される
てか、2の累乗サイズ使ってないね・・・
動く環境多くしたいなら1024*1024ぐらいまでにして(6年前のノートPCでも4096まで大丈夫だけど)
全て2の累乗サイズにした方が安全(環境依存に会い難い)

>しかし「es_buffer」のP1「オフスクリーンバッファID」は0〜63までしか確保できないので、
普通はステージ毎に読み込んでes_bufferは使い回しするから
足りなくなる事は無いんじゃないかな



チャーくん

リンク

2017/8/13(Sun) 23:20:50|NO.80942

>アイドル さん
 やはり正常に表示されました。
 ネタバレは控えときます…すみません



暇人

リンク

2017/8/13(Sun) 23:44:12|NO.80943

>>NO.80942
> やはり正常に表示されました。
じゃぁ、テクスチャサイズ制限は2048*2048みたいだねぇ



ZAP

リンク

2017/8/14(Mon) 15:48:59|NO.80949

自分もどのくらいのテクスチャ画像サイズならOKか調べたことがあります。

7〜8年前のxpパソコン(オンボードビデオ)でも
2048×2048は読み込めていたので、これが読めるスペックを最低環境にしてしまっても
いいのではないでしょうか。

対応機種なんて下を見るときりがないし、どこかで割り切っていいと思いますよ。



アイドル

リンク

2017/8/14(Mon) 21:32:11|NO.80954

暇人さん。返答ありがとうございます。


>>そんな感じ
おぉ、だとするとこの命令すごいですね。
今までやってた当たり判定の考え方だけではなく、簡易化もいけちゃうとは・・・

>後、es_typeはes_pat後一回すれば良い(変更しないなら)
>>はes_patじゃ無くてes_set後でした・・・
es_set後にes_typeですね。
となるとNO.80938のソースで問題なさそうですね。
-------
>>あぁ、2048より大きいと古いPCなんかは引っかかるかも・・・
>>てか、2の累乗サイズ使ってないね・・・
あああああぁぁ!ダイナミック勘違いしておりました。
「es_excopy」取った画像は2の倍数なら大丈夫と・・・何故思ったんだ・・・
これは至急対応します。


>しかし「es_buffer」のP1「オフスクリーンバッファID」は0〜63までしか確保できないので、
>>普通はステージ毎に読み込んでes_bufferは使い回しするから
>>足りなくなる事は無いんじゃないかな
よくよく考えたら、システムでも大きくっても2〜3分割ですみそうだし、
ボスの種類が増えてもボス内の画像に収まりそうですね。
(とあることのせいで)もし膨れそうな時がきたらまた考えてみようと思います。



アイドル

リンク

2017/8/14(Mon) 21:47:55|NO.80955

チャーくんさん。ご報告ありがとうございます。


>>やはり正常に表示されました。
8/19(土)中にアップデート出来るようにはしておきます(この段階で軽量化はできません)

>>ネタバレは控えときます…すみません
結局私は見に行かないといかないので、あまり気にしてなかったり(ネタかぶり怖くって先行リリースした)
------
ZAPさん。ありがとうございます。


>>7〜8年前のxpパソコン(オンボードビデオ)でも
>>2048×2048は読み込めていたので、これが読めるスペックを最低環境にしてしまっても
>>いいのではないでしょうか。
上でのやりとりや、ZAPさんのアドバイスを見る限り「2048*2048」が最適のようですね。



0.3のアップデート内容は、ゲームの中身は「2048*2048」の対応のみで、後はテキストの修正をします。
この作品は「上海アリス幻楽団」の「東方Project」の、って入れてなかった(何やっとんねん



アイドル

リンク

2017/8/18(Fri) 07:01:59|NO.80994

0.2にアップデートしました。

・画像サイズ「2048*2048」に変更。一部環境でも画像が表示されるようになったはずです。
・「4.困ったことがあったら」の内容を追記。
・「7.注意事項」の内容を追記。

https://yahoo.jp/box/WWveE4


チャーくんさん。これで表示されるようになったと思います。
次はスプライトの移動に変更して処理の軽量化を図ろうと思います。



7かず

リンク

2017/8/21(Mon) 17:57:27|NO.81048

アップデートお疲れ様です。
相変わらず画面が緑色ですがこちらの不具合なので置いておきます。
画像等はどこに入っているのでしょう?exeに入っている場合は
起動時に全てメモリの上にコピーーするはずなのでメモリを大幅に消費してしまうことがあります。
dpmに分けてみてはいかがでしょうか。



アイドル

リンク

2017/8/22(Tue) 21:51:03|NO.81069

7かずさん。ありがとうございます。


>>画像等はどこに入っているのでしょう?exeに入っている場合は
>>起動時に全てメモリの上にコピーーするはずなのでメモリを大幅に消費してしまうことがあります。
>>dpmに分けてみてはいかがでしょうか。
リリースするときはパックして出しているので、exeの中になるんですかね。
(ちなみに私は「#epack」の命令を使っています)

http://www.geocities.jp/seya1105/HSPLesson/hl_comp.html
このあたりが参考になりそうかな。出来そうならやってみるよー



アイドル

リンク

2017/8/22(Tue) 22:01:00|NO.81070

あれからスプライトによる、複数の「フレーム移動」「当たり判定」ができました。
ソースはこんな感じなんですが考え方としてあってますでしょうか?
サイトや皆さんのソースを参考にしながらやってみたのですが、なかなか自信がもてなくって・・・

「es_draw」のP4は【ただし優先順位のソートには多少時間がかかるため】って書いてあるので使わない方法でやっております。
後、気になったのですが、「await」ではなく、「es_sync」を16にしたほうがいいのでしょうか。


#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini es_screen 640,480 ,0,0,1,1 ;---自機--- es_size 28,42, 100 ;キャラクタサイズ指定 es_pat 5, 0,0 ;キャラクタ画像定義 JIKI_x = 214 : JIKI_y = 313 ;自機座標 es_set 5, JIKI_x-14,JIKI_y-21, 5,1 ;スプライト設定 (低速>弾>自機っという順番) ;---低速--- es_size 9,9, 50 ;キャラクタサイズ指定 es_pat 1, 46,43 ;キャラクタ画像定義 es_set 1, TE_x-4,TE_y-4, 1,1;スプライト設定 (低速>弾>自機っという順番) es_type 1,1 ;type値設定 ;---弾--- es_size 18,19, 50 ;キャラクタサイズ指定 es_pat 100, 70,0 ;キャラクタ画像定義 es_set 100, TAMA_x-9,TAMA_y-9, 100,1;スプライト設定 (低速>弾>自機っという順番) TAMA_x = 220 : TAMA_y = -10 ;弾座標 ;****************メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 400,20 : es_mes "自機x " + JIKI_x pos 400,40 : es_mes "自機y " + JIKI_y pos 400,60 : es_mes "TE_x " + TE_x pos 400,80 : es_mes "TE_y " + TE_y pos 400,100 : es_mes "EN_HIT " + EN_HIT pos 400,120 : es_mes "TAMA " + TAMA pos 400,140 : es_mes "TAMA_c " + TAMA_c ;*************カウンター************** gosub *敵弾移動 ;自機 es_pos 5, JIKI_x,JIKI_y ;スプライト座標設定 ;低速 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_pos 1, TE_x,TE_y ;スプライト座標設定 TAMA_c += 1 ;弾を出す「カウント」 es_sync await 16 goto *メイン ;****敵弾移動**** *敵弾移動 if TAMA_c >= 50 { TAMA_c = 0 ;弾を出すカウントを「初期化」 es_exnew TAMA ;新規スプライト取得 es_set TAMA, TAMA_x,TAMA_y, 100,1 ;スプライト設定 (低速>弾>自機っという順番) es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動 } es_type TAMA,2 repeat es_check EN_HIT,1,2 ;衝突判定取得 if EN_HIT = -1 : break es_clear EN_HIT,1 ;複数スプライト削除 loop return



暇人

リンク

2017/8/22(Tue) 23:34:19|NO.81071

> if TAMA_c >= 50 {
> TAMA_c = 0 ;弾を出すカウントを「初期化」
> es_exnew TAMA ;新規スプライト取得
> es_set TAMA, TAMA_x,TAMA_y, 100,1 ;スプライト設定 (低速>弾>自機っという順番)
> es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動
> }
>
> es_type TAMA,2
これは

if TAMA_c >= 50 { TAMA_c = 0 ;弾を出すカウントを「初期化」 es_exnew TAMA ;新規スプライト取得 es_set TAMA, TAMA_x,TAMA_y, 100,1 ;スプライト設定 (低速>弾>自機っという順番) es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動 es_type TAMA,2 }
こうしないと・・・

>後、気になったのですが、「await」ではなく、「es_sync」を16にしたほうがいいのでしょうか。
今はawaitの精度が上がってるのでawaitの方が安定するかも
自分の環境では下の方法でFPS60安定

#include "hspdx.as" es_ini ; system初期化 es_screen 640,480,32,,1,1 ; スクリーン初期化 *start buffer 3 picload dir_exe+"\\sample\\hspdx\\testchr.bmp" es_buffer 0,2,,,1 es_size 64,64,60 es_pat 0, 64,64 ; 顔 es_pat 1, 0,64 ; リンゴ repeat 500 es_new a,0 es_set a,320,240,rnd(2) es_adir a,rnd(64),100+rnd(500) es_flag a,$6200 loop wt="await 16+(fps_cnt\2)","es_sync 16+(fps_cnt\2)" gsel 0,1 title wt *main stick ky,0 ; カーソルキーの情報を取得 if ky&$80 : goto *owari if ky&16 :w^1 color 0,60,60 es_exboxf 0,0,640,480 es_draw ; スプライト描画 color 255,255,255 pos 0,0:es_mes "fps="+fps ; 文字列を描画 if w=0{ await 16+(fps_cnt\2) es_sync 0 }else{ es_sync 16+(fps_cnt\2) await 0 } if ky : title wt(w) fps_cnt++ es_getfps fps goto *main *owari end
スペースでes_syncとawait切り替え
(fps_cnt\2)してるのは1フレームが16.666・・・msだから2フレームに1回+1してる



暇人

リンク

2017/8/23(Wed) 00:02:04|NO.81072

あ、await 16にする場合の注意として
onkey,oncmd,onclick 等の割り込み系の命令を使うと
指定時間待機せずに割り込みがかかったら直ぐに抜けます。

後NO.81071ので60安定してるけど
同じ事しても何故か62で安定したりするので
どこかに問題抱えてそう・・・



アイドル

リンク

2017/8/24(Thu) 21:36:28|NO.81092

暇人さん。アドバイスありがとうございます!


>>これは
>> if TAMA_c >= 50 {
>> TAMA_c = 0 ;弾を出すカウントを「初期化」
>> es_exnew TAMA ;新規スプライト取得
>> es_set TAMA, TAMA_x,TAMA_y, 100,1 ;スプライト設定 (低速>弾>自機っという順番)
>> es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動
>> es_type TAMA,2
>> }
>>こうしないと・・・
毎回「es_type」をチェックする必要がなかったですね。


>>今はawaitの精度が上がってるのでawaitの方が安定するかも
>>onkey,oncmd,onclick 等の割り込み系の命令を使うと
>>指定時間待機せずに割り込みがかかったら直ぐに抜けます。
F10,Altキーを無効にするため「wparam」の割り込み使ってたので、「es_sync」の方がよさそうですね。
----------------------------------------------------------
別件ですごく申し訳ないのですが、弾の座標を「TAMA_y = -122」にすると発射されなくなってしまいました。
「-121」以下なら大丈夫なんですが、何故か「-122」以上から発射されない(´・ω・`)
配列でちょくちょくいじくってたらこのようなことがおきてしまったのですが、何が原因なんでしょうか。

また、こういったことがおきた場合の調べ方ってあるのでしょうか。
サイトやHSP掲示板のログなどを探してみたのですが、
問題や、やりたいことが書いてあるのが見つからなくって・・・
できれば自力で解決できるようにしないと、「hspdxfix.as」と付き合うのが難しいんじゃないかと。

「変更点」
・事前に「es_set TAMA, TAMA_x-9,TAMA_y-9, 100,1」を用意する必要がなかったみたい?だったのでメインのみに。
・自機のスプライト、キャラクタ番号を5から500に変更(弾の数が多くなってもいいように)

#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini es_screen 640,480 ,0,0,1,1 ;---自機--- es_size 28,42, 100 ;キャラクタサイズ指定 es_pat 500, 0,0 ;キャラクタ画像定義 JIKI_x = 214 : JIKI_y = 313 ;自機座標 es_set 500, JIKI_x-14,JIKI_y-21, 500,1 ;スプライト設定 (低速>弾>自機っという順番) ;---低速--- es_size 9,9, 50 ;キャラクタサイズ指定 es_pat 1, 46,43 ;キャラクタ画像定義 es_set 1, TE_x-4,TE_y-4, 1,1;スプライト設定 (低速>弾>自機っという順番) es_type 1,1 ;type値設定 ;---弾--- es_size 18,19, 50 ;キャラクタサイズ指定 es_pat 100, 70,0 ;キャラクタ画像定義 TAMA_x = 229 : TAMA_y = -122 ;弾座標 ;↑配列使う場合はこの行を消す ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ /* TAMA_MAX = 5 dim TAMA_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX ;▼▼▼▼▼▼▼配置▼▼▼▼▼▼▼ TAMA_x = 390,390,390,390,390 TAMA_y = -10,-50,-90,-130,-170 */ ;****************メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 400,20 : es_mes "自機x " + JIKI_x pos 400,40 : es_mes "自機y " + JIKI_y pos 400,60 : es_mes "TE_x " + TE_x pos 400,80 : es_mes "TE_y " + TE_y pos 400,100 : es_mes "EN_HIT " + EN_HIT pos 400,120 : es_mes "TAMA " + TAMA pos 400,140 : es_mes "TAMA_c " + TAMA_c pos 400,160 : es_mes "TAMA_f " + TAMA_f pos 400,180 : es_mes "TAMA_x " + TAMA_x pos 400,200 : es_mes "TAMA_y " + TAMA_y ;*************カウンター************** gosub *敵弾移動 ;自機 es_pos 500, JIKI_x,JIKI_y ;スプライト座標設定 ;低速 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_pos 1, TE_x,TE_y ;スプライト座標設定 TAMA_c += 1 ;弾を出す「カウント」 es_sync await 16 goto *メイン ;****敵弾移動**** *敵弾移動 ; repeat TAMA_MAX ;5回 ; if TAMA_f(cnt) = 0 { if TAMA_c >= 50 { TAMA_c = 0 ;弾を出すカウントを「初期化」 ; TAMA_f(cnt) = 1 ;弾フラグを「立てる」 es_exnew TAMA ;新規スプライト取得 es_set TAMA, TAMA_x-9,TAMA_y-9, 100,1 ;↓をコメントアウトを解除する場合、この行を消す ; es_set TAMA, TAMA_x(cnt)-9,TAMA_y(cnt)-9, 100,1 ;これのコメントアウトを解除する場合、↑の行を消す es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動 es_type TAMA,2 } ; } ; loop repeat es_check EN_HIT,1,2 ;衝突判定取得 if EN_HIT = -1 : break es_clear EN_HIT,1 ;複数スプライト削除 loop return



暇人

リンク

2017/8/24(Thu) 23:09:09|NO.81094

>毎回「es_type」をチェックする必要がなかったですね。
それもあるけど
変数TAMAに入ってるスプライトナンバーが弾じゃない可能性がある
今回の場合は弾以外es_exnewを使って無いから大丈夫だけど・・・

>別件ですごく申し訳ないのですが、弾の座標を「TAMA_y = -122」にすると発射されなくなってしまいました。
> 「-121」以下なら大丈夫なんですが、何故か「-122」以上から発射されない(´・ω・`)
発射されないんじゃ無くて
自動で削除されてると思う

解決策は自動削除OFFにするかes_areaで有効エリアを広げるか
有効エリアを広げ過ぎると自動削除されるタイミングが遅くなるから
画面内に入るまで自動削除OFFするのが良いかな

es_flag cspno,$1100 //有効領域外自動削除OFF設定
でOFFにして

es_get flag,no,ESI_FLAG_LOW es_flag no,flag&$ffffefff //自動削除ON
で、ONに変えられる

後でNO.81092のを少しいじって見る
TAMAとしてるのは本来敵だろうから
そのつもりで作る



暇人

リンク

2017/8/26(Sat) 00:03:13|NO.81108

>>NO.81092
>F10,Altキーを無効にするため「wparam」の割り込み使ってたので、「es_sync」の方がよさそうですね。
自分で時間計ってawaitするって方法もあるけど・・・

>できれば自力で解決できるようにしないと、「hspdxfix.as」と付き合うのが難しいんじゃないかと。
hspdx.txtを一度全部読んでみた方が良い
検索ワードのヒントとかにもなるし

>後でNO.81092のを少しいじって見る
少しどころじゃ無かったな・・・

#include "hspdx.as" ;現在HSPに付属されるのはhspdxfixの名前を変更した物 width ,,450,200 ;ウィンドウの位置 SPMAX=600 AROUND=1024 //回転角度一周(0で下方向) es_ini SPMAX,512,AROUND es_screen 640,480 ,0,0,1,1 disp_sx=346 //スプライト表示エリアサイズ disp_sy=460 //es_offset,es_windowで使用するデータ scr_wx1=30 :scr_wx2=scr_wx1+346-1 //外側のラインも含まれるので-1 scr_wy1=10 :scr_wy2=scr_wy1+460-1 es_clip scr_wx1,scr_wy1,scr_wx2,scr_wy2 //es_copy、es_zoom、es_excopyのクリッピング es_offset scr_wx1,scr_wy1 //スプライト表示位置調整 es_window scr_wx1,scr_wy1,scr_wx2,scr_wy2 //スプライト表示範囲 //スプライト有効範囲(超えたら削除される)es_offsetが反映される area_x1=-64 :area_x2=disp_sx //-64は今回使ってるキャラ画像が64*64なので、画面外ぎりぎりにしてる(これを超える画像は自動削除OFFのままとか工夫が必要) area_y1=-64 :area_y2=disp_sy //スプライトの左上座標が超えたら削除されるので、上と左側に余裕を持たせる es_area area_x1,area_y1,disp_sx,disp_sy//es_window設定時に自動で設定されるが広すぎるので自分で設定 #const global JIKI_TYPE 1 //自機タイプ #const global JIKI_TAMA_TYPE 2 //自機弾 #const global TEK_TYPE 4 //敵 #const global TEK_TAMA_TYPE 8 //敵弾 #const global TEK_OUTSCR_TYPE 16 //敵画面外(自機弾との判定無し) #enum global JIKI_CNO= 0 //自機キャラクターパターンナンバー #enum global JIKI_TAMA_CNO //自機弾 #enum global TEK_CNO //敵 #enum global TAMA_CNO //敵弾 #enum global BLAST_CNO //爆発 #enum global CNO_END //キャラクターパターン総数 //優先度が 敵>弾=爆発>自機>自機弾 TEK_STNO=1 //敵に使用する開始スプライトナンバー TEK_ENDNO=99 //敵に使用する終了スプライトナンバー TAMA_STNO=100 //敵弾、爆発 TAMA_ENDNO=499 JIKI_NO=500 //自機 JIKI_TAM_STNO=510 //自機弾 JIKI_TAM_ENDNO=560 dim SP_cnt,SPMAX //画面内に入ってからの個別カウント用 psizex=48,32,64,32,32 psizey=64,32,64,32,32 pix=64*2+7,32*15,64*2,32*12,32*5 piy=64*3,32*3,64*4,32*3,32*3 hcs=40,90,90,50,0 buffer 1 picload dir_exe+"\\hsptv\\hsptv_img.bmp" es_buffer 0,,,,1 repeat CNO_END //自機、自機弾、敵、敵弾のキャラオアターン登録 es_size psizex(cnt),psizey(cnt) ,hcs(cnt) ;キャラクタサイズ指定 es_pat cnt,pix(cnt) ,piy(cnt) ;キャラクタ画像定義 loop jk_sx=psizex(JIKI_CNO) //自機サイズ jk_sy=psizey(JIKI_CNO) JIKI_x = double(disp_sx/2-jk_sx/2) ;自機表示座標(斜め移動の都合上実数値を使用) JIKI_y = double(disp_sy-100-jk_sy/2) es_set JIKI_NO, JIKI_x,JIKI_y, JIKI_CNO,1 ;スプライト設定 jk_t_sx=psizex(JIKI_TAMA_CNO) //自機サイズ jk_t_sy=psizey(JIKI_TAMA_CNO) buffer 1 picload dir_exe+"\\sample\\hgimg3\\sb_bg1.bmp" bgsx=ginfo_sx bgsy=ginfo_sy es_buffer 10,,,,1 TEK_MAX = 5 bf_addAlp=es_bfcalc(ESB_SRCALPHA,ESB_ONE) JIK_spd=3.0 //自機速度 Scroll_y=0.0 //スクロール座標 Scroll_Spdy=0.5 //スクロールスピード gsel 0 gmode 0 color 0,60,60 es_exboxf 0,0,640,480 ;****************メインループ********* *メイン gmode 0 color 0,60,60 es_exboxf scr_wx2,0,640,480 pos scr_wx1,scr_wy1+(Scroll_y\bgsy) es_excopy 10,0,0,disp_sx,bgsy pos scr_wx1,scr_wy1 es_excopy 10,0,bgsy-(Scroll_y\bgsy),disp_sx,(Scroll_y\bgsy) stick ky,$f if ky&$80 : end if ky&$f { jkmx=0 jkmy=0 if ky&1 {jkmx--} if ky&4 {jkmx++} if ky&2 {jkmy--} if ky&8 {jkmy++} jk_dir=atan(jkmx,jkmy) //進行方向 JIKI_x+=sin(jk_dir)*JIK_spd //sin、cosでの斜め移動中は縦横の速度は遅くなるのでゲームによっては合わないかも知れない JIKI_y+=cos(jk_dir)*JIK_spd JIKI_x=limitf(JIKI_x,-10,disp_sx-jk_sx+10)//画面内に納めて微調整 JIKI_y=limitf(JIKI_y,0,disp_sy-jk_sy+10) es_pos JIKI_NO,JIKI_x,JIKI_y } JIKI_cx=JIKI_x+jk_sx/2 //自機の中心座標 JIKI_cy=JIKI_y+jk_sy/2 getkey key_z,'Z' if key_z { if (Shot_cnt\3)=0 { es_exnew no,JIKI_TAM_STNO,JIKI_TAM_ENDNO ;新規スプライト取得 es_set no, JIKI_cx-jk_t_sx/2,JIKI_cy-jk_sy/2-jk_t_sy/2, JIKI_TAMA_CNO,1 es_effect no,,,,,,bf_addAlp,200,$88ff //加算半透明合成 es_apos no,0,-1,1000 es_type no,JIKI_TAMA_TYPE } Shot_cnt++ }else{ Shot_cnt=0 } es_draw ;スプライト描画 //****************デバッグ用表示********* pos 400,20 : es_mes "自機x " + JIKI_x pos 400,40 : es_mes "自機y " + JIKI_y mespx=400 mespy=60 pos mespx,mespy : es_mes "SPNO" pos mespx,mespy+20 : es_mes "TEK_x" pos mespx,mespy+20*2 : es_mes "TEK_y" pos mespx,mespy+20*3 : es_mes " TYPE" pos mespx,mespy+20*4 : es_mes " cnt" pos mespx,mespy+20*5 : es_mes "発射" mespx+45 敵数=0 no=TEK_STNO//検索開始ナンバ− repeat es_find no,TEK_TYPE | TEK_OUTSCR_TYPE,no,TEK_ENDNO if no<0 {break} pos mespx,mespy : es_mes "" + no es_get tpx,no,ESI_POSX_INT es_get tpy,no,ESI_POSY_INT pos mespx,mespy+20 : es_mes "" + tpx pos mespx,mespy+20*2 : es_mes "" + tpy es_get type,no,ESI_TYPE pos mespx,mespy+20*3 : es_mes "" + type pos mespx,mespy+20*4 : es_mes "" + SP_cnt(no) pos mespx,mespy+20*5 : es_mes "" + (SP_cnt(no)\50) mespx+40 if no=TEK_ENDNO {break} //無限ループ回避 no++ 敵数++ loop pos 400,mespy+20*8 : es_mes "敵数 " + 敵数 pos 400,mespy+20*9 : es_mes "dam " + dam if 敵数=0 {gosub *敵出現} gosub *敵処理 gosub *当り判定処理 es_sync 0 await 16 Scroll_y+Scroll_Spdy goto *メイン *敵処理 no=TEK_STNO//検索開始ナンバ− repeat //TEK_TYPEの処理 es_find no,TEK_TYPE,no,TEK_ENDNO if no<0 {break} es_get tpx,no,ESI_POSX_INT es_get tpy,no,ESI_POSY_INT es_get dspx,no,ESI_DISPX es_get dspy,no,ESI_DISPY if (SP_cnt(no)\50)=0 { tpx+=dspx/2 //敵中心座標 tpy+=dspy/2 //敵中心座標が画面内にある時だけ弾発射する(見えなくなっても自動削除されるまで時間がかかる場合があるので) if tpy>0 { if tpy<disp_sy { if tpx<disp_sx and tpx>0 {//敵中心が画面内 es_exnew TAMA,TAMA_STNO,TAMA_ENDNO ;新規スプライト取得 tdsx=psizex(TAMA_CNO)/2 tdsy=psizey(TAMA_CNO)/2 es_set TAMA, tpx-tdsx,tpy-tdsy, TAMA_CNO,1 es_effect TAMA,,,,,,bf_addAlp,255 //加算半透明合成 es_aim TAMA,JIKI_cx-tdsy,JIKI_cy-tdsy,200 es_type TAMA,TEK_TAMA_TYPE } } } } SP_cnt(no)++ if no=TEK_ENDNO {break} //無限ループ回避 no++ //次の検索開始ナンバ− loop no=TEK_STNO//検索開始ナンバ− repeat //TEK_OUTSCR_TYPEの処理 es_find no,TEK_OUTSCR_TYPE,no,TEK_ENDNO if no<0 {break} es_get tpx,no,ESI_POSX_INT es_get tpy,no,ESI_POSY_INT es_get dspx,no,ESI_DISPX es_get dspy,no,ESI_DISPY if (tpy+dspy)>0 { if tpy<disp_sy { if tpx<disp_sx and (tpx+dspx)>0 {//画面内に入ったのでタイプをTEK_TYPEかTEK_NOHIT_TYPEにしてカウンタを設定 es_get flag,no,ESI_FLAG_LOW es_flag no,flag&$ffffefff //自動削除ON es_type no,TEK_TYPE ;type値設定 } } } if no=TEK_ENDNO {break} //無限ループ回避 no++ //次の検索開始ナンバ− loop return *当り判定処理 no=TAMA_STNO//検索開始ナンバ− repeat //敵弾と自機の当り判定 es_check no,JIKI_NO,TEK_TAMA_TYPE,0,no,TAMA_ENDNO ;衝突判定取得 if no = -1 : break es_kill no ;スプライト削除 if no=TEK_ENDNO {break} //無限ループ回避 no++ //次の検索開始ナンバ− dam++ //ダメージ loop no=JIKI_TAM_STNO//検索開始ナンバ− repeat //自機弾と敵の当り判定 es_find no,JIKI_TAMA_TYPE,no,JIKI_TAM_ENDNO if no<0 {break} kill=0 hitno=TEK_STNO//検索開始ナンバ− repeat es_check hitno,no,TEK_TYPE,0,hitno,TEK_ENDNO ;衝突判定取得 if hitno = -1 : break es_get tpx,hitno,ESI_POSX_INT//爆炎用に座標取得 es_get tpy,hitno,ESI_POSY_INT es_get dspx,hitno,ESI_DISPX es_get dspy,hitno,ESI_DISPY es_exnew bno,TAMA_STNO,TAMA_ENDNO //爆発用スプライト取得 if bno>=0 { es_set bno, tpx+dspx/2-100/2,tpy+dspy/2-100/2, BLAST_CNO,1 es_effect bno,100,100,,,,bf_addAlp,100 es_setp bno,ESI_BLINKFLAG,1 es_setp bno,ESI_BLINKCOUNT_LOW,10 //爆発が10フレーム後自動削除 } es_type hitno,0 //自動処理以外何もしなくなる //es_setp hitno,ESI_BLINKFLAG,1   //点滅無しにしたいならコメント解除 es_setp hitno,ESI_BLINKCOUNT_LOW,5 //指定フレーム後自動削除 es_effect hitno,,,,,,,,$ff0000 //es_kill no :break //同時に複数当るのが嫌ならコメント解除 if hitno=TEK_ENDNO {break} //無限ループ回避 hitno++ //次の検索開始ナンバ− kill++ //自機弾削除フラグON loop if kill {es_kill no} if no=JIKI_TAM_ENDNO {break} //無限ループ回避 no++ loop return *敵出現 tx=50+rnd(280)-psizex(TEK_CNO)/2 ty=-psizey(TEK_CNO) spd=100+rnd(400) repeat TEK_MAX es_exnew no,TEK_STNO ,TEK_ENDNO;新規スプライト取得 if no<0 {break} es_set no, tx,ty, TEK_CNO,1 ;スプライト設定  if (tx<0) | (ty<0) | (tx>disp_sx) | (ty>disp_sy) {//出現座標が画面外なら es_flag no,$1100 //有効領域外自動削除OFF設定 es_type no,TEK_OUTSCR_TYPE ;type値設定 }else{es_type no,TEK_TYPE}//出現時エリア内 es_apos no, 0,1, spd SP_cnt(no)=0 //個別カンタ初期化 ty-=1.3*psizey(TEK_CNO) //次の出現位置 loop return



アイドル

リンク

2017/9/17(Sun) 21:11:44|NO.81358

どうも少しお久しぶりです。
ソース解読を進めてたのですが、リアル事情が重なったのと、わからない部分が多かったのでだいぶ時間がかかってしまいました。


>>解決策は自動削除OFFにするかes_areaで有効エリアを広げるか
>>有効エリアを広げ過ぎると自動削除されるタイミングが遅くなるから
>>画面内に入るまで自動削除OFFするのが良いかな

>>es_flag cspno,$1100 //有効領域外自動削除OFF設定
>>でOFFにして

>>es_get flag,no,ESI_FLAG_LOW
>>es_flag no,flag&$ffffefff //自動削除ON
>>で、ONに変えられる

hspdx.asのヘルプ内容を見てみたら、自動的に削除される機能なんてあったんですね・・・・


>>NO.81108
>>自分で時間計ってawaitするって方法もあるけど・・・
これ以上私の頭に詰められそうもないので、「wparam」の処理で問題なければこのままでいこうかなーとか思ったり。
(F10,Alt無効はそれほど優先度高くないので)

>>hspdx.txtを一度全部読んでみた方が良い
そうですね。上であったこととかを読んでいれば自分で解決できたかもしれません。
今は理解していなくってもいいから、どんな機能がどんなことを出来るのか、
ざっくりとでいいから読んでおきます。



アイドル

リンク

2017/9/17(Sun) 21:41:23|NO.81360

そしてソースありがとうございます!
それでソースを自分が【理解できそうな範囲】で修正してみました。


「追加」
・es_window、es_area、es_get
・境界線(外枠)


どうしてもわからなかったのが、「es_flag no,flag&$ffffefff」「es_flag no,$1100」

flagは上の行でやっている「es_get flag,no,ESI_FLAG_LOW」の変数名を参照ですよね。
「flag&$ffffefff」の「ffffefff」は16進数なんでしょうか。
コメントで取得すると「0」で、検索してもわからなかったです。

「es_flag no,$1100」は、1000でボーダー消去無効ON、100でスプライト表示ONをくっつけるために1100になっているんでしょうか。



「es_get」で取得するとき、変数でずらしていこうと思ったけど、うまくいかずベタ打ちとなっております。
「自動削除」を入れない状態でやりたいことができていますが「自動削除」必要ですね・・・

自動削除ONのON、OFFを真似してやってみたのですが、どうもうまくいかずでした・・・
きちんと出来るのにはもうちょっと時間かかりそうなので、
いったんここまでやっていることの報告(´・ω・`)


これは全体的なお知らせですが、
ソース全体で直すとなると3ヶ月〜4ヶ月かかりそうな気がしますががんばります(リプレイであれだったので)

#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini es_screen 640,480 ,0,0,1,1 es_window 30,10, 412,460 ;スプライト表示エリア設定 es_area -160,-190, 600,740 ;スプライト有効エリア設定 buffer 2 ; picload "G_sisu.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;---境界線--- es_size 2,450 ;キャラクタNo、キャラクタパターンの座標 KYOKAI_p = 60,61,62,63 KYOKAI_patx = 326,326,0,0 KYOKAI_paty = 0,0,451,451 ;スプライト座標 KYOKAI_setx = 30,412,30,30 KYOKAI_sety = 10,10,10,460 repeat 4 if cnt >= 2 : es_size 384,2 es_pat KYOKAI_p(cnt), KYOKAI_patx(cnt),KYOKAI_paty(cnt) es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt),1 loop buffer 4 ; picload "jiki.bmp" es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 50, 0,0 JIKI_x = 214 : JIKI_y = 313 es_set 50, JIKI_x-14,JIKI_y-21, 50,1 ;---弾--- buffer 5 ; picload "teki.bmp" es_buffer 5,,$00ff00,,1 gsel 0,1 es_size 18,19, 50 es_pat 100, 70,0 TAMA_MAX = 5 dim TAMA_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX dim TM_x,TAMA_MAX dim TM_y,TAMA_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TAMA_x = 390,370,350,330,310 TAMA_y = -10,-50,-90,-130,-170 ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 420,20 : es_mes "自機x " + JIKI_x pos 420,40 : es_mes "自機y " + JIKI_y pos 420,60 : es_mes "TE_x " + TE_x pos 420,80 : es_mes "TE_y " + TE_y pos 420,120 : es_mes "TAMA " + TAMA pos 420,140 : es_mes "TAMA_c " + TAMA_c ;スプライト情報取得 es_get TM_x(0),0,ESI_POSX_INT es_get TM_y(0),0,ESI_POSY_INT es_get TM_x(1),1,ESI_POSX_INT es_get TM_y(1),1,ESI_POSY_INT es_get TM_x(2),2,ESI_POSX_INT es_get TM_y(2),2,ESI_POSY_INT es_get TM_x(3),3,ESI_POSX_INT es_get TM_y(3),3,ESI_POSY_INT es_get TM_x(4),4,ESI_POSX_INT es_get TM_y(4),4,ESI_POSY_INT ; es_get TM_x(TAMA),TAMA,ESI_POSX_INT ; es_get TM_y(TAMA),TAMA,ESI_POSY_INT pos 420,170 : es_mes "TM_x(0) " + TM_x(0) pos 420,190 : es_mes "TM_x(1) " + TM_x(1) pos 420,210 : es_mes "TM_x(2) " + TM_x(2) pos 420,230 : es_mes "TM_x(3) " + TM_x(3) pos 420,250 : es_mes "TM_x(4) " + TM_x(4) pos 420,280 : es_mes "TM_y(0) " + TM_y(0) pos 420,300 : es_mes "TM_y(1) " + TM_y(1) pos 420,320 : es_mes "TM_y(2) " + TM_y(2) pos 420,340 : es_mes "TM_y(3) " + TM_y(3) pos 420,360 : es_mes "TM_y(4) " + TM_y(4) ;************************************** gosub *敵弾移動 ;自機 es_pos 50, JIKI_x,JIKI_y ;境界線 repeat 4 es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt) loop TAMA_c += 1 es_sync ;画面更新 await 16 goto *メイン ;*************敵弾移動**************** *敵弾移動 repeat 5 if TAMA_f(cnt) = 0 { if TAMA_c >= 50 { TAMA_c = 0 ;弾カウントを「初期化」 TAMA_f(cnt) = 1 es_exnew TAMA es_set TAMA, TAMA_x(cnt)-9,TAMA_y(cnt)-9, 100,1 /* if (TAMA_x < 0) | (TAMA_y < 0) | (TAMA_x > 412) | (TAMA_y > 460) {;出現座標が画面外なら es_flag TAMA,$1100 ;有効領域外自動削除OFF設定 (スプライト表示ON+ボーダー消去無効ON) } if TAMA_x < -160 : es_flag TAMA,flag & $ffffefff;自動削除ON if TAMA_y < -190 : es_flag TAMA,flag & $ffffefff;自動削除ON if TAMA_x > 600 : es_flag TAMA,flag & $ffffefff ;自動削除ON if TAMA_y > 740 : es_flag TAMA,flag & $ffffefff ;自動削除ON */ es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動する es_type TAMA,2 } } loop return



暇人

リンク

2017/9/17(Sun) 23:20:24|NO.81363

>「flag&$ffffefff」の「ffffefff」は16進数なんでしょうか。
先頭に $ が有る場合16進数を表す 0x でも16進数になる
序に % だと2進数

& は二進数で見た時どちらかが0の場所は0になるのを利用して$1000をクリアしてる

mes ($00001000 & $ffffefff)
これは0になる
>es_get flag,no,ESI_FLAG_LOW
で取得したフラグ値は移動ON等の設定もあるので
消去無効ONのフラグだけを0にしたいので flag & $ffffefff にしている


>「es_flag no,$1100」は、1000でボーダー消去無効ON、100でスプライト表示ONをくっつけるために1100になっているんでしょうか。
そう言う事です。
$が重要なので注意

>自動削除ONのON、OFFを真似してやってみたのですが、どうもうまくいかずでした・・・
画面外から出現したらそれ用のtype値を設定して「es_flag no,$1100」をやって
es_findで検索して座標が画面内に入ったらtype値を画面内用のtype値に変更して
「es_get flag,no,ESI_FLAG_LOW」「es_flag no,(flag & $ffffefff)」ってやれば良い



Ve

リンク

2017/9/18(Mon) 02:01:20|NO.81364

そこまで重そうに見えないのに、FPS 3〜6位しかでない。

プロセッサ Core i5-4200U
メモリ 4GB
OS Windows 8.1 Pro(64bit)
グラフィックス CPU内蔵Intel HD Graphics 4400

FF14やバトルフィールド4等が標準でも動くスペック。



暇人

リンク

2017/9/18(Mon) 15:18:38|NO.81376

>>NO.81364
>そこまで重そうに見えないのに、FPS 3〜6位しかでない。
NO.81108のスクリプトに↓のを追加して試して欲しいかも
es_sync 0 の上に追加

es_getfps fps pos 400,mespy+20*10 : es_mes "FPS " + fps



7かず

リンク

2017/9/21(Thu) 14:07:42|NO.81422

少し細かいところですがが気になる箇所がありました。
ZUN館モードで難易度をノーマルからイージーに切り替えると
画面が一瞬黒くなります。逆は問題ないので何か処理の順番が違うのかもしれません。



アイドル

リンク

2017/9/22(Fri) 07:59:40|NO.81432

暇人さんお返事ありがとうございます。


>>先頭に $ が有る場合16進数を表す 0x でも16進数になる
>>序に % だと2進数
>>& は二進数で見た時どちらかが0の場所は0になるのを利用して$1000をクリアしてる
そんな機能があるんですね。
うまく使える自信がないです・・・

>>$が重要なので注意
覚えておきます!

>>画面外から出現したらそれ用のtype値を設定して「es_flag no,$1100」をやって
>>es_findで検索して座標が画面内に入ったらtype値を画面内用のtype値に変更して
>>「es_get flag,no,ESI_FLAG_LOW」「es_flag no,(flag & $ffffefff)」ってやれば良い
多分できました。暇人さんのソースの処理の処理とだいぶ違ってしまいました・・・

ようやくヘルプ全て見れて疑問に思ったのですが、
es_window 30,10, 412,460 ;スプライト表示エリア設定
es_area -160,-190, 600,740 ;スプライト有効エリア設定
だけで制御するっていうのはダメなんでしょうか。
「スプライト座標が(p1,p2)-(p3,p4)の範囲内にないものは、 自動的に削除されます。」って書いてあるので、
何もアドバイスがなかったらこの処理だけでやってたと思うので・・・
必要だからON、OFFの処理しているのはわかっているのですが。


「変更点」
・TAMA_cが無限に行われるのでif文で止めるように修正
・画面内、画面外で「ボーダー消去無効」のON、OFFするように修正


#include "hspdxfix.as" ;DXライブラリ使用 width ,,450,200 ;ウィンドウの位置 es_ini es_screen 640,480 ,0,0,1,1 es_window 30,10, 412,460 ;スプライト表示エリア設定 es_area -160,-190, 600,740 ;スプライト有効エリア設定 buffer 2 ; picload "G_sisu.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;---境界線--- es_size 2,450 ;キャラクタNo、キャラクタパターンの座標 KYOKAI_p = 60,61,62,63 KYOKAI_patx = 326,326,0,0 KYOKAI_paty = 0,0,451,451 ;スプライト座標 KYOKAI_setx = 30,412,30,30 KYOKAI_sety = 10,10,10,460 repeat 4 if cnt >= 2 : es_size 384,2 es_pat KYOKAI_p(cnt), KYOKAI_patx(cnt),KYOKAI_paty(cnt) es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt),1 loop buffer 4 ; picload "jiki.bmp" es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 50, 0,0 JIKI_x = 214 : JIKI_y = 313 es_set 50, JIKI_x-14,JIKI_y-21, 50,1 ;---弾--- buffer 5 ; picload "teki.bmp" es_buffer 5,,$00ff00,,1 gsel 0,1 es_size 18,19, 50 es_pat 100, 70,0 TAMA_MAX = 5 dim TAMA_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX dim TM_x,TAMA_MAX dim TM_y,TAMA_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TAMA_x = 390,370,350,330,310 TAMA_y = -10,-50,-90,-130,-170 ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 420,20 : es_mes "自機x " + JIKI_x pos 420,40 : es_mes "自機y " + JIKI_y pos 420,60 : es_mes "TE_x " + TE_x pos 420,80 : es_mes "TE_y " + TE_y pos 420,120 : es_mes "TAMA " + TAMA pos 420,140 : es_mes "TAMA_c " + TAMA_c ;スプライト情報取得 es_get TM_x(0),0,ESI_POSX_INT es_get TM_y(0),0,ESI_POSY_INT es_get TM_x(1),1,ESI_POSX_INT es_get TM_y(1),1,ESI_POSY_INT es_get TM_x(2),2,ESI_POSX_INT es_get TM_y(2),2,ESI_POSY_INT es_get TM_x(3),3,ESI_POSX_INT es_get TM_y(3),3,ESI_POSY_INT es_get TM_x(4),4,ESI_POSX_INT es_get TM_y(4),4,ESI_POSY_INT ; es_get TM_x(TAMA),TAMA,ESI_POSX_INT ; es_get TM_y(TAMA),TAMA,ESI_POSY_INT pos 420,170 : es_mes "TM_x(0) " + TM_x(0) pos 420,190 : es_mes "TM_x(1) " + TM_x(1) pos 420,210 : es_mes "TM_x(2) " + TM_x(2) pos 420,230 : es_mes "TM_x(3) " + TM_x(3) pos 420,250 : es_mes "TM_x(4) " + TM_x(4) pos 420,280 : es_mes "TM_y(0) " + TM_y(0) pos 420,300 : es_mes "TM_y(1) " + TM_y(1) pos 420,320 : es_mes "TM_y(2) " + TM_y(2) pos 420,340 : es_mes "TM_y(3) " + TM_y(3) pos 420,360 : es_mes "TM_y(4) " + TM_y(4) pos 420,390 : es_mes "flag " + flag ;************************************** gosub *敵弾移動 ;自機 es_pos 50, JIKI_x,JIKI_y ;境界線 repeat 4 es_set KYOKAI_p(cnt), KYOKAI_setx(cnt),KYOKAI_sety(cnt), KYOKAI_p(cnt) loop if TAMA <= 3 : TAMA_c += 1 es_sync ;画面更新 await 16 goto *メイン ;*************敵弾移動**************** *敵弾移動 ;画面内 if TAMA_x < 346 OR TAMA_x > 0 OR TAMA_y > 0 OR TAMA_y < 460 { es_get flag,TAMA,ESI_FLAG_LOW ;flag値 es_flag TAMA,flag & $ffffefff es_type TAMA,4 } repeat 5 if TAMA_f(cnt) = 0 { if TAMA_c >= 50 { TAMA_c = 0 ;弾カウントを「初期化」 TAMA_f(cnt) = 1 es_exnew TAMA es_set TAMA, TAMA_x(cnt)-9,TAMA_y(cnt)-9, 100,1 ;画面外 if (TAMA_x < 0) OR (TAMA_y < 0) OR (TAMA_x > 412) OR (TAMA_y > 460) { es_flag TAMA,$1100 ;有効領域外自動削除OFF設定 (スプライト表示ON+ボーダー消去無効ON) es_type TAMA,16 } else { es_type TAMA,4 } es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動する } } loop return



アイドル

リンク

2017/9/22(Fri) 08:08:01|NO.81433

Veさん。ありがとうございます。


>>そこまで重そうに見えないのに、FPS 3〜6位しかでない。
やっぱそうですよね・・・
PCの環境によってくっそ重い状態で申し訳ないです。
これは私の処理の仕方にも問題あると思うので、軽量化が完了したらソースの見直ししないとダメですね。
------------
7かずさん。ありがとうございます。
>>ZUN館モードで難易度をノーマルからイージーに切り替えると
>>画面が一瞬黒くなります。逆は問題ないので何か処理の順番が違うのかもしれません。
細かい所でも助かります!
実はそこは仕様なのですが・・ってあれ・・・私のPCでは発生しない。

処理の仕方を変えないといけないかなーと思いつつ他の作業が入ってしまったので、後回しになっちゃっているんですよねー(´・ω・`)
手が空いた時にどのように修正するか決めて、修正できるのなら修正しておきます。



暇人

リンク

2017/9/22(Fri) 21:34:41|NO.81435

>NO.81432
>だけで制御するっていうのはダメなんでしょうか。
物によっては問題ないけど
弾幕系シューテングだと問題が出る可能性はある

弾は最初から自動削除ONのままで区別する必要は無いと思うけど
敵を画面内、外の区別しない場合は画面外から弾を撃ってきたり
敵が画面内に入る前に自機弾に当たってしまうとか
これは当たってたら座標確認とかして画面の外なら除外って手もあるが・・・


後は、見える部分が有効エリアの1/4ぐらいなので
均等にスプライトが分布した場合
250個ぐらいしか見えてないのに
実際には1000個使用されてると言う非効率な事が起こる可能性がある
スプライトの上限を1000にしてた場合は、画面上は300個も出てないのに
新しくスプライトが作れないって可能性も出てくる
単純に上限を増やせば解決するが
遅い球が多い場合は、画面上の弾数制御は難しくなる(瞬間的に弾数が数千になったり)

なので見える部分に比べて有効エリアが広いと
あまり良くないんじゃないかな・・・
全て自分で座標判定して処理すれば良いが
自動削除の意味が・・・

>>NO.81432
の *敵弾移動 には間違いがあるみたいなので修正してみる

*敵弾移動 //画面内検索 fno=0 //検索開始NO repeat es_find fno,4,fno if fno<0 {break} tcnt(fno)++ if (tcnt(fno) \ 60)=0 {//60フレーム毎に弾発射 es_get temp_x,fno,ESI_POSX_INT es_get temp_y,fno,ESI_POSY_INT //有効エリアが広い場合はここで画面外判定した方が良いと思う(見える部分とあまり差が無いなら自動で削除されるのに任せられる) es_exnew tsp es_set tsp, temp_x,temp_y, 100,1 es_ang temp_x,temp_y,JIKI_x+28/2,JIKI_y+42/2 //敵から見た自機の角度取得 es_adir tsp,stat,300 } fno++ //次の検索NO loop ;画面外検索 fno=0 //検索開始NO repeat es_find fno,16,fno //検索終了も指定した方が無駄な検索は防げる if fno<0 {break} es_get temp_x,fno,ESI_POSX_INT es_get temp_y,fno,ESI_POSY_INT es_get temp_dpx,fno,ESI_DISPX es_get temp_dpy,fno,ESI_DISPY if (temp_x < 412) and ((temp_x+temp_dpx) > 0) and ((temp_y+temp_dpy) > 0) and (temp_y < 460) {//画面内を判定したいならandじゃないと・・・ //画面内なのでフラグとタイプ変更 es_get flag,fno,ESI_FLAG_LOW ;flag値 es_flag fno,flag & $ffffefff es_type fno,4 } fno++ //次の検索NO loop repeat 5 if TAMA_f(cnt) = 0 { if TAMA_c >= 50 { TAMA_c = 0 ;弾カウントを「初期化」 TAMA_f(cnt) = 1 es_exnew TAMA es_set TAMA, TAMA_x(cnt)-9,TAMA_y(cnt)-9, 100,1 ;画面外 if (TAMA_x(cnt) < 0) OR (TAMA_y(cnt) < 0) OR (TAMA_x(cnt) > 412) OR (TAMA_y(cnt) > 460) {//(cnt)が無かった・・・ es_flag TAMA,$1100 ;有効領域外自動削除OFF設定 (スプライト表示ON+ボーダー消去無効ON) es_type TAMA,16 } else { es_type TAMA,4 } es_apos TAMA, 0,1, 200 ;200のスピードで↓に移動する } } loop return



うんうん

リンク

2017/9/23(Sat) 17:08:01|NO.81439

オンライン対戦の追加って可能ですかね?
できれば追加してほしいんですが.....
gDPとかを上手く利用すれば可能だと思います。



とおりすが

リンク

2017/9/23(Sat) 17:11:42|NO.81440

環境によってfpsが左右されているこの状況で
オンライン対戦が可能だとはとても思えないのですが・・・。



ZAP

リンク

2017/9/24(Sun) 11:34:21|NO.81447

自分の過去の作ったものだと画面外のエリアは、上下左右それぞれ通常サイズのキャラで
2〜3体分の幅を持たせてました。

プログラムの書き方にもよるのですが、
要は画面端から出て行くキャラが突然消えるように見えないように
幅を調整すればよいのではないでしょうか?

余分なエリアが多ければ多いほど、見えないところでの処理が発生しますので
見かけ以上に重くなってしまうと思います。

老婆心ですが、座標管理は自前でやったほうがいいように思うのですが・・・
自分も過去作でHSPDXを使ったことがありますが、自動処理が何かと面倒で、
結局キャラの移動消滅当たり判定をすべて自前で処理しました。



アイドル

リンク

2017/9/24(Sun) 11:41:07|NO.81448

暇人さん。回答ありがとうございます!

>>敵を画面内、外の区別しない場合は画面外から弾を撃ってきたり
>>敵が画面内に入る前に自機弾に当たってしまうとか
そうだった・・・そういう問題あって自分で制御してたの忘れてました。絶対必要ですね。

;敵が画面内に到着したのか見る if(MAP_x < TEK_x(cnt,TEK_G)+1) AND (MAP_x+382 > TEK_x(cnt,TEK_G) ) AND (MAP_y < TEK_y(cnt,TEK_G)+1) AND (MAP_y+450 > TEK_y(cnt,TEK_G)) { TEK_GAMEN_f(cnt,TEK_G) = 1 ;敵画面内フラグ }
で画面内に入ったらフラグを立てて、「自機弾が当たる、敵弾が処理」されるようにしてました。
スプライトを入れるので、スプライトに適切な処理をするようにします。
(そう言えばNo.81108のソースを見て知ったのですが、type値は当たり判定に使う物とばかり思ってました)


>>250個ぐらいしか見えてないのに
>>実際には1000個使用されてると言う非効率な事が起こる可能性がある
>>遅い球が多い場合は、画面上の弾数制御は難しくなる(瞬間的に弾数が数千になったり)
確かに遅い弾を出すと思うので「見えている画面、見えていない画面」の間にある弾は消すべきですね。
(正直消し方についてはまだしっくり来てませんが、沢山真似してやってみます)

後、敵ですが「x-150、y-180、x580、y730」(「大きいマイナス、大きいプラス」)から処理しているので処理を変えようと思います。
これに関してはまずは上記のことがきちんとできてから考えようと思います。
(type値で消す消さないの判断してもよさそうですが、画面外から沢山処理するのもあれなので)


>>//画面内を判定したいならandじゃないと・・・
//(cnt)が無かった・・・
ぐはぁああああああ。
なんでORにしちゃったんだろう・・・cntがなかったら1個だけやん・・・



アイドル

リンク

2017/9/24(Sun) 12:06:52|NO.81449

うんうんさん。ありがとうございます。

>>オンライン対戦の追加って可能ですかね?
これは重さ以外に問題が色々ありそうです。

まずSTGっていうジャンルが、オンラインを求められているかというとそうではありません。
STGはハイスコアによるスコアラーの競い合いが魅力の1つなので、
オンラインより記録の方が重要度が高いと思っています。

東方には花映塚っていうSTGオンライン対戦がありますが、
色んなアイディアの弾幕で驚いてほしいのでオンライン対戦はやらないと思います。
(電車、迷路でユーザーに届いているので、そこを強化する方針がよいかと)
---------------
とおりすがさん。

やりたい方針、技術面などを考えると、fpsが安定してもオンラインはやらないと思います。
やるとしても花映塚っぽくなりそうだけど、それなら単体で別のSTGとして出すのがベストだと思うし。
(隙間風は主人公キャラが1人しかいないしね)
--------------
ZAPさん。

最初は自動で消えるし楽でいいじゃん!って思いましたが、私が愚かでした。
上で言っているけど、見えない部分で処理される物が多いのはやばいので、削除判定などは処理するようにします。
経験によるアドバイス助かります!
--------------
--------------
前々から書こうとして忘れてたけど、スレがだいぶ長くなっちゃったので、
次のバージョンアップ報告時は新しいスレッドを立てようかと思います。

あ、アドバイスやご意見、要望は引き続き受け付けます。
(長いスレになって見づらくなって申し訳ない)



暇人

リンク

2017/9/24(Sun) 13:42:32|NO.81450

>>NO.81449
>上で言っているけど、見えない部分で処理される物が多いのはやばいので、削除判定などは処理するようにします。
敵なんかは同時に出るのは100個程度だろうから
自前処理しても良いと思うけど
直線でしか動かない弾なんかは自動移動削除利用した方が良いと思う
弾に合わせれば有効エリアは見える範囲からそんなに大きくする必要ないし

後、処理軽減考えるなら当たり判定はes_check使った方が良い
処理する数が多ければ自前処理より数百倍は軽いので・・・



ZAP

リンク

2017/9/24(Sun) 13:44:29|NO.81451

オンライン対戦は敷居が高いでしょうね。

対戦ではないですが、以前、ネットワークプレイヤーとの二人同時プレイが
できないものかといろいろ調べてたことがありましたが、2DSTGの場合、
同時プレイだと双方のゲーム進行がフレーム単位で一致していなければならない、
というのがありまして、どうやっても通信によるタイムラグが避けられない以上、
たとえ双方のマシンで処理落ちせずにプログラムが走っていたとしても、
通信ラグの問題できわめて困難との結論に達しました。

対戦型STGもそれと同じですね。
格闘ゲームの通信対戦は入力から反映までの間に意図的に数フレームの遅延を作って、
通信によるラグを埋めているみたいですが、格ゲーなら「なんかもっさりするな」
程度で済む話でも、弾幕STGの場合、1フレームの入力遅延のせいで自分の感覚だと
よけたはずなのに弾に当って死んでしまう、というシチュエーションがある以上、
それを織り込んで納得のいくゲームデザインにするのは難しいでしょうね。



アイドル

リンク

2017/9/25(Mon) 23:04:09|NO.81463

暇人さん。ありがとうございます。


確かに弾の大きさを基準としてすればそこまで大きくならないし、そういう仕様で作った方がわかりやすいかもですね。
敵は自動削除、敵弾はエリア指定した削除みたいな。

当たり判定はもちろんes_checkで処理します。
多分殆どの処理をスプライトですると思います(分かる範囲ですけど)
--------------
ZAPさん。

>>同時プレイだと双方のゲーム進行がフレーム単位で一致していなければならない、
>>というのがありまして、どうやっても通信によるタイムラグが避けられない以上、
>>たとえ双方のマシンで処理落ちせずにプログラムが走っていたとしても、
>>通信ラグの問題できわめて困難との結論に達しました。
やっぱ難しいんですね・・・アドバイス助かります。
そういえば花映塚のネット対戦は非公式でしたわ・・・

同じ東方の非想天則では格闘ゲームですが、ネット対戦はたまにラグが発生するときがあります。
あちらはCなどで作られていると思うので、速度早い言語でも上記のようなことが発生しているようです。
STGだと意図しない着弾で残機が減ってしまうので、過剰なストレスに見舞われることを考えると恐ろしいです。



あ、そうそう。次、わからないことがあった場合も新スレッドで聞きます。
(流れからしてこっちで「hspdxfix.as」について聞いたほうがいいと思ったけど、長くなっちまった)



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