今回、マウスの座標をトレースしてキャラクタを移動するプログラムを作っているのですが、なかなかうまく動きません。
その訳が、キャラクタのみを移動させるプログラムは何の問題もなく作れるのですが、
今回は、キャラクタの後に”尾”(キャラクタの後をついてくるオブジェクト)がありその”尾”も移動速度が変化してもしっかり付いてくる用にプログラムを書き換えたいのですがうまくいきません。
どうかアドバイスがあればお願いします。
#include "DxLib.h"
#include <math.h>
///////////////////////////////////////////////////////////////////////////////
//宣言
///////////////////////////////////////////////////////////////////////////////
#define SPEED 2.00
#define TAMA_MAX 10
#define LONG_W 100
#define LONG_K 10
#define H 30.00
#define W 30.00
#define R 30.00
#define PI 3.1415926535897932384626433832795
////////////////////////////////////////////////////////////////////////////////
//グローバル変数
////////////////////////////////////////////////////////////////////////////////
char Key[256];
int time;
int i;
int bufhead;
double xdelay[784];
double ydelay[784];
double speed=3.0;
double curx;
double cury;
/*
int xdelay[784];
int ydelay[784];
int speed;
int curx;
int cury;
*/
/////////////////////////////////////////////////////////////////////////////////
//構造体
/////////////////////////////////////////////////////////////////////////////////
struct CharData{
double x;
double y;
int life;
};
struct CharData ch_1;
struct CharData jitama[TAMA_MAX];
struct CharData tekidata[LONG_W];
typedef struct{
int x;
int y; //座標
}Mouse_t;
Mouse_t Mouse;
///////////////////////////////////////////////////////////////////////////////////
//プロトタイプ宣言
///////////////////////////////////////////////////////////////////////////////////
void WindowMode();
void TekiInit();
void KEY();
void Move();
void JitamaMove();
int GetHitMouseStateAll_2(Mouse_t *Nezumi){
if(GetMousePoint( &Nezumi->x, &Nezumi->y ) == -1){ //マウスの位置取得
return -1;
}
}
////////////////////////////////////////////////////////////////////////////////////
//メインループ
////////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hI, HINSTANCE hP,LPSTR lpC, int nC ){
TekiInit();
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
SetDrawScreen(DX_SCREEN_BACK);
SetMouseDispFlag( TRUE ) ;//マウス表示オン
int White = GetColor(255,255,255);
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
GetHitMouseStateAll_2(&Mouse); //マウスの入力状態取得
///////////////////////////////////////////////////////////////////////////////////////////////
//プログラム
///////////////////////////////////////////////////////////////////////////////////////////////
KEY();
Move();
DrawCircle( ch_1.x, ch_1.y, R , GetColor(255,255,255) , TRUE) ;
JitamaMove();
DrawFormatString(0,0,White,"座標[%d,%d]",Mouse.x,Mouse.y);
WindowMode();
ScreenFlip();
///////////////////////////////////////////////////////////////////////////////////////////////
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
//プログラム的処理
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ウインドウモード切替
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void WindowMode(){
if (Key[KEY_INPUT_F1]==1)ChangeWindowMode(TRUE);
else if(Key[KEY_INPUT_F2]==1)ChangeWindowMode(FALSE);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//初期化
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TekiInit(){
ch_1.x =0.00;
ch_1.y =0.00;
time =0;
bufhead=0;
for(i=0;i<LONG_W;i++){
xdelay[i]=ch_1.x;
ydelay[i]=ch_1.y;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ゲーム操作
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//キー操作
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void KEY(){
if(Key[KEY_INPUT_UP ]==1)ch_1.y-=SPEED;
if(Key[KEY_INPUT_DOWN ]==1)ch_1.y+=SPEED;
if(Key[KEY_INPUT_LEFT ]==1)ch_1.x-=SPEED;
if(Key[KEY_INPUT_RIGHT]==1)ch_1.x+=SPEED;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//弾move
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void JitamaMove(){
if(Key[KEY_INPUT_Z]&&time==0){
for(int i=0;i<TAMA_MAX;i++){
if(jitama[i].life==0){
jitama[i].life=1;
jitama[i].x =ch_1.x;
jitama[i].y =ch_1.y;
break;
}
}
time=10;
}
if(time>0)time-=1;
for(i=0;i<TAMA_MAX;i++){
if(jitama[i].life>0){
jitama[i].x+=10.00;
DrawCircle( jitama[i].x, jitama[i].y, R , GetColor(255,0,0) , TRUE) ;
if(jitama[i].x>640)jitama[i].life=0;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//行動パターン
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Move(){
for(i=0;i<LONG_K;i++){
tekidata[i].x=xdelay[(bufhead+i*LONG_W/LONG_K+LONG_W)%LONG_W];
tekidata[i].y=ydelay[(bufhead+i*LONG_W/LONG_K+LONG_W)%LONG_W];
SetDrawBlendMode( DX_BLENDMODE_ALPHA , 128 ) ;
DrawCircle( tekidata[i].x, tekidata[i].y, R , GetColor(255,0,0) , TRUE) ;
SetDrawBlendMode( DX_BLENDMODE_ALPHA , 255 ) ;
}
curx=xdelay[bufhead];
cury=ydelay[bufhead];
bufhead=(bufhead-1+LONG_W)%LONG_W;
if(ch_1.x<=curx)xdelay[bufhead]=curx-SPEED;
else xdelay[bufhead]=curx+SPEED;
if(ch_1.y<=cury)ydelay[bufhead]=cury-SPEED;
else ydelay[bufhead]=cury+SPEED;
}
また、現在自分なりに作っているのでもっと効率によい書き方がある場合は今回の要望以外でもお願いします。
技術向上にご協力お願いします。