プレイヤーを左に移動させる

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

プレイヤーを左に移動させる

#1

投稿記事 by nekoinu » 15年前

プレイヤーを左に移動させるようにプログラミングの館を見ながら作ったのですが、出来ません。

左キーを押すと、ちょこっと左にカクンってなるのですが、すぐ元の位置に戻ってしまいます。

#include "DxLib.h"

struct chara {
int chara_x;
int chara_y;
int chara_image;
}test;
int image[12];

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 ){
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){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない

//プログラミング開始
test.chara_x =300;
test.chara_y =140;

LoadDivGraph("test.png", 12 , 3 , 4 , 32 , 32 , image ) ;

if(Key[ KEY_INPUT_LEFT ] == 1 )
test.chara_x++ ;
test.chara_image = image[5] ;

DrawGraph( test.chara_x , test.chara_y , test.chara_image , TRUE );


//プログラミング終了




ScreenFlip();
}

DxLib_End();
return 0;
}

一応エラーはでないで出来ました。
どうすれば左に移動してくれるのでしょうか?
画像

S.K

Re:プレイヤーを左に移動させる

#2

投稿記事 by S.K » 15年前

ループの中に
>test.chara_x =300;
>test.chara_y =140;
を書いてしまっているので、毎回元の座標に戻るようになっています。
座標の初期化をループの外に書くと良いと思います。

>LoadDivGraph("test.png", 12 , 3 , 4 , 32 , 32 , image ) ;
もループの外で一度呼び出せばOKです。

LUNA

Re:プレイヤーを左に移動させる

#3

投稿記事 by LUNA » 15年前

実際に画像を持ってないんでちょっぴ不安なんですが画像なしでデバッグが通ったんで上げます。
おそらくこれでいいとは思うんですが・・・何分、しばらくプログラムいじって無かったんで。
あと、字下げはしっかりしましょう。見る側も作る側も字下げがしっかりしているとそれだけで幾分か読みやすいですから。会社や学校で字下げしてないものを見せた暁には上司や先輩にはっ倒されますからね・・・
#include "DxLib.h" 

typedef struct chara { 
        int chara_x; 
        int chara_y; 
        int chara_image; 
}TEST; 
int image[12]; 
int Key[256];
TEST test;


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 ){ 
    ChangeWindowMode(TRUE);//ウィンドウモード 
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 
  
    LoadDivGraph("test.png", 12 , 3 , 4 , 32 , 32 , image ) ;
    test.chara_x    =300; 
    test.chara_y    =140;   

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){ 
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない 
  
        //プログラミング開始 


  

        if(Key[ KEY_INPUT_LEFT ] == 1 ){ 
            test.chara_x++ ; 
            test.chara_image = image[5] ; 
        }
        DrawGraph( test.chara_x , test.chara_y , test.chara_image , TRUE ); 


         //プログラミング終了 
   
  
  
  
        ScreenFlip(); 
    } 
  
    DxLib_End(); 
    return 0; 
}

nekoinu

Re:プレイヤーを左に移動させる

#4

投稿記事 by nekoinu » 15年前

whileループの外に、入れましたが出来ません・・・。
どこが間違ってるのでしょうか?


#include "DxLib.h"

struct chara {
int chara_x;
int chara_y;
int chara_image;
}test;

int image[12];
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 ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

//--------------ここに入れました---------------

LoadDivGraph("test.png", 12 , 3 , 4 , 32 , 32 , image ) ;

test.chara_x =300;
test.chara_y =140;

//---------------------------------------------

while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない


//プログラミング開始


if(Key[ KEY_INPUT_LEFT ] == 1 )
test.chara_x-- ;

test.chara_image = image[5] ;

DrawGraph( test.chara_x , test.chara_y , test.chara_image , TRUE );


//プログラミング終了


ScreenFlip();
}

DxLib_End();
return 0;
}


見難かったらすみません。

ideyan

Re:プレイヤーを左に移動させる

#5

投稿記事 by ideyan » 15年前

出来ませんとありますが、
全く動かないのか、押した瞬間しか動かないのかどちらでしょうか?

後者ならば
if(Key[ KEY_INPUT_LEFT ] == 1 ) 
    test.chara_x-- ; 

これを、下のように変えてみてください。

if(Key[ KEY_INPUT_LEFT ] > 0 ) 
    test.chara_x-- ;
あと、ループ内にあっても特に問題は無いですが
test.chara_image = image[5] ;
これもループの外に出すことができますよ。

nekoinu

Re:プレイヤーを左に移動させる

#6

投稿記事 by nekoinu » 15年前

できました!

>>出来ませんとありますが、
全く動かないのか、押した瞬間しか動かないのかどちらでしょうか?

説明不足でごめんなさい。 押した瞬間しか動かない のが正しいです。

>>if(Key[ KEY_INPUT_LEFT ] > 0 )
test.chara_x-- ;


確かに、この方法で出来ましたが 何故

if(Key[ KEY_INPUT_LEFT ] == 0 )
test.chara_x-- ;

では押した瞬間しか動かなくなるのでしょうか?


> 0と ==0 ではほとんど同じ意味になのに・・。

ちなみに 何故か > 1 でも実行できました。

質問自体は解決したのですが、まだモヤモヤが残ってます・・・。
何度も質問してしまいすみません。
画像

fatens

Re:プレイヤーを左に移動させる

#7

投稿記事 by fatens » 15年前

>0と==0ではなく、>0と==1ですね。
GetHitKeyStateAll_2 関数は渡された配列にキーがどれだけ押されているかを格納します。
よって、押されていないときは0、押された瞬間は1、そして押されているときは1以上の値が入っています。
このことから、==1にはキーが押されている限り一度しかならないことが分かります。
整数においては、0より大きいことと1以上とは同じなので、>0で比較したようです。


>何度も質問してしまいすみません。
質問することは大いに結構だと思います。
曖昧なままにしておくことの方がよっぽど問題です。

nekoinu

Re:プレイヤーを左に移動させる

#8

投稿記事 by nekoinu » 15年前

皆さんご回答ありがとうございます。

>>押されていないときは0、押された瞬間は1、そして押されているときは1以上の値が入っています。
そうだったんですか!初めて知りました。


質問の解決と、モヤモヤが晴れました!ありがとうございます。

また、ゲームプログラミングの館を参考にしながら自分なりに作ってみたいと思います。

閉鎖

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