ページ 1 / 1
画像の裏画面処理について
Posted: 2010年11月20日(土) 02:30
by たいが
visual C++でDXライブラリです
龍神録を参考にながらプログラムを組んでいます
今、
#include "../include/GV.h"
void mode_pitch(){
DrawGraph( 0 , 0 , mound_h , TRUE);
if(CheckStateKey(KEY_INPUT_RETURN)==1&&pitch==0){
for(ball_y=90;ball_y<=480;ball_y++){
DrawGraph( ball_x , ball_y , ball_h , TRUE);
ball_y=ball_y+10;
pitch=1;
}
ball_y=90;
pitch=0;
}
}
のようにプログラムを組んだところ、裏画面処理がされていない画像のように変な動きになってしまいました。
そこで、
#include "../include/GV.h"
void mode_pitch(){
DrawGraph( 0 , 0 , mound_h , TRUE);
if(CheckStateKey(KEY_INPUT_RETURN)==1&&pitch==0){
for(ball_y=90;ball_y<=480;ball_y++){
ClearDrawScreen();
DrawGraph( 0 , 0 , mound_h , TRUE);
DrawGraph( ball_x , ball_y , ball_h , TRUE);
ball_y++;
pitch=1;
ScreenFlip() ;
}
ball_y=90;
pitch=0;
}
}
のようにしたらうまくいくようになったのですがなぜだかわかりません。
メインのほうには龍神録を参考に毎回書くプログラムの骨格を書いているのでうまくいくはずだと思ったのですが・・・
ちなみに方向キーを押している間だけ動くプログラムならうまくいくのでforループが原因かな?とは思っている
のですが
ご教授お願いします!
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 03:17
by ゆーずぃ
>裏画面処理がされていない画像のように変な動き
というのがどんな変な動きなのか分からないんですけど(ww)、最初のプログラムだと、ひょっとしてちょっと重くなったり画面が暗くなったりした後に瞬間移動しませんか?
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 14:22
by たいが
まさにそんな感じです
なんか画像が一瞬で動いて線みたいになったり、クソ重くなったりします
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 16:12
by ゆーずぃ
最初のプログラムだと、forループを抜けるまで描画が行われません。つまり、screenfripに渡される時には既にball_yは480まで進んでしまっています。線みたいになるのは、forループ中に ClearDrawScreenをせずに毎回描いているからです。
つまり、流れとしては
ClearDrawScreen();
ball_y が 90 → 描画(裏画面);
ball_y が 91 → 描画(裏画面);
ball_y が 92 → 描画(裏画面);
ball_y が 93 → 描画(裏画面);
....480まで繰り返される。その間一切ClearDrawScreenは無し。
↓
ScreenFrip();描画(ようやく表画面!)
となっています。
また、めちゃめちゃ重くなるというのは、390回も描画を行えば重くなる上に、forループ中は入力を受け付けることが出来ないのでそう感じるんだと思います。
ところで修正後のプログラムではball_yが移動中は他のモノが一切移動できなくなっています。
ですので、forではなくifで分岐させた方がいいかと。
void mode_pitch(){
static int OldReturnState;
DrawGraph( 0 , 0 , mound_h , TRUE);
/* 判定 */
//ball_yが移動中ではない時にReturnが押されたら
if(OldReturnState == 0 && CheckStateKey(KEY_INPUT_RETURN)==1){
OldReturnState = 1; //フラグをタテルノデス
ball_y = 90; //初期化をスルノデス
}else if(ball_y >= 480) //ball_yが移動中で480を超えたら移動中フラグを戻す
OldReturnState = 0;
/* 描画 */
if(OldReturnState==1){
DrawGraph( ball_x , ball_y , ball_h , TRUE);
ball_y++;
}
}
これなら他の物を描きながら移動させられると思います。
pitchが何のために使われているのか分からなかったので消してしまいましたが…w
あと元のプログラムですが、気になる点がいくつかあったので後学の為に一応突っ込んでおきます。
void mode_pitch(){
DrawGraph( 0 , 0 , mound_h , TRUE);
if(CheckStateKey(KEY_INPUT_RETURN)==1&&pitch==0){
for(ball_y=90;ball_y<=480;ball_y++){
ClearDrawScreen();
DrawGraph( 0 , 0 , mound_h , TRUE);
DrawGraph( ball_x , ball_y , ball_h , TRUE);
ball_y++;
pitch=1;
ScreenFlip() ;
}
ball_y=90; //forの初期化でball_y=90を行っているので、必要ありません。
pitch=0; //forループを抜けた後にどの道次のifまでpitchは使われないのでpitch自体不要です。連続RETURNでの描写を避けたかったのでしょうが、結局pitchを使っても間髪空けずにRETURNを押されれば次の描写が行われてしまいます。
}
}
forの初期化をもっと信用しましょうw
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 17:02
by たいが
おお、凄い理解できました!
そしてまさに今、他のモノが一切移動できなくて困ってたところなんですよww
ちょっとやってみます
フラグをタテルノデスクソワロタwww
その前に
//forループを抜けた後にどの道次のifまでpitchは使われないのでpitch自体不要です。連続RETURNでの描写を避けたかったのでしょうが、結局pitchを使っても間髪空けずにRETURNを押されれば次の描写が行われてしまいます。
のところがよくわからないのですがどういうことでしょうか?
ちなみに自分の意志としては、pitchはforループ中(ボールの移動描写中)にもう一度ボールの移動描写をしないようにと書いたつもりでした。
今やってみましたが、一応ボールが動いている間にもう一度ボールを投げる、のようにはなっていない気がします。
あ、ちなみに簡単な野球ゲームのつもりで作ってます。
でもゆーずぃさんのプログラムのほうがスマートなのはすぐにわかるのでそちらを参考に作りなおさせていただきますww
ただ、後学のために聞いておきたいです
自分で1から作るのは初めてなのでよろしくお願いします
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 17:28
by ゆーずぃ
このネタが通じて良かったですwww
>ちなみに自分の意志としては、pitchはforループ中(ボールの移動描写中)にもう一度ボールの移動描写をしないようにと書いたつもりでした。
なるほどなるほど。例えばですね、こんなのがあったとしましょう。
第1問。1万円の問題です。
if(1){ //条件が真なので必ず通る
puts("ifは真でした");
for(i=0; i < 3 ;i++){
puts("forループ中です");
}
}
この場合の出力はどうなると思いますか?
では第2問。10万円の問題に挑戦です。
static int pitch; //staticの場合は最初だけ必ず0で初期化される。
if(pitch == 0){ //staticなので一回目は必ず0
puts("ifは真でした");
for(i=0; i < 3 ;i++){
puts("forループ中です");
pitch = 1; //pitchのフラグを立ててみる
}
pitch = 0; //pitchのフラグを戻してみる
}
この場合の出力はどうなるでしょう?
ライフラインを使ってもいいですよ~w
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 17:42
by たいが
うう・・・理解が浅いからこういうの苦手です。。
テレフォンで本を見ながら考えてますw
第1問 解答
ifは真でした
forループ中です
forループ中です
forループ中です
第2問 解答
ifは真でした
forループ中です
forループ中です
forループ中です
同じ・・・ですかねぇ・・・
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 17:48
by たいが
あれ・・・今思うとpitchがあってもなくてもforループ中にはなにもできない気がします
ループ終わるまで if(CheckStateKey(KEY_INPUT_RETURN)==1&&pitch==0) のところまでいけないわけですし
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 21:00
by ゆーずぃ
その通り!全問正解です(^-^)b
たいがさんの思った通りpitchのフラグが立っているのはforループの最中だけです。pitchのようなフラグが主に役に立つのは私が最初の例で挙げたようなif分岐の時です。
ということで他に質問がなければ合格ですw
Re:画像の裏画面処理について
Posted: 2010年11月20日(土) 21:51
by たいが
ありがとうございますww
俺の意図を的確に汲み取ってくれるのでホント助かります!!
また何かあったらお願いします!