トップページ > 過去ログ > 記事閲覧
フルスクリーン時の画面サイズ
名前:dolphin 日時: 2008/10/28 21:14

現在ゲームを作成していて自力で解決できない問題が 発生したので質問させていただきます。 現在320×240でゲームを作成しているのですが、 最近のグラフィックボードでは320×240のサイズでの フルスクリーンモードは対応していないらしく、 友人宅のPCで起動テストを行った際意図していたのと 違う結果になりました。 そこで640×480モードでも起動できるようにと オプションを設定できるようにしてみたのですが これもうまくいかず困窮しています。 どなたか解決策をご提示願います。 ちなみに下が現在製作中のものです ttp://www.lifestyle-directory.org/dolphin/Action_game.zip ソースファイルも添付していますので ご協力してくださる方は上記より データをダウンロードしていただけると 問題点が分かりやすいかと思います。 (画面サイズの設定処理はmain.cppファイル内に 記述されています、 フォルダ内のDateフォルダ下にWindowOption.txtファイルがあり、 そこで画面モードを設定します。)

Page: 1 |

Re: フルスクリーン時の画面サイズ ( No.1 )
名前:Will 日時:2008/10/29 09:55

> これもうまくいかず困窮しています。 もっと詳細に説明してもらえませんか? 動かしてみましたが何が問題なのかわかりませんでした。 640*480で表示されましたけど。
Re: フルスクリーン時の画面サイズ ( No.2 )
名前: 日時:2008/10/29 12:01

やってみましたが、こちらでも640x480で 起動しました。 ただ、数値の読み込みにfscanfで%dはしない方が いいです。入力される値によっては、 バッファーオーバーフロウが発生します。 ユーザに値を変更させるなら、 もう少し分かりやすい方が良いと思うので、 私がやるなら結構しっかり作ると思います。 長いので行を稼ぐ為に可読性無視しています。 こんな感じかな。。。 /* --- config.h --------------------------------------------------------------*/ #ifndef INCLUDE_CONFIG_HEADER #define INCLUDE_CONFIG_HEADER #ifdef __cplusplus extern "C" { #endif typedef enum { PARAM_TYPE_END = -1, PARAM_TYPE_STR = 0, PARAM_TYPE_INT, }param_type; typedef struct confdata{ char* name; param_type type; void* ptr; int is_load; }confdata_t; #define PARAM_LIST_END { "", PARAM_TYPE_END, NULL, 0 }, int load_config( const char *, confdata_t * ); #ifdef __cplusplus } #endif #endif//INCLUDE_CONFIG_HEADER /* --- config.h --------------------------------------------------------------*/ /* --- config.c --------------------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <ctype.h> #include "config.h" #define MAXLINENUM 1024 static int strton( const char *, int * ); static char* cat_needless_str( const char *, char*, unsigned long ); int load_config( const char *filename, confdata_t *secssion_list ) { FILE *fp; int read_cnt, success_cnt = 0; char line[MAXLINENUM],wline[MAXLINENUM],w1[MAXLINENUM],w2[MAXLINENUM]; if ( !filename || !secssion_list ){ return -1; } fp = fopen( filename ,"r"); if( !fp ){ return -2; } read_cnt = 0; while(fgets(line,1020,fp)){ if ( !cat_needless_str( line, wline, sizeof( wline ) - 1 ) ){ continue; } read_cnt = sscanf(wline,"%1023[^=]=%1023[^\r\n]",w1,w2); if( 2 != read_cnt ) { continue; } if ( PARAM_TYPE_END == (secssion_list)->type ) { break; } (secssion_list)->is_load = 0; if ( !_stricmp( w1, (secssion_list)->name ) ){ if ( !(secssion_list)->ptr ){ (secssion_list)->is_load = 0; break; } if( PARAM_TYPE_STR == (secssion_list)->type ){ success_cnt++; strcpy( (char*)(secssion_list)->ptr, w2 ); (secssion_list)->is_load = 1; } else if( PARAM_TYPE_INT == (secssion_list)->type ) { if ( !strton( w2, (int*)(secssion_list)->ptr ) ){ success_cnt++; (secssion_list)->is_load = 1; } } secssion_list++; } } fclose( fp ); return success_cnt; } static int strton( const char *numstr, int *pnum ) { long num = 0; char *errstr; if ( strlen(numstr) > 10){ return(1); } num = strtoul(numstr, &errstr, 0); if (*errstr){ return(2); } if ( num > (long)INT_MAX || num < 0) { return(3); } *pnum = (int)num; return(0); } static char* cat_needless_str( const char * src, char* des, unsigned long dsize ) { int string_flag = 0; char *p = des; while( dsize ){ if ( '\"' == *src ){ if ( !string_flag ){ string_flag = 1; } else { string_flag = 0; } } if ( ' ' == *src || '\f' == *src || '\t'== *src || '\v' == *src ){ if ( !string_flag ){ src++; continue; } } if( '/' == *src && '/' == *(src + 1) ){ *des = '\0'; break; } dsize--; if (!(*des++ = *src++ )) { break; } } while( dsize-- ){ *des++ = '\0'; } return p; } /* --- config.c --------------------------------------------------------------*/ /* --- main.c ----------------------------------------------------------------*/ #include <stdio.h> #include "config.h" int WindowSizeW = 0; int WindowSizeH = 0; int WindowMode = 0; // 0: Full 1:Win char WindowName[256] = "Default"; confdata_t window_config[] = { { "WindowSizeW", PARAM_TYPE_INT, &WindowSizeW, 0 }, { "WindowSizeH", PARAM_TYPE_INT, &WindowSizeH, 0 }, { "WindowMode" , PARAM_TYPE_INT, &WindowMode , 0 }, { "WindowName" , PARAM_TYPE_STR, WindowName , 0 }, PARAM_LIST_END }; int main( void ) { int ret, i; ret = load_config( "WindowData.txt", window_config ); if ( 0 >= ret ){ printf( "error:%d\n", ret ); return ret; } printf( "W=%d H=%d Mode=%d Name=%s\n",WindowSizeW, WindowSizeH, WindowMode, WindowName ); for ( i=0; i<4; i++ ){ printf( "%s Load is %s\n", window_config[i].name, ( window_config[i].is_load ? "Success" : "Faild" )); } return 0; } /* --- main.c ----------------------------------------------------------------*/ ちょっと脱線しますが、 近年のコンピュータではVGA(640x480x16)が BIOSレベルで殆どがサポートしています。 最低でもVGAにするのが最適な方法だと思いますが、 320×240にこだわる理由は何でしょうか?
Re: フルスクリーン時の画面サイズ ( No.3 )
名前: 日時:2008/10/29 12:48

読み込むファイルを書き忘れました。 WindowData.txt //パラメータ名 = パラメータ値 WindowSizeW = 640 //Windowサイズ 幅 WindowSizeH = 480 //Windowサイズ 高さ WindowMode = 1 //Windowモード WindowName = "ウィンドウ名 テスト"
Re: フルスクリーン時の画面サイズ ( No.4 )
名前:dolphin 日時:2008/10/29 19:01

回答ありがとうございます、 友人宅で起こった現象というのは 640×480サイズで起動しても320×240サイズで起動しても 画面左上に2分の1の大きさでゲーム画面が表示されて あとは何も描画されていないと現象でした ・・・友人のPCが特殊なんでしょうかね。 >>通さん 確かに設計が甘かったようですね、 オーバーフローに頭が回らなかった・・・ 4:3の固定画面なので320×240と640×480のどちらか でいいと思うのですがそれ以上のサイズの場合に 利点はあるんでしょうか(勉強不足なもので・・) あと320×240モード基準なのはうちのPCの性能が へぼいからです。
Re: フルスクリーン時の画面サイズ ( No.5 )
名前: 日時:2008/10/29 19:21

その友人のPCでDXライブラリが出したログを 送ってもらうと何か分かるかもしれませんよ。 >320×240モード基準なのは >うちのPCの性能がへぼいからです どのくらいの性能なのでしょう。。。 よっぽど出ない限りデバイスとかの 相性では640x480の16Bitの方が 性能が出るような。。。 メモリ的には320x240のほうが早いのかな。。。
Re: フルスクリーン時の画面サイズ ( No.6 )
名前:dolphin 日時:2008/10/29 19:29

>>性能 Intel Pentium V プロセッサ 558 MHz、256 MB RAM となっています。 シューティングを作ってたときは 320×240とかでも処理落ちするときがあったのですが 640×480のほうが速いことがあるんですか・・・
Re: フルスクリーン時の画面サイズ ( No.7 )
名前: 日時:2008/10/30 12:54

> 640×480のほうが速いことがあるんですか 環境によるとは思いますが、 グラフィックボードが 320x240に 対応していないと縮小したりして 頑張る物もあるのでそういった場合は 640x480の方が早くなることもあります。
Re: フルスクリーン時の画面サイズ ( No.8 )
名前:ZAP 日時:2008/10/30 21:26

>dolphinさん そのスペックでビデオカードもオンボードとかだったりすると、320×240のほうがふつうに速い、という環境もあり得ますね。 今なら5万円程度のローエンド自作PCでもそれより遙かに性能はいいので、買い換えを検討するのもいいかも? 問題の本質からはそれてしまいますが(^^;
Re: フルスクリーン時の画面サイズ ( No.9 )
名前:Will 日時:2008/10/31 10:25

処理落ちが問題となる場合、何がネックとなっているのかを十分に調査・検討するべきだと思いますけどね。 早計に、PCの性能、画像の大きさ等々と割り切ってしまうのはどうかと思います。 グラフィックスチップと、使用OSがわかりませんけどそれほどひどいスペックとは思えませんが。
Re: フルスクリーン時の画面サイズ ( No.10 )
名前:YSNR 日時:2008/11/01 17:42

ウィンドウモードは640x480で立ち上がりましたが、 フルスクリーン指定すると320x240で起動してしまうようです コードをみるとSetWindowSizeExtendRate(2)で拡大処理をしているようですが この関数はフルスクリーンモードでは無効だと思います 過去に似たような質問がありましたので、こちらを参考にしてはどうでしょうか Http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=583
Re: フルスクリーン時の画面サイズ ( No.11 )
名前:管理人 日時:2008/11/03 22:55

YSNRさんも仰られていますが、SetWindowSizeExtendRate はウインドウモードでのみ有効な関数ですので、 640x480の画面に320x240の画面を表示したい場合は、この度のバージョンアップで追加した 専用の関数をご使用下さい。m(_ _)m SetEmuration320x240 という関数です http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html#R15N37
Re: フルスクリーン時の画面サイズ ( No.12 )
名前:dolphin 日時:2008/11/04 19:07

ご意見いただきました皆様に感謝です、 バイトもしてないし大学受験前の人間なんで 今はパソコンを買うこととかは出来ませんが いつかのときの参考にさせていただきたいと思います。 SetWindowSizeExtendRateの性質をよく理解していなかったようです、 ご指摘ありがございました、早速修正してみたいと思います。

Page: 1 |