ページ 11

DXライブラリの低速移動

Posted: 2012年6月12日(火) 15:00
by NONON
BCC DeveloperでDXライブラリを使ってゲームプログラミングを始めてみて
キャラクターの移動ができたので次にSHIFTでの低速移動を実装しようとしてみたところ
うまくいかずに困っています。

どのように直したらいいのか、ヒントでもいいのでよろしければ教えてください。

使っているコンパイラーはbcc32です

コード:

//ライブラリ宣言
#include "DxLib.h"
//定数の宣言
#define PLAYER_SIZE 50
#define PLAYER_SIZE_HALF PLAYER_SIZE/2
#define PLAYER_MOVE_HIGH_SPEED 5
#define PLAYER_MOVE_LOW_SPEED 2.5
#define P_FirstY 240
#define P_FirstX 320
#define A_Firstx 0
#define A_Firsty 0

//WinMain関数
int main( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
     // DXライブラリの設定
     // SetOutApplicationLogValidFlag(TRUE);
     SetGraphMode(640,480,16);
     ChangeWindowMode( true ) ;
     if( DxLib_Init()==-1) return-1;
     // SetMouseDispFlag( TRUE ) ;
     SetDrawScreen(DX_SCREEN_BACK);
     //変数の宣言と初期化
     int player_position_x=P_FirstX;
     int player_position_y=P_FirstY;
     int Area_x=A_Firstx;
     int Area_y=A_Firsty;
     int area_graph=LoadGraph("windows help.png");
     int player_graph=LoadGraph("Player.png");
     int joypad_state=0;
                                                     
     //メインループ
     while(ProcessMessage()==0)
     {
         //ジョイスティック&キー入力
         joypad_state=GetJoypadInputState(DX_INPUT_KEY_PAD1);
         
         if(KEY_INPUT_LSHIFT!=0){
            
            if((joypad_state&PAD_INPUT_UP)!=0)player_position_y-=PLAYER_MOVE_LOW_SPEED;
            if((joypad_state&PAD_INPUT_DOWN)!=0)player_position_y+=PLAYER_MOVE_LOW_SPEED;
            if((joypad_state&PAD_INPUT_LEFT)!=0)player_position_x-=PLAYER_MOVE_LOW_SPEED;
            if((joypad_state&PAD_INPUT_RIGHT)!=0)player_position_x+=PLAYER_MOVE_LOW_SPEED;
         }
         else{
            if((joypad_state&PAD_INPUT_UP)!=0)player_position_y-=PLAYER_MOVE_HIGH_SPEED;
            if((joypad_state&PAD_INPUT_DOWN)!=0)player_position_y+=PLAYER_MOVE_HIGH_SPEED;
            if((joypad_state&PAD_INPUT_LEFT)!=0)player_position_x-=PLAYER_MOVE_HIGH_SPEED;
            if((joypad_state&PAD_INPUT_RIGHT)!=0)player_position_x+=PLAYER_MOVE_HIGH_SPEED;
            }
            
         //キャラの範囲指定と背景移動
         if(player_position_x>640){
            player_position_x=640;
            Area_x-=5;
            }
         if(player_position_x<0){
            player_position_x=0;
            Area_x+=5;
            }
         if(player_position_y>480){
            player_position_y=480;
            Area_y-=5;
            }
         if(player_position_y<0){
            player_position_y=0;
            Area_y+=5;
            }
                                        
         //キャラの描画
         ClearDrawScreen() ;
         DrawGraph(Area_x,Area_y,area_graph, true);
         DrawGraph(player_position_x-PLAYER_SIZE_HALF,
             player_position_y-PLAYER_SIZE_HALF, player_graph,true);
         ScreenFlip();
         
         // ESCキーが押されたらループから抜ける
         if(CheckHitKey(KEY_INPUT_ESCAPE)==TRUE)break;
     }
     //終了処理
     DxLib_End();
     return 0;
} 

Re: DXライブラリの低速移動

Posted: 2012年6月12日(火) 15:15
by non
39行目のif(KEY_INPUT_LSHIFT!=0){
が間違っているのじゃないかな。

DXLIBはまともに使ったことがないので、いいかげんですが。

Re: DXライブラリの低速移動

Posted: 2012年6月12日(火) 17:49
by nil
うまくいかず、ということが具体的にどのようなことなのか説明されておられないので私の想像ですが、おそらく
左右で移動速度が違う、ということだと思います。
それはキャラの座標位がint 型で有るためではないでしょうか?
int 型では小数点以下を扱えず、切り捨てられてしまいます

double型にするといいでしょう

Re: DXライブラリの低速移動

Posted: 2012年6月12日(火) 20:48
by NONON
うまくいかないというのは、このプログラムを実行すると
押してなくても高速状態(速度5)でなく低速状態(速度2)になってしまうということです。
分かりづらくてすいませんでした

Re: DXライブラリの低速移動

Posted: 2012年6月12日(火) 22:22
by softya(ソフト屋)
NONON さんが書きました:うまくいかないというのは、このプログラムを実行すると
押してなくても高速状態(速度5)でなく低速状態(速度2)になってしまうということです。
分かりづらくてすいませんでした
であれば、押されたことに成るのはnonさんの言われるとおりです。
キーの値は取得しなくてはいけません。

速度が2になるのは涼雅さんの言われる通り整数であるからです。

Re: DXライブラリの低速移動

Posted: 2012年6月13日(水) 13:49
by NONON
無事実装させることができました
ありがとうございました

Re: DXライブラリの低速移動

Posted: 2012年6月13日(水) 15:06
by softya(ソフト屋)
NONON さんが書きました:無事実装させることができました
ありがとうございました
フォーラムルールに書いてありますが解決した場合のコードの投稿をお願いします。