フルスクリーンへの移行がうまくいきません…
フルスクリーンへの移行がうまくいきません…
初めまして初心者です
STGを作っていたのですが、
ALT+ENTERでフルスクリーンモードになるようにしようと思ったのですがうまくいきません
一応それらしきもの↓を見つけたもの↓の使い方もわからず困っています
<DxLib.h 内部のものです…>
SetUseASyncChangeWindowModeFunction(int Flag,void(*CallBackFunction)(void*),void *Data);
どうやったらできますか?
誰か助けてください!!
STGを作っていたのですが、
ALT+ENTERでフルスクリーンモードになるようにしようと思ったのですがうまくいきません
一応それらしきもの↓を見つけたもの↓の使い方もわからず困っています
<DxLib.h 内部のものです…>
SetUseASyncChangeWindowModeFunction(int Flag,void(*CallBackFunction)(void*),void *Data);
どうやったらできますか?
誰か助けてください!!
Re:フルスクリーンへの移行がうまくいきません…
SetUseASyncChangeWindowModeFunctionは調べたところ最大化を許可する関数のようです。フルスクリーンにはなりません。
DXライブラリのGetHitKeyStateAll関数でALTキーとEnterキーが両方押されていたらChangeWindowModeを呼んでやれば良いかと。
画面のフル、ウィンドウの判定はGetWindowModeFlag関数でどうぞ。
DXライブラリのGetHitKeyStateAll関数でALTキーとEnterキーが両方押されていたらChangeWindowModeを呼んでやれば良いかと。
画面のフル、ウィンドウの判定はGetWindowModeFlag関数でどうぞ。
Re:フルスクリーンへの移行がうまくいきません…
それで何度か試してるのですが…
ALT+ENTERをGetHitKeyStateAllで試すと
完全に同時入力しているときのみ1、もしくはTRUEになるんですよ
あの、ALT+ENTERって普通ALT→ENTERの順に押すじゃないですか
ALT+ENTERをGetHitKeyStateAllで試すと
完全に同時入力しているときのみ1、もしくはTRUEになるんですよ
あの、ALT+ENTERって普通ALT→ENTERの順に押すじゃないですか
Re:フルスクリーンへの移行がうまくいきません…
if(window_flag==0 && ENTERとALTが押されてたら){
window_flag=1;
}
if(window_flag==1 && ENTERとALTが押されてたら){
window_flag=0;
}
if(window_flag==0)ウィンドウモード
if(window_flag==1)フルスクリーン
みたいな感じでどすか?
ただこれだと毎ループウィンドウのサイズを設定してるから処理速度とかに悪いかも…そこら辺僕にはわかんないですけど…(-.-;)
#追記
携帯からなんでもしかしたらめっちゃ見にくいかも……
見にくかったらすいません…
window_flag=1;
}
if(window_flag==1 && ENTERとALTが押されてたら){
window_flag=0;
}
if(window_flag==0)ウィンドウモード
if(window_flag==1)フルスクリーン
みたいな感じでどすか?
ただこれだと毎ループウィンドウのサイズを設定してるから処理速度とかに悪いかも…そこら辺僕にはわかんないですけど…(-.-;)
#追記
携帯からなんでもしかしたらめっちゃ見にくいかも……
見にくかったらすいません…

Re:フルスクリーンへの移行がうまくいきません…
if ((ALT) != 0 && (ENTER) != 0) で両方が押下されている常態が検知できると思います。
ただし、押されている間は毎フレーム「GetHitKeyStateAll関数」が呼び出されてしまうので
if ((ALT) != 0 && (ENTER) != 0 && flag == 0) {
GetHitKeyStateAll();
flag = 1;
} else if (flag == 1) {
flag = 0; // 2度目の入力を受け付けるなら、フラグを戻す処理も
}
などで、フラグ処理を入れて1度しか実行されないようにしたほうがいいと思います。
ただし、押されている間は毎フレーム「GetHitKeyStateAll関数」が呼び出されてしまうので
if ((ALT) != 0 && (ENTER) != 0 && flag == 0) {
GetHitKeyStateAll();
flag = 1;
} else if (flag == 1) {
flag = 0; // 2度目の入力を受け付けるなら、フラグを戻す処理も
}
などで、フラグ処理を入れて1度しか実行されないようにしたほうがいいと思います。
Re:フルスクリーンへの移行がうまくいきません…
すみません
うまくいきました
少しコードが狂っていたようです
ところでこの移行後にちゃんと描画されないのはどうしてでしょうか?
うまくいきました
少しコードが狂っていたようです
ところでこの移行後にちゃんと描画されないのはどうしてでしょうか?
Re:フルスクリーンへの移行がうまくいきません…
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char Buf[ 256 ] ={0};
ChangeWindowMode( TRUE );//ウインドウにする
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen( DX_SCREEN_BACK );
// キーの入力待ち
while( Buf[ KEY_INPUT_ESCAPE ] != 1 )
{
GetHitKeyStateAll( Buf ) ;
if( Buf[ KEY_INPUT_LALT ] == 1 || Buf[ KEY_INPUT_RALT ] == 1 )
{
if( Buf[ KEY_INPUT_RETURN ] == 1 ){
if( GetWindowModeFlag() == 0){
ChangeWindowMode( TRUE );//ウインドウにする
SetDrawScreen( DX_SCREEN_BACK );//モードチェンジ後再定義
}else{
ChangeWindowMode( FALSE );
SetDrawScreen( DX_SCREEN_BACK );
}
//ここで画像ロードし直しとか
}
}
// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが発生したらループを抜ける
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
とりあえずやってみたから貼り。
試してみた結果ですが、変更中はすべての処理が停止されるので連続で切り替わるのを予防する処理は要らなかったです。
GetHitKeyStateAll( Buf );は普通に毎ループ呼び出して良い物と思ってましたが違うんでしょうかね。
arrayさんのプログラムで判定より後にGetHitKeyStateAll関数が入っているのが不思議です。
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
char Buf[ 256 ] ={0};
ChangeWindowMode( TRUE );//ウインドウにする
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen( DX_SCREEN_BACK );
// キーの入力待ち
while( Buf[ KEY_INPUT_ESCAPE ] != 1 )
{
GetHitKeyStateAll( Buf ) ;
if( Buf[ KEY_INPUT_LALT ] == 1 || Buf[ KEY_INPUT_RALT ] == 1 )
{
if( Buf[ KEY_INPUT_RETURN ] == 1 ){
if( GetWindowModeFlag() == 0){
ChangeWindowMode( TRUE );//ウインドウにする
SetDrawScreen( DX_SCREEN_BACK );//モードチェンジ後再定義
}else{
ChangeWindowMode( FALSE );
SetDrawScreen( DX_SCREEN_BACK );
}
//ここで画像ロードし直しとか
}
}
// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが発生したらループを抜ける
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
とりあえずやってみたから貼り。
試してみた結果ですが、変更中はすべての処理が停止されるので連続で切り替わるのを予防する処理は要らなかったです。
GetHitKeyStateAll( Buf );は普通に毎ループ呼び出して良い物と思ってましたが違うんでしょうかね。
arrayさんのプログラムで判定より後にGetHitKeyStateAll関数が入っているのが不思議です。

Re:フルスクリーンへの移行がうまくいきません…
Bufの定義は普通にCharでいいんでしょうか?
また定義してビルドした際に
error C2109: 配列または、ポインタでない変数に添字が使われました。
fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
と言われて
止まるのですが…?
また定義してビルドした際に
error C2109: 配列または、ポインタでない変数に添字が使われました。
fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
と言われて
止まるのですが…?
Re:フルスクリーンへの移行がうまくいきません…
↑全ソースに直しました。charで256個の配列を使うようにしてください。(←リファレンスより
あと、whileの入りでエスケープの判定をしていてそこに入るまでにcharが初期化されてないです。
なのでcharは宣言時に初期化して対処でおk
↓管理人様、指摘ありがとうございます。すいませんでした。
あと、whileの入りでエスケープの判定をしていてそこに入るまでにcharが初期化されてないです。
なのでcharは宣言時に初期化して対処でおk
↓管理人様、指摘ありがとうございます。すいませんでした。

Re:フルスクリーンへの移行がうまくいきません…
ありがとうございます
うまくいきました
……が今度は画面が真っ黒です
操作をちょこちょことすると画像が出てきましたが…
何かしなければいけないのでしょうか?
うまくいきました
……が今度は画面が真っ黒です
操作をちょこちょことすると画像が出てきましたが…
何かしなければいけないのでしょうか?
Re:フルスクリーンへの移行がうまくいきません…
描画処理が止められていなければ大丈夫だと思うんですけど・・・。
意図的に止めたりしてはいませんよね?
あなたの書いたコードがわからないのでこれが限界です。。
意図的に止めたりしてはいませんよね?
あなたの書いたコードがわからないのでこれが限界です。。

Re:フルスクリーンへの移行がうまくいきません…
一応メインループの場所はこんな感じです
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
SetDisplayMenuFlag(FALSE);
SetKeyExclusiveCooperativeLevelFlag(FALSE);
char Buf[ 256 ] ={0};
ChangeWindowMode( TRUE );//ウインドウにする
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
count_t=0;
while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=98;
ini();
break;
case 98://title
bgm_main_t(); enter_func_tm("タイトルBGM");
title(); enter_func_tm("タイトル処理");
break;
case 99://STGを始める前に行う初期化
load_story();
func_state=100;
break;
case 90://STG一時停止復帰用
ini();
load_story();
func_state=100;
break;
case 100://通常処理
fantasy_check();
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
shot_main(); enter_func_tm("ショットメイン");
out_main(); enter_func_tm("当たり判定");
effect_main(); enter_func_tm("エフェクトメイン");
calc_main(); enter_func_tm("計算メイン");
graph_main(); enter_func_tm("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
case 101://一時停止
DrawGraph(0, 0, img_screen, FALSE);
break;
case 102://コンティニュー
DrawGraph(0,0,img_screen,FALSE);
break;
case 103://ラノベ
calc_ch();
ch_move();
calc_option_bb();
graph_nonshot_etc();
fantasy_disp();
if(boss.flag==1)
stage_count++;
break;
case 104:
cnt_change++;
if(cnt_change>20){
cnt_change=0;
func_state=t_func_state;
}
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
control_main(); enter_func_tm("コントロール");
fps_wait(); enter_func_tm("待機した時間",1);
ScreenFlip();//裏画面反映
count++;
GetHitKeyStateAll( Buf ) ;
if( Buf[ KEY_INPUT_LALT ] == 1 || Buf[ KEY_INPUT_RALT ] == 1 )
{
if( Buf[ KEY_INPUT_RETURN ] == 1 ){
if( GetWindowModeFlag() == 0){
ChangeWindowMode( TRUE );//ウインドウにする
}else{
ChangeWindowMode( FALSE );
}
}
// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが発生したらループを抜ける
}
}
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
やたら長いですが勘弁願います;;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
SetDisplayMenuFlag(FALSE);
SetKeyExclusiveCooperativeLevelFlag(FALSE);
char Buf[ 256 ] ={0};
ChangeWindowMode( TRUE );//ウインドウにする
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
count_t=0;
while(ProcessLoop()==0){//メインループ
music_ini();
switch(func_state){
case 0://初回のみ入る処理
load(); //データロード
first_ini();//初回の初期化
func_state=98;
ini();
break;
case 98://title
bgm_main_t(); enter_func_tm("タイトルBGM");
title(); enter_func_tm("タイトル処理");
break;
case 99://STGを始める前に行う初期化
load_story();
func_state=100;
break;
case 90://STG一時停止復帰用
ini();
load_story();
func_state=100;
break;
case 100://通常処理
fantasy_check();
enter_func_tm("最初");
calc_ch(); enter_func_tm("キャラ計算");
ch_move(); enter_func_tm("キャラ移動");
cshot_main(); enter_func_tm("自機ショットメイン");
enemy_main(); enter_func_tm("敵処理メイン");
boss_shot_main();enter_func_tm("ボスショットメイン");
shot_main(); enter_func_tm("ショットメイン");
out_main(); enter_func_tm("当たり判定");
effect_main(); enter_func_tm("エフェクトメイン");
calc_main(); enter_func_tm("計算メイン");
graph_main(); enter_func_tm("描画メイン");
bgm_main(); enter_func_tm("BGMメイン");
if(boss.flag==0)
stage_count++;
break;
case 101://一時停止
DrawGraph(0, 0, img_screen, FALSE);
break;
case 102://コンティニュー
DrawGraph(0,0,img_screen,FALSE);
break;
case 103://ラノベ
calc_ch();
ch_move();
calc_option_bb();
graph_nonshot_etc();
fantasy_disp();
if(boss.flag==1)
stage_count++;
break;
case 104:
cnt_change++;
if(cnt_change>20){
cnt_change=0;
func_state=t_func_state;
}
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play(); enter_func_tm("音楽再生");
control_main(); enter_func_tm("コントロール");
fps_wait(); enter_func_tm("待機した時間",1);
ScreenFlip();//裏画面反映
count++;
GetHitKeyStateAll( Buf ) ;
if( Buf[ KEY_INPUT_LALT ] == 1 || Buf[ KEY_INPUT_RALT ] == 1 )
{
if( Buf[ KEY_INPUT_RETURN ] == 1 ){
if( GetWindowModeFlag() == 0){
ChangeWindowMode( TRUE );//ウインドウにする
}else{
ChangeWindowMode( FALSE );
}
}
// メッセージ処理
if( ProcessMessage() == -1 )
{
break ; // エラーが発生したらループを抜ける
}
}
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
やたら長いですが勘弁願います;;
Re:フルスクリーンへの移行がうまくいきません…
裏画面反映(ScreenFlip)の前に画面のモード切り替えを入れたらどうなりますか?
どこかで意図的に処理が止められていた場合何か操作しないと画面が出てこないというのならばわかるのですが。
どこかで意図的に処理が止められていた場合何か操作しないと画面が出てこないというのならばわかるのですが。

Re:フルスクリーンへの移行がうまくいきません…
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ast&no=451
ここで書かれているようにChangeWindowMode 関数を呼び出した後、再度 SetDrawScreen( DX_SCREEN_BACK );を
実行する必要があるそうです。
画面設定が消えているということなので、描画内容が消えるのもうなずけます。
画面切り替えした後、SetDrawScreenを実行し、さらに再描画する必要があるみたいです。
念のために上のソースも弄っておきます
ここで書かれているようにChangeWindowMode 関数を呼び出した後、再度 SetDrawScreen( DX_SCREEN_BACK );を
実行する必要があるそうです。
画面設定が消えているということなので、描画内容が消えるのもうなずけます。
画面切り替えした後、SetDrawScreenを実行し、さらに再描画する必要があるみたいです。
念のために上のソースも弄っておきます

Re:フルスクリーンへの移行がうまくいきません…
DXライブラリのリファレンスページの
ChangeWindowModeの項目の注意書きに記してありますが、
SetDrawScreen等の再設定もそうですが、
読み込んだ画像データやフォントも消えてしまいます。
ですので、もう一度ロードしなければ画像を描画できないようです。
http://homepage2.nifty.com/natupaji/DxL ... html#R11N1
ChangeWindowModeの項目の注意書きに記してありますが、
SetDrawScreen等の再設定もそうですが、
読み込んだ画像データやフォントも消えてしまいます。
ですので、もう一度ロードしなければ画像を描画できないようです。
http://homepage2.nifty.com/natupaji/DxL ... html#R11N1
Re:フルスクリーンへの移行がうまくいきません…
最終的にこのようにしたところ解決いたしました
main.cpp
void CWM(){
char Buf[ 256 ] ={0};
GetHitKeyStateAll( Buf ) ;
if(( Buf[ KEY_INPUT_LALT ] == 1 || Buf[ KEY_INPUT_RALT ] == 1 )&&
func_state!=104)
{
if( Buf[ KEY_INPUT_RETURN ] == 1 ){
if( GetWindowModeFlag() == 0){
ChangeWindowMode( TRUE );//ウインドウにする
t_func_state=func_state;
}else{
ChangeWindowMode( FALSE );
t_func_state=func_state;
}
SetDrawScreen( DX_SCREEN_BACK );
load();
reini();
}
}
}
ini.cpp
void reini(){
Ini3Dbackground();//(60)
Ini3D_01();//(60)
}
どうもありがとうございました
main.cpp
void CWM(){
char Buf[ 256 ] ={0};
GetHitKeyStateAll( Buf ) ;
if(( Buf[ KEY_INPUT_LALT ] == 1 || Buf[ KEY_INPUT_RALT ] == 1 )&&
func_state!=104)
{
if( Buf[ KEY_INPUT_RETURN ] == 1 ){
if( GetWindowModeFlag() == 0){
ChangeWindowMode( TRUE );//ウインドウにする
t_func_state=func_state;
}else{
ChangeWindowMode( FALSE );
t_func_state=func_state;
}
SetDrawScreen( DX_SCREEN_BACK );
load();
reini();
}
}
}
ini.cpp
void reini(){
Ini3Dbackground();//(60)
Ini3D_01();//(60)
}
どうもありがとうございました
ファイル処理について
いまゲームプログラミングの館で勉強しているのですが、t0のセーブデータの作り方のところで
コピペで実行すると下のようなエラーがでてできないのですが、これは何が原因なのでしょうか?
LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\シューティング\test\Debug\C言語プログラミングの館.exe : fatal error LNK1120: 外部参照 1 が未解決です。
コピペで実行すると下のようなエラーがでてできないのですが、これは何が原因なのでしょうか?
LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\シューティング\test\Debug\C言語プログラミングの館.exe : fatal error LNK1120: 外部参照 1 が未解決です。
Re:ファイル処理について
t0のページには注意書きはありませんが
ここで挙げられているサンプルは
それまでのと同じウインドウズアプリケーション用ではなく、
コンソールアプリケーション用のコードだからです。
このことはメイン関数がそれまでのWinMainではなく、
mainとなっていることからわかります。
ウインドウズアプリケーションのメイン関数は
WinMainなのにそれが定義されてないので
WinMainが未解決というエラーが出ます。
コンソールアプリケーション用のプロジェクトを作り、試してください。
ここで挙げられているサンプルは
それまでのと同じウインドウズアプリケーション用ではなく、
コンソールアプリケーション用のコードだからです。
このことはメイン関数がそれまでのWinMainではなく、
mainとなっていることからわかります。
ウインドウズアプリケーションのメイン関数は
WinMainなのにそれが定義されてないので
WinMainが未解決というエラーが出ます。
コンソールアプリケーション用のプロジェクトを作り、試してください。
Re:ファイル処理について
http://www.a.math.ryukoku.ac.jp/~hig/co ... n/faq.html
上記URLの下のほうの現象と一緒じゃないですか?
一度試してみてください。
Windowsではコンソールアプリケーションとウィンドウアプリケーションの2つ実行形式があります。
コンソールアプリケーションではエントリポイントがmain、ウィンドウアプリケーションではWinMainになります。
ですので今回「セーブデータの作り方」のソースでは、mainが使われていますので、コンソールアプリケーションで作らないとエラーがでます。
上記URLの下のほうの現象と一緒じゃないですか?
一度試してみてください。
Windowsではコンソールアプリケーションとウィンドウアプリケーションの2つ実行形式があります。
コンソールアプリケーションではエントリポイントがmain、ウィンドウアプリケーションではWinMainになります。
ですので今回「セーブデータの作り方」のソースでは、mainが使われていますので、コンソールアプリケーションで作らないとエラーがでます。
Re:ファイル処理について
できましたありがとうございます!
ということは、
このコンソールアプリケーションとウィンドウズアプリケーションを一つのプログラムで実行するということは無理なんでしょうか?
ということは、
このコンソールアプリケーションとウィンドウズアプリケーションを一つのプログラムで実行するということは無理なんでしょうか?

Re:ファイル処理について
> ということは、
> このコンソールアプリケーションとウィンドウズアプリケーションを一つのプログラムで実行するということは無理なんでしょうか?
コンソールアプリケーションとウィンドウズアプリケーションを一緒くたにすることは無理だと思います。
ただし、
例えば、コンソールアプリで、デスクトップのインスタンスハンドルを取得してウィンドウを表示させる・・・ということは可能です。
> このコンソールアプリケーションとウィンドウズアプリケーションを一つのプログラムで実行するということは無理なんでしょうか?
コンソールアプリケーションとウィンドウズアプリケーションを一緒くたにすることは無理だと思います。
ただし、
例えば、コンソールアプリで、デスクトップのインスタンスハンドルを取得してウィンドウを表示させる・・・ということは可能です。