画像の裏画面処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たいが

画像の裏画面処理について

#1

投稿記事 by たいが » 14年前

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:画像の裏画面処理について

#2

投稿記事 by ゆーずぃ » 14年前

>裏画面処理がされていない画像のように変な動き

というのがどんな変な動きなのか分からないんですけど(ww)、最初のプログラムだと、ひょっとしてちょっと重くなったり画面が暗くなったりした後に瞬間移動しませんか?

たいが

Re:画像の裏画面処理について

#3

投稿記事 by たいが » 14年前

まさにそんな感じです

なんか画像が一瞬で動いて線みたいになったり、クソ重くなったりします

ゆーずぃ

Re:画像の裏画面処理について

#4

投稿記事 by ゆーずぃ » 14年前

最初のプログラムだと、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:画像の裏画面処理について

#5

投稿記事 by たいが » 14年前

おお、凄い理解できました!
そしてまさに今、他のモノが一切移動できなくて困ってたところなんですよww
ちょっとやってみます

フラグをタテルノデスクソワロタwww



その前に
//forループを抜けた後にどの道次のifまでpitchは使われないのでpitch自体不要です。連続RETURNでの描写を避けたかったのでしょうが、結局pitchを使っても間髪空けずにRETURNを押されれば次の描写が行われてしまいます。
のところがよくわからないのですがどういうことでしょうか?

ちなみに自分の意志としては、pitchはforループ中(ボールの移動描写中)にもう一度ボールの移動描写をしないようにと書いたつもりでした。
今やってみましたが、一応ボールが動いている間にもう一度ボールを投げる、のようにはなっていない気がします。
あ、ちなみに簡単な野球ゲームのつもりで作ってます。

でもゆーずぃさんのプログラムのほうがスマートなのはすぐにわかるのでそちらを参考に作りなおさせていただきますww
ただ、後学のために聞いておきたいです
自分で1から作るのは初めてなのでよろしくお願いします

ゆーずぃ

Re:画像の裏画面処理について

#6

投稿記事 by ゆーずぃ » 14年前

このネタが通じて良かったです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:画像の裏画面処理について

#7

投稿記事 by たいが » 14年前

うう・・・理解が浅いからこういうの苦手です。。
テレフォンで本を見ながら考えてますw

第1問 解答
ifは真でした
forループ中です
forループ中です
forループ中です

第2問 解答
ifは真でした
forループ中です
forループ中です
forループ中です

同じ・・・ですかねぇ・・・

たいが

Re:画像の裏画面処理について

#8

投稿記事 by たいが » 14年前

あれ・・・今思うとpitchがあってもなくてもforループ中にはなにもできない気がします

ループ終わるまで if(CheckStateKey(KEY_INPUT_RETURN)==1&&pitch==0) のところまでいけないわけですし

ゆーずぃ

Re:画像の裏画面処理について

#9

投稿記事 by ゆーずぃ » 14年前

その通り!全問正解です(^-^)b

たいがさんの思った通りpitchのフラグが立っているのはforループの最中だけです。pitchのようなフラグが主に役に立つのは私が最初の例で挙げたようなif分岐の時です。

ということで他に質問がなければ合格ですw

たいが

Re:画像の裏画面処理について

#10

投稿記事 by たいが » 14年前

ありがとうございますww

俺の意図を的確に汲み取ってくれるのでホント助かります!!


また何かあったらお願いします!

閉鎖

“C言語何でも質問掲示板” へ戻る