皆さん、こんばんは。
2枚の立ち絵素材があり、1つは口が閉じたの、もう1つは口が開いたのです。これを交互に表示させることで会話しているように見せるという意図です。for文を用いて作ったのですが、これを関数化したとたん、画像がまるで表示されない事態になりました。コンパイルも正常に通ってしまっている状況です。
#include "DxLib.h"
void drawm ( void ) ;
int mira1, mira2, i ;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
SetWindowIconID( 101 ) ;
LoadIcon(hInstance , TEXT("IDI_ICON1"));
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
mira1 = LoadGraph ( "mira/001.png" ) ;
mira2 = LoadGraph ( "mira/002.png" ) ;
int voice = LoadGraph ( "zai/voiceonly1.png" ) ;
DrawGraph ( 0, 0, voice, FALSE ) ;
drawm ( ) ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
void drawm ( void )
{
int mira1 ;
int mira2 ;
int i ;
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
for ( i = 0 ; i < 20 ; i++ )
{if(ProcessMessage()!=0)
break;
DrawGraph ( 0, 0, mira1, TRUE ) ;
ScreenFlip() ;
WaitTimer ( 100 ) ;
DrawGraph ( 0, 0, mira2, TRUE ) ;
ScreenFlip() ;
WaitTimer ( 100 ) ;
ScreenFlip() ;
DrawGraph ( 0, 0, mira1, TRUE ) ;
WaitTimer ( 100 ) ;
}
return ;
}
関数にまとめると画像が表示されなくなった
Re:関数にまとめると画像が表示されなくなった
void drawm ( void ) {
にあるローカル変数
int mira1 ;
int mira2 ;
が余分です。
グローバル変数
int mira1, mira2, i ;
と同じ名前の別変数としてC言語が処理しますので、非常にまずいです。
参考↓
http://www.geocities.jp/ky_webid/c/022.html
にあるローカル変数
int mira1 ;
int mira2 ;
が余分です。
グローバル変数
int mira1, mira2, i ;
と同じ名前の別変数としてC言語が処理しますので、非常にまずいです。
参考↓
http://www.geocities.jp/ky_webid/c/022.html
Re:関数にまとめると画像が表示されなくなった
ゲームプログラムにおいて、特定の関数で処理を止めたり、画面の操作をしたりすると非常によくないプログラムになってしまいます。
メインループをする関数でのみ画面クリアや反映をするべきで、WaitTimerは使うべきではなく、
待機させたいときはカウンタなどを使って待機すべきでしょう。
プログラムの骨格となる構造をゲームプログラミングの館の13章で説明しているので良ければご覧ください。
メインループをする関数でのみ画面クリアや反映をするべきで、WaitTimerは使うべきではなく、
待機させたいときはカウンタなどを使って待機すべきでしょう。
プログラムの骨格となる構造をゲームプログラミングの館の13章で説明しているので良ければご覧ください。
Re:関数にまとめると画像が表示されなくなった
今回で言えば、こんな感じでしょうか。
#include <DxLib.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ int Count=0; if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理 SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定 while(!ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)){ if( (Count%60)<30 ){ DrawBox(0,0, 640, 480, GetColor(255,255,0),TRUE); } else { DrawBox(0,0, 640, 480, GetColor(0,255,255),TRUE); } Count++; ScreenFlip();//裏画面を表画面に反映 } DxLib_End(); return 0; }
Re:関数にまとめると画像が表示されなくなった
softyaさん、ありがとうございます。
コレ昨日取り組んだ部分そのものなのに、同じ部分で躓いていて恥ずかしいです。
そっかあ~グローバルはどの関数でも使えるんだから、同じ名前のをローカルで宣言しちゃあマズい。
なんでローカルで宣言しちゃってたんだろ~なんで気付かないんだろう~。
「バカだからじゃない?」って「戦場ヶ原ひたぎ」じゃなくても言いたくなる場面ですよね。お恥ずかしい。
(戦場ヶ原ひたぎ、知らなかったらスルーで。すんません、アニオタなもので)
ホント昨日教えてもらった部分そのまんまだのにorz
とはいえ、やっぱり本気で助かりました。
あの、余談ですが、softyaさんはソフト屋さんなのですか?
いや、ちょっと気になったもので。コレ、もちろん必須質問じゃないんですけど。
他の方のハンドル名ってなんか気になるというか、どんな理由でだろうと考えると好きというか。
とにかく、今回もまた、ありがとうございました。
修正後、すぐに意図したとおり動作しました。
コレ昨日取り組んだ部分そのものなのに、同じ部分で躓いていて恥ずかしいです。
そっかあ~グローバルはどの関数でも使えるんだから、同じ名前のをローカルで宣言しちゃあマズい。
なんでローカルで宣言しちゃってたんだろ~なんで気付かないんだろう~。
「バカだからじゃない?」って「戦場ヶ原ひたぎ」じゃなくても言いたくなる場面ですよね。お恥ずかしい。
(戦場ヶ原ひたぎ、知らなかったらスルーで。すんません、アニオタなもので)
ホント昨日教えてもらった部分そのまんまだのにorz
とはいえ、やっぱり本気で助かりました。
あの、余談ですが、softyaさんはソフト屋さんなのですか?
いや、ちょっと気になったもので。コレ、もちろん必須質問じゃないんですけど。
他の方のハンドル名ってなんか気になるというか、どんな理由でだろうと考えると好きというか。
とにかく、今回もまた、ありがとうございました。
修正後、すぐに意図したとおり動作しました。
Re:関数にまとめると画像が表示されなくなった
こっちの方が解りやすかったかもしれません。
例えば背景が常に変化していて、その上に人物を表示したい場合などもあるでしょうが、
表示するたびに処理を止めたりしては同時に2つ以上のコンテンツを変化させることが出来ません。
しかし以下のように書けば並行していろんな物を同時に変化させることが出来ます。
例えば背景が常に変化していて、その上に人物を表示したい場合などもあるでしょうが、
表示するたびに処理を止めたりしては同時に2つ以上のコンテンツを変化させることが出来ません。
しかし以下のように書けば並行していろんな物を同時に変化させることが出来ます。
#include <DxLib.h> #include <math.h> #define PI 3.141592654f int GetRainbow( int Cnt ){ return GetColor( (int)(128 + sin(PI*2/180*((Cnt+85*0)%180))*127), (int)(128 + sin(PI*2/180*((Cnt+85*1)%180))*127), (int)(128 + sin(PI*2/180*((Cnt+85*2)%180))*127) ); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ int Count=0; if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理 SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定 while(!ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)){ DrawBox(0,0, 640, 480, GetRainbow(Count),TRUE); if( (Count%60)<30 ){ DrawBox(220, 140, 320, 340, GetColor(255,255,0),TRUE); } else { DrawBox(320, 140, 420, 340, GetColor(0,255,255),TRUE); } Count++; ScreenFlip();//裏画面を表画面に反映 } DxLib_End(); return 0; }
Re:関数にまとめると画像が表示されなくなった
Dixq (管理人)さんも書いてますが、プログラムの作りはあまりよろしくないです。Dixq (管理人)さんのプログラムを参考にされたほうが良いと思いますよ。今のままでも動くとは思いますがメンテナンスや拡張性が非常に悪いですし、同じ関数が何度も出てくるのはミスを誘発します。
>あの、余談ですが、softyaさんはソフト屋さんなのですか?
>いや、ちょっと気になったもので。コレ、もちろん必須質問じゃないんですけど。
URLのリンク先を覗いてみてくださいね~。
>あの、余談ですが、softyaさんはソフト屋さんなのですか?
>いや、ちょっと気になったもので。コレ、もちろん必須質問じゃないんですけど。
URLのリンク先を覗いてみてくださいね~。
Re:関数にまとめると画像が表示されなくなった
管理人さん、レスありがとうございます。
正直、今の私のレベルでは、どちらのソースもにわかにピンと来る感じではないのが本音です。ただコンパイルしてみると、驚きました。どちらも何ら画像や動画を使わずに、こんなこともできちゃうのかと。また、WaitTimerなどに頼らずカウントする方法を構築した方がよいという意図も、体感的にではありますが、なるほど~と思いました。
ただ、ロジックとしては、まるで分かっていない自分ですorz
一本目のソースでは、(Count%60)<30とありますが、これはどういう意味なのでしょう?
私なりに考えると、まず、/ではなく%ということは、余りが求められていると。その余りが30より下なら、ifの処理で、それより上なら、elseの処理へと導かれると。で、これは割る数が60なので、0から59までの余りが生成されることになるのかなと。
ただ、そうなりますと、当面、余りは30より少ないので、ifの処理だけされるのかなと思いきや、実行してみると交互に色が表示され、じゃあelseの処理もされているのか~となって、アレ、わけわかんないぞ~となってしまうのですが、このあたりは、どう解釈すればよいのでしょう。
なんか、凄い的外れな理解の仕方をしている気も自分なりしますし。
正直、今の私のレベルでは、どちらのソースもにわかにピンと来る感じではないのが本音です。ただコンパイルしてみると、驚きました。どちらも何ら画像や動画を使わずに、こんなこともできちゃうのかと。また、WaitTimerなどに頼らずカウントする方法を構築した方がよいという意図も、体感的にではありますが、なるほど~と思いました。
ただ、ロジックとしては、まるで分かっていない自分ですorz
一本目のソースでは、(Count%60)<30とありますが、これはどういう意味なのでしょう?
私なりに考えると、まず、/ではなく%ということは、余りが求められていると。その余りが30より下なら、ifの処理で、それより上なら、elseの処理へと導かれると。で、これは割る数が60なので、0から59までの余りが生成されることになるのかなと。
ただ、そうなりますと、当面、余りは30より少ないので、ifの処理だけされるのかなと思いきや、実行してみると交互に色が表示され、じゃあelseの処理もされているのか~となって、アレ、わけわかんないぞ~となってしまうのですが、このあたりは、どう解釈すればよいのでしょう。
なんか、凄い的外れな理解の仕方をしている気も自分なりしますし。
Re:関数にまとめると画像が表示されなくなった
ほとんどのモニタは60Hzで動いているので、カウンタは1秒間に60ずつ増加します。
今、0.5秒ずつ四角の表示が変わるようにする仕組みを作る為、
if( count%60 < 30 )
という書き方をしました。
ネスさんもお気づきのように、0-59の値がループして生成されます。
そうすれば0.0~0.5秒はifの中を通り、0.5~1.0秒はelseを通ります。
これを1秒周期で繰り返すことになりますね。
%はゲームプログラムでは非常によく使います。
また「周期」という言葉も何度も意識することになるでしょう。
2パターンの四角を表示するサンプルプログラムがあるなら、3パターン表示できるように改造してみるなど、
試行錯誤した数だけ上達しますので、しっくりこないところがあればしっくりくるまでサンプルをいじくり倒してみてください。
今、0.5秒ずつ四角の表示が変わるようにする仕組みを作る為、
if( count%60 < 30 )
という書き方をしました。
ネスさんもお気づきのように、0-59の値がループして生成されます。
そうすれば0.0~0.5秒はifの中を通り、0.5~1.0秒はelseを通ります。
これを1秒周期で繰り返すことになりますね。
%はゲームプログラムでは非常によく使います。
また「周期」という言葉も何度も意識することになるでしょう。
2パターンの四角を表示するサンプルプログラムがあるなら、3パターン表示できるように改造してみるなど、
試行錯誤した数だけ上達しますので、しっくりこないところがあればしっくりくるまでサンプルをいじくり倒してみてください。