ページ 11

フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 22:31
by Yuno
初めまして初心者です

STGを作っていたのですが、
ALT+ENTERでフルスクリーンモードになるようにしようと思ったのですがうまくいきません

一応それらしきもの↓を見つけたもの↓の使い方もわからず困っています
<DxLib.h 内部のものです…>
SetUseASyncChangeWindowModeFunction(int Flag,void(*CallBackFunction)(void*),void *Data);

どうやったらできますか?
誰か助けてください!!

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:06
by Yuno
あとこれは一応ここのプログラムがベースです

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:21
by Stanry
SetUseASyncChangeWindowModeFunctionは調べたところ最大化を許可する関数のようです。フルスクリーンにはなりません。
DXライブラリのGetHitKeyStateAll関数でALTキーとEnterキーが両方押されていたらChangeWindowModeを呼んでやれば良いかと。
画面のフル、ウィンドウの判定はGetWindowModeFlag関数でどうぞ。

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:29
by Yuno
それで何度か試してるのですが…
ALT+ENTERをGetHitKeyStateAllで試すと
完全に同時入力しているときのみ1、もしくはTRUEになるんですよ

あの、ALT+ENTERって普通ALT→ENTERの順に押すじゃないですか

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:40
by あ~る
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)フルスクリーン

みたいな感じでどすか?
ただこれだと毎ループウィンドウのサイズを設定してるから処理速度とかに悪いかも…そこら辺僕にはわかんないですけど…(-.-;)

#追記
携帯からなんでもしかしたらめっちゃ見にくいかも……
見にくかったらすいません… 画像

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:41
by array
if ((ALT) != 0 && (ENTER) != 0) で両方が押下されている常態が検知できると思います。

ただし、押されている間は毎フレーム「GetHitKeyStateAll関数」が呼び出されてしまうので

if ((ALT) != 0 && (ENTER) != 0 && flag == 0) {
GetHitKeyStateAll();
flag = 1;
} else if (flag == 1) {
flag = 0; // 2度目の入力を受け付けるなら、フラグを戻す処理も
}


などで、フラグ処理を入れて1度しか実行されないようにしたほうがいいと思います。

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:42
by Yuno
すみません
うまくいきました
少しコードが狂っていたようです

ところでこの移行後にちゃんと描画されないのはどうしてでしょうか?

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:46
by Yuno
はぁ
なるほど
そんな書き方もあるのですか
参考になります

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月21日(日) 23:51
by Stanry
#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関数が入っているのが不思議です。 画像

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 00:00
by Yuno
Bufの定義は普通にCharでいいんでしょうか?
また定義してビルドした際に
error C2109: 配列または、ポインタでない変数に添字が使われました。
fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
と言われて
止まるのですが…?

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 00:02
by Stanry
↑全ソースに直しました。charで256個の配列を使うようにしてください。(←リファレンスより
あと、whileの入りでエスケープの判定をしていてそこに入るまでにcharが初期化されてないです。
なのでcharは宣言時に初期化して対処でおk

↓管理人様、指摘ありがとうございます。すいませんでした。 画像

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 00:04
by Dixq (管理人)
普通かどうかではなく、使いたい関数の引数に合わせましょう。

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 00:10
by Yuno
ありがとうございます
うまくいきました

……が今度は画面が真っ黒です
操作をちょこちょことすると画像が出てきましたが…
何かしなければいけないのでしょうか?

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 00:17
by Stanry
描画処理が止められていなければ大丈夫だと思うんですけど・・・。
意図的に止めたりしてはいませんよね?
あなたの書いたコードがわからないのでこれが限界です。。 画像

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 00:21
by Yuno
一応メインループの場所はこんな感じです
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:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 00:30
by Stanry
裏画面反映(ScreenFlip)の前に画面のモード切り替えを入れたらどうなりますか?
どこかで意図的に処理が止められていた場合何か操作しないと画面が出てこないというのならばわかるのですが。 画像

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 01:53
by Yuno
結局同じです
なぜかfunc_stateを0にすると描画がうまくいくのですが…

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 02:12
by Stanry
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ast&no=451
ここで書かれているようにChangeWindowMode 関数を呼び出した後、再度 SetDrawScreen( DX_SCREEN_BACK );を
実行する必要があるそうです。
画面設定が消えているということなので、描画内容が消えるのもうなずけます。
画面切り替えした後、SetDrawScreenを実行し、さらに再描画する必要があるみたいです。

念のために上のソースも弄っておきます 画像

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 10:34
by yu
DXライブラリのリファレンスページの
ChangeWindowModeの項目の注意書きに記してありますが、

SetDrawScreen等の再設定もそうですが、
読み込んだ画像データやフォントも消えてしまいます。
ですので、もう一度ロードしなければ画像を描画できないようです。

http://homepage2.nifty.com/natupaji/DxL ... html#R11N1

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 12:50
by Stanry
ロード内容初期化までされちゃうんですか。
そこまで見てなかったので私も勉強になります。

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月22日(月) 18:39
by Yuno
わかりました
試してみます

Re:フルスクリーンへの移行がうまくいきません…

Posted: 2010年2月23日(火) 00:48
by Yuno
最終的にこのようにしたところ解決いたしました

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)

}


どうもありがとうございました

ファイル処理について

Posted: 2010年3月11日(木) 13:09
by くりく
いまゲームプログラミングの館で勉強しているのですが、t0のセーブデータの作り方のところで
コピペで実行すると下のようなエラーがでてできないのですが、これは何が原因なのでしょうか?

LIBCMTD.lib(wincrt0.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\シューティング\test\Debug\C言語プログラミングの館.exe : fatal error LNK1120: 外部参照 1 が未解決です。

Re:ファイル処理について

Posted: 2010年3月11日(木) 13:36
by Tatu
t0のページには注意書きはありませんが
ここで挙げられているサンプルは

それまでのと同じウインドウズアプリケーション用ではなく、
コンソールアプリケーション用のコードだからです。

このことはメイン関数がそれまでのWinMainではなく、
mainとなっていることからわかります。

ウインドウズアプリケーションのメイン関数は
WinMainなのにそれが定義されてないので
WinMainが未解決というエラーが出ます。

コンソールアプリケーション用のプロジェクトを作り、試してください。

Re:ファイル処理について

Posted: 2010年3月11日(木) 13:39
by tk
http://www.a.math.ryukoku.ac.jp/~hig/co ... n/faq.html
上記URLの下のほうの現象と一緒じゃないですか?

一度試してみてください。


Windowsではコンソールアプリケーションとウィンドウアプリケーションの2つ実行形式があります。
コンソールアプリケーションではエントリポイントがmain、ウィンドウアプリケーションではWinMainになります。
ですので今回「セーブデータの作り方」のソースでは、mainが使われていますので、コンソールアプリケーションで作らないとエラーがでます。

Re:ファイル処理について

Posted: 2010年3月11日(木) 13:41
by くりく
できましたありがとうございます!

ということは、
このコンソールアプリケーションとウィンドウズアプリケーションを一つのプログラムで実行するということは無理なんでしょうか? 画像

Re:ファイル処理について

Posted: 2010年3月11日(木) 14:22
by tk
> ということは、
> このコンソールアプリケーションとウィンドウズアプリケーションを一つのプログラムで実行するということは無理なんでしょうか?

コンソールアプリケーションとウィンドウズアプリケーションを一緒くたにすることは無理だと思います。

ただし、
例えば、コンソールアプリで、デスクトップのインスタンスハンドルを取得してウィンドウを表示させる・・・ということは可能です。

Re:ファイル処理について

Posted: 2010年3月11日(木) 14:48
by くりく
ご丁寧にありがとうございます^^
たすかりました