はじめまして、いつもお世話になっております。
左右どちらでもいいのでキーを押します。
キーを押している間は通常移動をさせて
キーを放した後、滑る時間を利用してキャラクターを滑らせたいと思っています。
//*_ キャラクターの初期位置及び滑る時間
int x = 320;
int y = 240;
int vx = 0;
float speed = 0.1f;
int slip_time = 30;
int SlipTime = 0;
char KeyBuf[ 256 ] ;
//*_ 滑る時間が0以上あるなら,時間を減らす
if(SlipTime > 0)
{
SlipTime--;
//*_ 時間が0を下回ったら,時間を0にする
if(SlipTime <= 0) SlipTime = 0;
}
//*_ 滑っていなければ
else
{
// キー入力のあと,SlipTime にsliptimeを入れる
if(KeyBuf[KEY_INPUT_LEFT] == 1) SlipTime = slip_time;
// ここからvxにspeedをどのように入れるかが分かりません
}
// vxをキャラクターのxに加算する
x +=vx;
// はみ出し処理
if(x < 0) x =0;
if(x > 640-32) x = 640-32;
//*_ キャラクター
DrawBox(x,y,x+32,y+32,GetColor(0,0,255),TRUE) ;
滑る時間までは書けますがその後のキー入力の部分がうまく書けません。
説明下手で申し訳ありませんが
ご教授頂けないでしょうか?よろしくお願いいたします。
キャラクターに時間内を滑るように移動をさせたい
Re:キャラクターに時間内を滑るように移動をさせたい
質問の意味が今ひとつ分かりません。
それら一連の処理がどのように呼ばれるのか分からないので何とも言えないのですが。
ざらっと見た感じ、1秒間にン十回と呼ばれるっぽいですね。
とりあえず通常移動時の処理を書きたいということでしょうか。
正直なところ、なんでもいいんじゃないですか?
vx = speed * 10; でもいいし。 vx = speed * 20; でもいいし。
ただ、変数vxはint型ですから、結局少数以下は丸められますので、vx++; でもいいかと。
滑っている間の移動が行われていないのは仕様ですか?
それとこれらの処理がフレーム毎等1秒間にン十回と呼ばれるのであれば、
if(KeyBuf[KEY_INPUT_LEFT] == 1) の条件を満たした瞬間問答無用で滑ると思うのですが、これも仕様ですか?
とりあえず一連の状態遷移を紙に書いてみるといいですよ。 後は細かいパラメータの調整ですみますから。
それら一連の処理がどのように呼ばれるのか分からないので何とも言えないのですが。
ざらっと見た感じ、1秒間にン十回と呼ばれるっぽいですね。
とりあえず通常移動時の処理を書きたいということでしょうか。
正直なところ、なんでもいいんじゃないですか?
vx = speed * 10; でもいいし。 vx = speed * 20; でもいいし。
ただ、変数vxはint型ですから、結局少数以下は丸められますので、vx++; でもいいかと。
滑っている間の移動が行われていないのは仕様ですか?
それとこれらの処理がフレーム毎等1秒間にン十回と呼ばれるのであれば、
if(KeyBuf[KEY_INPUT_LEFT] == 1) の条件を満たした瞬間問答無用で滑ると思うのですが、これも仕様ですか?
とりあえず一連の状態遷移を紙に書いてみるといいですよ。 後は細かいパラメータの調整ですみますから。
Re:キャラクターに時間内を滑るように移動をさせたい
はいどうぞ。一瞬で作ったから、まともな形にして使ってください。
#include "DxLib.h"
//
/*********************** メイン ****************************/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if(ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen(DX_SCREEN_BACK))return -1;
int x = 320;
int y = 240;
int vx =4 ;
float speed = 0.1f;
int slip_time = 20;
int SlipTime = 0;
char KeyBuf[ 256 ] ;
int flag=3;
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
GetHitKeyStateAll( KeyBuf ) ;
// キー入力のあと,SlipTime にsliptimeを入れる
if(KeyBuf[KEY_INPUT_LEFT] == 1){
SlipTime = slip_time;
// vxをキャラクターのxに加算する
x-=vx;
flag=0;
}else if(KeyBuf[KEY_INPUT_RIGHT] == 1){
SlipTime = slip_time;
// vxをキャラクターのxに加算する
flag=1;
x+=vx;
}
if(flag){
x+=SlipTime;
if(SlipTime > 0)
SlipTime--;
}else{
x-=SlipTime;
if(SlipTime>0)
SlipTime--;
}
// はみ出し処理
if(x < 0) x =0;
if(x > 640-32) x = 640-32;
//*_ キャラクター
DrawBox(x,y,x+32,y+32,GetColor(0,0,255),TRUE) ;
Sleep(16);
}
DxLib_End();return 0;
}
#include "DxLib.h"
//
/*********************** メイン ****************************/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if(ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen(DX_SCREEN_BACK))return -1;
int x = 320;
int y = 240;
int vx =4 ;
float speed = 0.1f;
int slip_time = 20;
int SlipTime = 0;
char KeyBuf[ 256 ] ;
int flag=3;
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
GetHitKeyStateAll( KeyBuf ) ;
// キー入力のあと,SlipTime にsliptimeを入れる
if(KeyBuf[KEY_INPUT_LEFT] == 1){
SlipTime = slip_time;
// vxをキャラクターのxに加算する
x-=vx;
flag=0;
}else if(KeyBuf[KEY_INPUT_RIGHT] == 1){
SlipTime = slip_time;
// vxをキャラクターのxに加算する
flag=1;
x+=vx;
}
if(flag){
x+=SlipTime;
if(SlipTime > 0)
SlipTime--;
}else{
x-=SlipTime;
if(SlipTime>0)
SlipTime--;
}
// はみ出し処理
if(x < 0) x =0;
if(x > 640-32) x = 640-32;
//*_ キャラクター
DrawBox(x,y,x+32,y+32,GetColor(0,0,255),TRUE) ;
Sleep(16);
}
DxLib_End();return 0;
}
