画像解像度について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
コレジャナイ

画像解像度について

#1

投稿記事 by コレジャナイ » 14年前

度々失礼させて頂きます。

ふと何気なく画像解像度の切り替えやウインドウ、フルスクリーンの切り替えをオプションで実装しまして、その際に起こった不具合についてお尋ねしたく参りました。
自分自身全く解像度について理解出来ていないため、見当違いな質問かもしれませんが何卒宜しくお願いしますm(_ _)m


現在オプション内に任意の解像度を手入力出来る項目を設置し、Saveが押されたら

・SetGraphModeで画面解像度とカラービット数の変更
・ChangeWindowModeでフルスクリーンかどうかの変更
・Dxliv_init

といった流れで変更しております。

ただこれでは例えば自分のノートPCのモニタサイズが1366×768なのですが、640×480でフルスクリーン化しますと、拡大はしますが左右に描画されないエリアが表示されてしまいます。
(モニタの解像度比率と4:3が一致してないためなのですが)

続いて手入力で1366×768を入力しフルスクリーンモードにした所、フルスクリーンではあるものの描画画面のサイズは640×480のままとなりました。


そこでゲーム内の画面の大きさをモニタの解像度にあわせるにはどのようにすれば宜しいのでしょうか?

SetWindowSizeExtendRateではウインドウモード時の設定ですし、そもそもこれは左右等しい割合で拡大縮小するため、1366の様な数字に対してはあまり有効ではないのかなと。

↑に付随してChangeWindowModeの項目にウインドウモードではSetGraphModeでの変更が出来ないとありましたが、これはどういう意味なのでしょうか?
ゲーム内の画面はそのままでしたが少なくとも外枠の大きさは変更出来たので・・・。
(現在フルスクリーン選択時のみ解像度を選択出来るような処理にしていますが、このままで問題はないでしょうか?
SetWindowSizeChangeEnableFlag(TRUE)を使っているので、画面サイズは任意に変えれる状態ではあります。)


最終的な希望としましてはSetWindowSizeChangeEnableFlag(TRUE)のように、フルスクリーンでもゲーム内画面をモニタのサイズに完全一致させたいと思っておりますが、どのように実装すれば宜しいでしょうか・・?


また1366×768のモニタでフルスクリーン設定、解像度を1280×1024など、XかYどちらかがモニタを越えてしまう場合処理が固まりまってしまいます(当たり前の事なのかもしれませんが・・・)
そのためモニタのサイズを取得し、そのサイズによって手入力などの限界値を変化させたいと考えておりますが、モニタのサイズを取得出来る関数などはありますでしょうか?


かつてないほど支離滅裂な質問になってしまい誠に申し訳御座いませんが、宜しくお願い致しますm(_ _)m

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#2

投稿記事 by softya(ソフト屋) » 14年前

残念ながら画像サイズを画面に合わせるのは自分で行います。

【方法1】 元のサイズのまま描画できる第3のスクリーンバッファを用意する(ただし、16:9や4:3などのアスペクトに対応しておく必要あり)
第3のスクリーンバッファに描画した後、第3のスクリーンバッファを実際のバックバッファに拡大表示します。

【方法2】 拡大してちょうどよいサイズで表示する。これだけです。


【追記】
書き忘れてました。
Win32APIのEnumDisplaySettingsで解像度の一覧は得られるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#3

投稿記事 by コレジャナイ » 14年前

方法2については理解出来るのですが、方法1はどういう事なのでしょうか・・・?
ゲーム内の絵を16:9や4:3用に複数枚用意する・・・?

ゲームでしたら普通に搭載されてる機能ですのに、いざ実装しようとすると難しいですね。。


>>Win32API
Win32APIの知識は皆無なのですが、その関数を使うだけでしたら問題ないでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#4

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:方法2については理解出来るのですが、方法1はどういう事なのでしょうか・・・?
ゲーム内の絵を16:9や4:3用に複数枚用意する・・・?

ゲームでしたら普通に搭載されてる機能ですのに、いざ実装しようとすると難しいですね。。
縦横のサイズが変わるのでマップとかの表示個数を合わせるだけで良いと思います。
あと表示位置をアスペクト比に合わせて調整します。
コレジャナイ さんが書きました: >>Win32API
Win32APIの知識は皆無なのですが、その関数を使うだけでしたら問題ないでしょうか?
問題無いと思います。

後答え忘れていましたが
>↑に付随してChangeWindowModeの項目にウインドウモードではSetGraphModeでの変更が出来ないとありましたが、これはどういう意味なのでしょうか?
SetGraphModeだと描画バッファのサイズが変わらないのでは?

質問に番号を振ってもらうと答え忘れが防げるかも知れません。ご検討下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#5

投稿記事 by コレジャナイ » 14年前

調べた所Win32APIに関しては何とか実装出来そうです。


>SetGraphModeだと描画バッファのサイズが変わらないのでは?
おっしゃる通りゲーム内画面は変わりませんでした。有難う御座います。



>縦横のサイズが変わるのでマップとかの表示個数を合わせるだけで良いと思います。
>あと表示位置をアスペクト比に合わせて調整します。

申し訳御座いません、やはり方法1の手順が分りかねてしまっております。
アスペクト比に応じて、DrawModiGraphなどで画像自体を変形・・・させるという訳ではないのですよね。
座標位置を変えるだけで良いとおっしゃってらっしゃいますし。。

コレジャナイ

Re: 画像解像度について

#6

投稿記事 by コレジャナイ » 14年前

書き忘れました。
今後質問の番号振り注意致しますm(_ _)m

取り敢えずの所今はフルスクリーン化した際に、画面いっぱいにゲーム内画面を表示させたい

という質問のみという事でお願い致しますm(_ _)m

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#7

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:申し訳御座いません、やはり方法1の手順が分りかねてしまっております。
アスペクト比に応じて、DrawModiGraphなどで画像自体を変形・・・させるという訳ではないのですよね。
座標位置を変えるだけで良いとおっしゃってらっしゃいますし。。
大事なことを忘れていました。ドット拡大時は整数倍でないと美しくないと言うことです。
例えばHDモニタの1920x1080解像度だと拡大前には960x540や640x360で描画しないと美しく拡大出来ません。
なので、このサイズに合わせて描画してやります。
あと液晶モニターのドットサイズに合わせないとキレイに表示できないので、それも考慮する必要があります。

例えば960x540だと640x480に比べると比率が違うのでマップの縦横の表示個数を増やしてやる必要が出てきます。
ステータスなどの表示物もアスペクト比に合わせて位置を移動させてやります。

参考。
「いろんなパソコンやモニターで全画面表示」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2506
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#8

投稿記事 by コレジャナイ » 14年前

>>ソフト屋さん
紹介して下さったURLからフルスクリーン化に関しては成功致しました。有難う御座います。
解像度選択に関してはまだ早いと思い諦めました。
(現状デスクトップと同じ解像度に変更しつつフルスクリーン化しますのでこれで良いかなと。)

ただフルスクリーン化した際に、描画位置と実際の座標位置にズレが生じてしまいます。

現在これの解決方法について考えておりますが、デスクトップ解像度 ÷ ゲーム内画面サイズ(X:640) でそれぞれ求めたX,Yをピクセル座標を用いている部分に掛けていけば問題ないでしょうか?

DrawExtendGraph(0,0,デスクトップ解像度X、Y、 ゲーム描画スクリーン, FALSE)で引き伸ばしている訳ですから、割合としては同じなのかなと愚考しておりますが、如何でしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#9

投稿記事 by softya(ソフト屋) » 14年前

縦と横の倍率はdoubleで別に求めてますよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#10

投稿記事 by コレジャナイ » 14年前

構想段階なのでまだ組んでませんが、倍率は縦横それぞれdouble型で求める予定です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#11

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:ただフルスクリーン化した際に、描画位置と実際の座標位置にズレが生じてしまいます。
まだ組んでいない?
とするとこの意味を説明して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#12

投稿記事 by コレジャナイ » 14年前

あ、えっと取り敢えずフルスクリーン化は組みました。

ただ座標ズレが発生しているのでその解決に先ほど申し上げた方法を考えておりました。←これはまだ組んでない状態です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#13

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:あ、えっと取り敢えずフルスクリーン化は組みました。

ただ座標ズレが発生しているのでその解決に先ほど申し上げた方法を考えておりました。←これはまだ組んでない状態です。
実装状況を説明してもらっていないので分かり兼ねますが元の描画がスクリーン画像は640x480って事ですよね。参考に提示したコードを採用しているのならmain_screenに描画する限り座標ズレは生じないはずですが?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#14

投稿記事 by コレジャナイ » 14年前

おっしゃる通り、提示して頂いたコードの
//フル
と書かれてます部分を活用させて頂き、他もほぼ同様に仕上げたはずですが・・・。

main_screenに描画してますし、むむむ。。

もう一度しっかり見てきます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#15

投稿記事 by softya(ソフト屋) » 14年前

DrawLineでピクセル数が分かる目盛を書いてみたらどうでしょうか?
main_screenとDX_SCREEN_BACKの両方に書けば拡大スケールも確認できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#16

投稿記事 by コレジャナイ » 14年前

http://iup.2ch-library.com/i/i0661625-1339667928.png

目盛りの計り方がいまいちわかりませんでしたが、X座標10と20の地点に縦の長さ200の線を描きました。

青色の線が裏描画に描いたもので、黒色がmain_screenに書いたものです。

色々試していて不自然に感じたのは、マウスカーソルが拡大化されていないのですよね・・・。
通常フルスクリーン化の際にマウスカーソルも拡大化されるはずなので、ここら辺がどうも怪しそうです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#17

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:http://iup.2ch-library.com/i/i0661625-1339667928.png

目盛りの計り方がいまいちわかりませんでしたが、X座標10と20の地点に縦の長さ200の線を描きました。

青色の線が裏描画に描いたもので、黒色がmain_screenに書いたものです。

色々試していて不自然に感じたのは、マウスカーソルが拡大化されていないのですよね・・・。
通常フルスクリーン化の際にマウスカーソルも拡大化されるはずなので、ここら辺がどうも怪しそうです。
マウスカーソルはDX_SCREEN_BACKに描画されるのでは?つまりフルスクリーン系の座標系です。
なので座標合わせは自前でやらないとダメだと思います。

[補足]
拡大比率が分からないので、こちらは合っているとか合っていないとか何とも答えようがありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#18

投稿記事 by コレジャナイ » 14年前

あぁ、やはりマウスの座標ズレは自前で調整しないといけなかったんですね。

すみません誤解しておりました。

では頑張って調整してみます。


拡大比率は(640×480)→(1366×768)です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#19

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:拡大比率は(640×480)→(1366×768)です。
整数倍では無いのでかなりドットが汚くなりそうです。
あと4:3から16:9への変換ですので縦に画像がつぶれます(横に25%引き伸ばされるため)。
ハイビジョンテレビで昔の4:3の放送を横いっぱいに引き伸ばした感じですかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#20

投稿記事 by コレジャナイ » 14年前

>>ソフト屋さん
一応座標系がおかしいだけでプレイは出来るため、ちょっとプレイしてみて画面見ましたが、おっしゃる通りですね~・・・。

枠を引っ張ればウインドウモードでも拡大は出来るようにしているので、正直フルスクリーン化の意味は無いと思いますが、何となく(プログラム練習も兼ねて)実装してみる事にした次第です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#21

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:>>ソフト屋さん
一応座標系がおかしいだけでプレイは出来るため、ちょっとプレイしてみて画面見ましたが、おっしゃる通りですね~・・・。

枠を引っ張ればウインドウモードでも拡大は出来るようにしているので、正直フルスクリーン化の意味は無いと思いますが、何となく(プログラム練習も兼ねて)実装してみる事にした次第です。
いっそのことドットを拡大せずにフルスクリーンで等倍ドットサイズのままで遊べるようにするというのも手です。
まぁ、1920x1080ぐらいあると相当広い範囲のマップが表示されてしますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#22

投稿記事 by コレジャナイ » 14年前

>>ソフト屋さん

あぁ~なるほど!

SLGならアリですね。
遠めから見た方が将棋などのように全体を把握出来て面白そうです。

小さくて見辛いという人に対してはサイズを可変出来るウインドウモードでやってくださいと言えますし。


等倍表示の場合ですと、拡大するものとしない物の仕分けが難しいですね。

マップチップやキャラチップは等倍、背景は拡大として、メニュー関連はどうなのでしょう・・・。
やはり拡大させた方がやり易そうでしょうか。

ドットが等倍のためメニューなどを拡大すると多くの部分を隠してしまいそうで、かと言ってメニューも等倍では押しにくい・・・?

右メニューや召喚メニュー、スイッチ関連は拡大させても問題なさそうですが。


と悩んでみましたが、部分部分を拡大、非拡大選べるようするには莫大な労力が必要な気がしないでもありません・・。


実装難易度としては
上の方法と今からマウス座標調整を施す単純拡大ではどちらの方が易しいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#23

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:>>ソフト屋さん

あぁ~なるほど!

SLGならアリですね。
遠めから見た方が将棋などのように全体を把握出来て面白そうです。

小さくて見辛いという人に対してはサイズを可変出来るウインドウモードでやってくださいと言えますし。


等倍表示の場合ですと、拡大するものとしない物の仕分けが難しいですね。

マップチップやキャラチップは等倍、背景は拡大として、メニュー関連はどうなのでしょう・・・。
やはり拡大させた方がやり易そうでしょうか。

ドットが等倍のためメニューなどを拡大すると多くの部分を隠してしまいそうで、かと言ってメニューも等倍では押しにくい・・・?

右メニューや召喚メニュー、スイッチ関連は拡大させても問題なさそうですが。


と悩んでみましたが、部分部分を拡大、非拡大選べるようするには莫大な労力が必要な気がしないでもありません・・。


実装難易度としては
上の方法と今からマウス座標調整を施す単純拡大ではどちらの方が易しいのでしょうか?
易しい方から
1.拡大でマウス座標補正
2.全部等倍
3.部分部分で等倍・拡大を選択
だと思います。
1.と2.はプログラムの組み方次第では逆転する場合もあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#24

投稿記事 by コレジャナイ » 14年前

ふむむむむ・・・。

等倍と拡大を混在させる手法ですが、フルスクリーンかどうかをフラグ管理しておき、
フルスクリーンの場合等倍にしたいものを描画する前に縮小させて描画するという方法になりますでしょうか・・・?

メインループの一番最後で第三スクリーンに描いてあるものを裏画面へ拡大描画している訳ですから、一部を拡大させないというよりは、第三スクリーンの段階で既に縮小させておき、裏画面へ拡大描画するとちょうど等倍になる という事なのかなと考えましたが、この考え方で合っていますでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#25

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:ふむむむむ・・・。

等倍と拡大を混在させる手法ですが、フルスクリーンかどうかをフラグ管理しておき、
フルスクリーンの場合等倍にしたいものを描画する前に縮小させて描画するという方法になりますでしょうか・・・?

メインループの一番最後で第三スクリーンに描いてあるものを裏画面へ拡大描画している訳ですから、一部を拡大させないというよりは、第三スクリーンの段階で既に縮小させておき、裏画面へ拡大描画するとちょうど等倍になる という事なのかなと考えましたが、この考え方で合っていますでしょうか?
素直に等倍の物はDX_SCREEN_BACKに直接描画して、一部拡大させたいものだけmain_screenに描くか直接拡大表示したほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#26

投稿記事 by コレジャナイ » 14年前

描画の仕組みと順番がいまいち把握しきれていないのですが

マップを描画する際に
マップチップを等倍で裏画面に描画しておく

そうすると最後にmain_screenを拡大して裏画面に描画した際に、先に書かれていたマップチップを上書きする形でmain_screenが描画されてしまいますよね?


だとするとそうですね、おっしゃる様に拡大したいものはSCREEN_BACKに直接拡大描画させて、そもそもmain_screenを使う必要の無い形にした方が良さそうでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#27

投稿記事 by softya(ソフト屋) » 14年前

main_screenの作り方次第ですが透明色を有効にしておけば何も書いていない部分は透明色として扱われます。

(0) DX_SCREEN_BACK → main_screen 切り替え
(1)背景クリア → main_screen
(2)拡大予定のメニューなどを描画 → main_screen
(3) main_screen → DX_SCREEN_BACK 切り替え
(4)背景の塗りつぶし → DX_SCREEN_BACK
(5)マップチップを等倍表示 → DX_SCREEN_BACK
(6) main_screenを拡大描画 → DX_SCREEN_BACK
とするだけです。

「補足」
ただ、main_screenを拡大描画 → DX_SCREEN_BACKで2.1倍とか整数倍ではないので直接に2倍とか整数倍に拡大出来るサイズで描画したほうがキレイでしょう。
そのために文字フォント等は専用に用意する必要がありますし座標合わせなど面倒は増えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#28

投稿記事 by コレジャナイ » 14年前

試してみましたが、やはり先にBACKに描画していた部分は黒で塗りつぶされてしまいました。

透明色を有効とは何処でどのように設定すれば宜しいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#29

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:試してみましたが、やはり先にBACKに描画していた部分は黒で塗りつぶされてしまいました。

透明色を有効とは何処でどのように設定すれば宜しいのでしょうか?
リファレンスをちゃんと見ましょう。
「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxL ... html#R3N25
そういうところを自力で調べるのは大事ですよ。

【補足】
作るのが目的ではなく作れる実力を付けることが一番大事です。
コレジャナイさんが作ったものは、コレジャナイさんがちゃんと理解して作っているものでなければ行けません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#30

投稿記事 by コレジャナイ » 14年前

>>ソフト屋さん
おうふ・・・。
申し訳御座いません・・・orz

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#31

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:>>ソフト屋さん
おうふ・・・。
申し訳御座いません・・・orz
ヒントは出しますがプロも視野に入れている人には少し厳しめになります。ご理解下さい。
ある程度悩んだ方が理解が進むので色々考えてもらうのはすごく勉強になることです。
なんとなく動いたが一番まずいと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#32

投稿記事 by コレジャナイ » 14年前

プロになった後では誰に聞くという事も出来ないので、当然だと思います。
気付けなかった自分が不甲斐なく・・・orz

DrawExtendGraphの第六引数がTRUEになっていない事が原因でしたorz


当たり判定を調整した後、一度ソフト屋さんにもお試し頂いて宜しいでしょうか?(恐らく明後日とかになりそうですが・・・)
自分のパソコン二台で試してはいるのですが、環境によってマウスの当たり判定などがおかしくなる(デスクトップ解像度から補正値を割り出しているので恐らく大丈夫だと思いたいですが・・・)などがあっては事ですので。

あ、そういえばマップによってスクロールの限界範囲を自動的に調整出来る様にしておきましたが、これもフルスクリーン時には範囲を狭める必要がありそうですね。

コレジャナイ

Re: 画像解像度について

#33

投稿記事 by コレジャナイ » 14年前

↑すみません、見て貰うという所は無かった事にして下さい。
ソフト屋さんに迷惑を掛けっぱなしなので・・・。

コレジャナイ

Re: 画像解像度について

#34

投稿記事 by コレジャナイ » 14年前

長い事悪戦苦闘し、過去の質問をずっと辿っていましたが、同様の質問がなかったために質問させて下さいorz

なるべく状況を詳しく書きます。


[症状]
フルスクリーンモード起動時にマウス座標がずれている。
デバッグモードでは左上の角(本来であればX:0,Y:0の位置)が、X:-10,Y-33にズレてしまっている。
リリースモードではX:10、Y:20にずれてしまっている。


不思議なのはこれが起動時のみ起こる現象で、オプション内で一度設定をデフォルトに戻した後、再度フルスクリーン化すると座標が直ります。


必要無かったので今まで言ってませんでしたが、一応オプションの設定は保存出来る様にして、バイナリデータとして出力しております。
(中身はフルスクリーンかどうかのフラグ、解像度のX、Y(これは描画にしか使ってないのであまり必要ないですが・・・)、カラービット数の4つです)
プログラム起動時にこの情報をロードして、フルスクリーンかどうかで初期化の値を変更していました。

どう考えてもこれが原因だと思い、ロードの部分を削除し初期化の値を手入力して起動を試しましたが、やはり座標がずれておりました。


オプションのセーブが押された後に行っている処理は
ChangeWindowMode
SetGraphMode
if(DxLib_Init() == -1) return; ←これを呼ばないと処理が重いままになってしまうため、初期化。
main_screen = MakeScreen( SCREEN_X, SCREEN_Y);
SetDrawScreen( main_screen);
SetMouseDispFlag
と後は画像初期化関数の呼び出しです。
(最後にファイルへ保存処理)

起動時も全く同じ処理を試しましたが、何故か座標がズレます・・・orz

初回起動時に座標がズレる事よりもむしろSAVEを押した時に座標のズレが直る事が不思議でなりません。
(メインループ内のswitch文にSAVEと同じ処理を設置してみて、一番最初に通る様にしましたが、やはり座標のズレは直りませんでした。)



これは恐らく実際に見て貰った方が早いと思いましたので、またプログラムを送らせて頂きましたOTL(申し訳ないです・・・。)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#35

投稿記事 by softya(ソフト屋) » 14年前

DxLib_Init()するならDxLib_End()しないとマズイと思います。
あと原因を割り出すためにシンプルな再現コードを作ったほうが良いでしょう。

今回もですが私のところでは再現しませんので、確実に起きる手順など正確な情報が欲しいです。
あとフルスクリーンからの終了方法も不明です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#36

投稿記事 by コレジャナイ » 14年前

http://iup.2ch-library.com/i/i0662226-1339736967.png
こちらがオプション設定でフルスクリーンに変更しセーブを押した後、再起動した後左上を指した画像です。
http://iup.2ch-library.com/i/i0662227-1339737053.png
こちらはフルスクリーンに変更した後プログラムを終了する前に左上を指した画像です。

DxLib_End()のリファレンスに
この関数を呼び出した後はなるべくすぐにプログラムを 終了させなければなりません。
とありましたので、終了前にしか呼んではいけないものかと思っておりました。
試しにInit前に呼び出してみましたがエラーで強制終了してしまいましたorz
Initのリファレンスにも記載が無いのですが、どういう事なのでしょうか?


再現方法ですが上記した通り、タイトル→オプション設定→フルスクリーン選択→Saveクリック(フルスクリーン化)→プログラムを終了する→プログラムを再び立ち上げる→マウスを一番左上に持って行くと座標がおかしくなっている
というものです。
ノートPC、デスクトップPC共に再現性がありましたので自分の環境では確実に発生してしまいそうです。

これはそこまで長いコードではありませんので、シンプルな再現コードを今から作ってみようと思います。


フルスクリーンからの終了方法は用意してませんでした。
(丁度Escを押されたらメニューを出そうと思って、Esc→終了のプログラムを消してしまっていたため)
追記しておきますm(_ _)m

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 画像解像度について

#37

投稿記事 by ISLe » 14年前

フルスクリーンにしたのに裏にウィンドウフレームが残ってしまっているのかもしれないですね。
マウス座標はクライアント座標で返る仕様なのでズレます。

DXライブラリのバグの可能性もありますね。
ウィンドウフレームが残っているのかクライアント座標のオフセットの計算が間違っているのかWin32 APIを使ってDXライブラリが返す値と比較してみてはいかがでしょう。
ClientToScreenを使ってフルスクリーンモードでクライアント座標(0,0)がスクリーン座標(0,0)になるかどうかで問題の切り分けができます。


ウィンドウアプリは特に禁止してない限りAltキーを押しながらF4キーを押すと終了します。

コレジャナイ

Re: 画像解像度について

#38

投稿記事 by コレジャナイ » 14年前

>>ISLeさん
前回は有難う御座いましたm(_ _)m

すみません、教えて頂いた方法を試そうとしているのですが、なにぶんC言語しか学んでいない身でして悪戦苦闘しておりますorz

現在
LPARAM lp;
HWND hWnd;
をグローバル変数に

関数内は
POINT pos;

pos.x = LOWORD( lp );
pos.y = HIWORD( lp );

ClientToScreen( hWnd, &pos );

DrawFormatString( 300, 0, GetColor( 0,0,0 ), "X:%d Y:%d", pos.x, pos.y );

とした所コンパイルは通りましたが値は0のままとなってしまいました。
正直何が行われているのかさっぱりですorz

Javaとかはもっと理解し易そうなプログラムだったと思いましたが、Win32APIは完全に別物ですね・・・。

コレジャナイ

Re: 画像解像度について

#39

投稿記事 by コレジャナイ » 14年前

因みにDXライブラリのVer3,05を使っております

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 画像解像度について

#40

投稿記事 by ISLe » 14年前

コード:

{
	POINT pt;
	pt.x = pt.y = 0;
	if (ClientToScreen(GetMainWindowHandle(), &pt)) {
		DrawFormatString(300, 0, GetColor(0,0,0), "X:%d Y:%d", pt.x, pt.y);
	}
}
このコードで"X:0 Y:0"と表示されなかったらクライアント領域がズレてます。
表示されたらDXライブラリの返すマウス座標が間違ってることになります。

コレジャナイ

Re: 画像解像度について

#41

投稿記事 by コレジャナイ » 14年前

試した所X:0、Y:0と表示されました。

念のためDXライブラリを最新版にしてみましたが、改善は見られませんでした・・・。

コレジャナイ

Re: 画像解像度について

#42

投稿記事 by コレジャナイ » 14年前

フルスクリーン化による座標ズレは修正しました
(起動時のマウス座標の変化は未だに修正出来ずorz

後フルスクリーンの場合、画面内のマップチップが一定量(2000マスくらい・・・?)を超えると処理落ちする事が発覚しました。


再現用コードが上手く書けず・・・もう少々お待ち下さいm(_ _)m

コレジャナイ

Re: 画像解像度について

#43

投稿記事 by コレジャナイ » 14年前

コード:

#include"DxLib.h"

#define SCREEN_W 640			//ゲーム自体の画面の横幅
#define SCREEN_H 480			//ゲーム自体の画面の縦幅

#define WINDOW_MODE 1
#define FULL_SCREEN_MODE 2

//ウインドウモードかどうか
static int window_mode_flag;

// ディスプレイ解像度
static int disp_x;
static int disp_y;
// 描画スクリーン
static int main_screen;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){

	window_mode_flag = FULL_SCREEN_MODE;

	SetGraphMode( disp_x , disp_y , 32 );
	ChangeWindowMode(window_mode_flag);

	/*int coordinate_x = SCREEN_W;
	int coordinate_y = SCREEN_H;

	window_mode_flag = WINDOW_MODE;

	SetGraphMode( coordinate_x , coordinate_y , 32 );
	ChangeWindowMode(window_mode_flag);*/

	SetMouseDispFlag(TRUE);						//マウス描画

	if(DxLib_Init()==-1)return -1;

	main_screen = MakeScreen( SCREEN_W, SCREEN_H);
	SetDrawScreen( main_screen);

	while( ProcessMessage() == 0){
		ClearDrawScreen();

		if( CheckHitKey( KEY_INPUT_RETURN) == 1 ){// エンターキーを押した時のみ
			window_mode_flag = FULL_SCREEN_MODE;

			SetGraphMode( disp_x , disp_y , 32 );
			ChangeWindowMode(window_mode_flag);

			if(DxLib_Init()==-1)return -1;

			main_screen = MakeScreen( SCREEN_W, SCREEN_H);
			SetDrawScreen( main_screen);
		}

		//適当な背景描画
		DrawBox(0,0,SCREEN_W,SCREEN_H,GetColor(255,255,255), TRUE);

		int mouseX = 0;
		int mouseY = 0;
		// マウスの入力情報を更新する
		GetMousePoint( &mouseX, &mouseY );
		DrawFormatString( 100, 0, GetColor( 255,0,0 ), "X:%d Y:%d", mouseX, mouseY );


		if(CheckHitKey( KEY_INPUT_ESCAPE ) == 1) break;		//ESCが押されたらゲーム終了

		//ゲーム画面を裏画面へ描画
		SetDrawScreen( DX_SCREEN_BACK);
		ClearDrawScreen();

		if(window_mode_flag == WINDOW_MODE){
			DrawGraph(0,0,main_screen,FALSE);
		}else if(window_mode_flag == FULL_SCREEN_MODE){
			DrawExtendGraph( 0, 0, disp_x, disp_y, main_screen, FALSE);
		}

		SetDrawScreen( main_screen );

		ScreenFlip();//裏画面反映
	}
	DxLib_End();
	return 0;
}
自分がやらんとしている事は大体このようなコードになっております。
エンターがSaveの代わりだと思ってください。
今箱が拡大描画されない原因究明のため、フルスクリーンモードで起動してますが、通常はコメントアウトしてある方で起動します。
何故これで箱が拡大描画されないのか原因不明のため、試行錯誤しております。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 画像解像度について

#44

投稿記事 by ISLe » 14年前

外部変数disp_x,disp_yが初期値ゼロのままなのでフルスクリーンモード時にオフスクリーンが転送されません。
画面モードも正しく設定されていなくてデフォルトの画面モードになっていますね。

マウス座標に関してはChangeWindowModeの引数はFALSE(0)かTRUE(1)なのに、それ以外の値が指定されているので異常な動作になっているようです。
隠しモードかもしれませんが。

コレジャナイ

Re: 画像解像度について

#45

投稿記事 by コレジャナイ » 14年前

なんで2にしていて、かつそれに気付かなかったのか・・・OTL

Defineしていて良かったです・・・。

ISLeさん有難う御座います。
取り敢えずマウスの座標ズレはこれにてめでたく解決致しました。
(こんなくだらない事のために長時間orz、付き合わせてしまって申し訳御座いませんm(_ _)m)

処理落ちに関しては後日別の質問という事で投稿させて頂きます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 画像解像度について

#46

投稿記事 by softya(ソフト屋) » 14年前

コレジャナイ さんが書きました:>>ISLeさん
前回は有難う御座いましたm(_ _)m

すみません、教えて頂いた方法を試そうとしているのですが、なにぶんC言語しか学んでいない身でして悪戦苦闘しておりますorz

現在
LPARAM lp;
HWND hWnd;
をグローバル変数に

関数内は
POINT pos;

pos.x = LOWORD( lp );
pos.y = HIWORD( lp );

ClientToScreen( hWnd, &pos );

DrawFormatString( 300, 0, GetColor( 0,0,0 ), "X:%d Y:%d", pos.x, pos.y );

とした所コンパイルは通りましたが値は0のままとなってしまいました。
正直何が行われているのかさっぱりですorz

Javaとかはもっと理解し易そうなプログラムだったと思いましたが、Win32APIは完全に別物ですね・・・。
Win32APIは単なるC言語の文法の範囲で行われていますよ。
メッセージやらコールバックが主体なので難しく感じるかも知れません。
hWndはDXライブラリから得る必要があります(専用関数あり)。
posはマウスの座標ですが今回はメッセージからではないのでLPARAM lp;は得られません。DXライブラリのマウス関数から得て下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

コレジャナイ

Re: 画像解像度について

#47

投稿記事 by コレジャナイ » 14年前

宣言や変数の型が見た事ないものかつ大文字主体であったため戸惑ってしまいました。

度々登場するので、簡単なものくらいは理解出来る様にしておきたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る