for文

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

for文

#1

投稿記事 by うい » 16年前

どうもfor文をいれてアドベンチャーゲームぽいものを作ろうとしているのですが、
うまくうごいてくれなく、曲も流れてくれない状況です。
また、ウィンドウをクリックもしくは動かすだけで応答なしになってしまうようになってしまいました。
↓がfor文の内容です。

for(i=0;i<10;){

if(CheckSoundFile==0)
PlaySoundFile ( "music/kyoku.wav" , DX_PLAYTYPE_BACK ) ;

ClearDrawScreen(); // 裏画面のデータを全て削除

LoadGraphScreen( 0, 0, "graph/haikei1.png" , FALSE ) ;
LoadGraphScreen( 50, 270, "graph/hito1.png" , TRUE ) ;
LoadGraphScreen( 550, 270, "graph/hito2.png" , TRUE ) ;

if(i==0)
DrawString( 70, 350, "あ", black);
else if(i==1)
DrawString( 70, 350, "い", black);
else if(i==2)
DrawString( 70, 350, "う", black);
else if(i==3)
DrawString( 70, 350, "え", black);
else if(i==4)
DrawString( 70, 350, "お", black);
else if(i==5)
DrawString( 70, 350, "か", black);
else if(i=6)
DrawString( 70, 350, "き", black);
else if(i==7)
DrawString( 70, 350, "く", black);
else if(i==8)
DrawString( 70, 350, "け", black);
else if(i==9)
DrawString( 70, 350, "こ", black);

ScreenFlip() ; // 裏画面データを表画面へ反映


if(Key[KEY_INPUT_RETURN]==1)
i++;

}

kazuoni

Re:for文

#2

投稿記事 by kazuoni » 16年前

すみません。よく意味がわからないのですが。。

よくないとこだけ記述しておきます。
LoadGraphScreen()は重い(?)処理なので、
なるべく少なくしたほうが良いです。
for文の外に出しましょう。
今のままだと、returnが押されるまでものすごい回数呼び出していることになるので、
処理落ちしているのかと。。

PlaySoundFile()の条件がよくわからないのですが、
for文中もバックサウンドで流すなら、for文の外に出しましょう。
今のままだと文が返ってくるたびに最初から再生していることになります。

うい

Re:for文

#3

投稿記事 by うい » 16年前

外に出してみたのですが、やはり駄目で、相変わらずエンター押しても動かず、ウィンドウを動かすだけで応答なしになってしまいました。

曲はもし流れていないなら流すという感じにしているのでそのようなことにはなっていないとは思うのですがその辺はどうでしょうか?
ただ、今PlaySoundFileをforの外にやった結果一応流れました。

kazuoni

Re:for文

#4

投稿記事 by kazuoni » 16年前

>外に出してみたのですが、やはり駄目で、相変わらずエンター押しても動かず、
>ウィンドウを動かすだけで応答なしになってしまいました

上のコードだけでは、ちょっと分かりませんが、
for文から出しただけでも、
mainのwhileで毎回呼び出してしまっていても同じことが起こります。
呼び出すのは一度だけにしてください。

>曲はもし流れていないなら流すという感じにしているので
>そのようなことにはなっていないとは思うのですがその辺はどうでしょうか?
それならばループで一度だけ呼び出したほうがいいと思います。

ななし

Re:for文

#5

投稿記事 by ななし » 16年前

Key[KEY_INPUT_RETURN] が 1 になるのはいつですか?

そこが 1 になっている場合だけ i++ をしているようですが、1 にならない限りループは永遠に止まりません。

Dixq (管理人)

Re:for文

#6

投稿記事 by Dixq (管理人) » 16年前

CheckSoundFileは関数ですから、関数としての記述をして下さい。

後、このままでは何度もループ再生する事になると思いますが、ループ再生するときは、ループのオプションを指定しましょう。
また、サウンドも、画像も一旦メモリに展開してから使うようにして下さい。
詳しくはゲームプログラミングの館やサンプルプログラミングの館をご覧下さい。

また、Keyにキーの入力状態が格納されていませんからi++が行われません。
そしてProcessMessageを定期的に呼ばないと応答不能になります。

DXライブラリを使ったプログラムコードの骨格は
http://dixq.net/g/#41
この辺を参考にして下さい。

Dixq (管理人)

Re:for文

#7

投稿記事 by Dixq (管理人) » 16年前

似たようなことを行うためのサンプルを先ほどのリンク先のコードを元に作ってみました。
#include "DxLib.h"

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
        else                            GetHitKeyStateAll_InputKey=0;
    }
    return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

    int  i=0;
    char DataStr[21]="あいうえおかきくけこ", DrawStr[3]={0,};
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && 
        GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 && i<10){

        strncpy(DrawStr,&DataStr[i*2],2);
        DrawFormatString(0,0,GetColor(255,255,255),"%s",DrawStr);

        if(Key[KEY_INPUT_RETURN]==2)
            i++;
        ScreenFlip();
    }

    DxLib_End();
    return 0;
}
 
エンターを押しながら確認してみて下さい。

閉鎖

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