返信遅くなってしまって申し訳ありません。
おかげ様で角度が何かという点や実際の計算の仕方も実装することができました。
しかしまた違った問題が出てきました。
現在、”右をしばらく押してから左を押す、またはその逆”をすると自機がワープしてしまいます。
敵を中心とした円の座標のどこかへ行ってしまいます。
「計算に使っている変数がいきなりプラス・マイナスを切り替えるからか?」
と思って改造したのですがどうにもうまくいきません。
どのあたりがおかしいのでしょうか?
ソースの関係あるところを抜き出して掲載します。
ヘッダーファイル
コード:
//自機クラス
#ifndef JIKI_H
#define JIKI_H
#include "Object.h"
class Jiki : public Object
{
private:
int Pad;//ボタンの入力状態格納用変数
float ChangeS;//現在の自機の敵に対する角度
float ActionChangeS;//自機が敵に対して動く角度
float JikiX,JikiZ;//自機のX,Z座標を計算用に代入する変数
float TekiX,TekiZ;//敵のX,Z座標を計算用に代入する変数
float Kyori;//自機と敵の距離
int RLflg;//右、左入力感知用フラグ
int SaveRLflg;//前回のフラグを保存
public:
Jiki();//コンストラクタ
void ModelLoad();//モデルのロード
void FirstPos();//モデルの初期位置
void Action(int JoyPad,VECTOR TekiPos);//モデルの操作、動作
void StickPoint(int jSX,int jSY,int JoyPad);//スティックの入力値を簡易数に変換する
void Update(int Joypad,VECTOR TekiPos,int SX,int SY);//アップデート
~Jiki();//デストラクタ
};
#endif
cppファイル
コード:
//自機クラス
#include "Jiki.h"
#include<math.h>//平方根やべき乗の計算
Jiki::Jiki()//コンストラクタ
{
ModelLoad();
FirstPos();
ChangeS = -(DX_PI_F / 2.0f);
ActionChangeS = 0;
RLflg = 0;
SaveRLflg = 0;
}
//モデルのロード
void Jiki::ModelLoad()
{
ModelHandle = MV1LoadModel("3DGraphics/jiki1.mqo");
}
//モデルの初期位置
void Jiki::FirstPos()
{
ModelPos = VGet(0.0f,0.0f,-150.0f);//初期位置
}
//スティックの入力値から移動速度を出す
void Jiki::StickPoint(int jSX, int jSY,int JoyPad)
{
///////////////////////////////////////////////////////////////////////
//ここで移動角度をリセットしようとしてみましたがこれでもやはりワープしてしまいます
///////////////////////////////////////////////////////////////////////
//右ボタンを押した時フラグ
if(JoyPad & PAD_INPUT_RIGHT)//→ボタン
{
RLflg = 1;
}
//左ボタンを押した時フラグ
else if(JoyPad & PAD_INPUT_LEFT)//←ボタン
{
RLflg = 0;
}
//フラグを前回のフラグと比べる
if(RLflg != SaveRLflg)
{
//前回の入力と逆なら移動角度をリセット
ActionChangeS = 0;
}
//フラグ保存
SaveRLflg = RLflg;
////////////////////////////////////////////////////////////////////////////
//スティック入力角度に対する移動量
if((jSX>=1 && jSX<=700)||(jSY>=1 && jSY<=700))
{
ActionChangeS += DX_PI_F / 72.0f;
}
if((jSX>=701 && jSX<=999) || (jSY>=701 && jSY<=999))
{
ActionChangeS += DX_PI_F / 36.0f;
}
if(jSX == 1000 || jSY==1000)
{
ActionChangeS += DX_PI_F / 18.0f;
}
}
////////////////////////////////////////////////////////
//モデルの操作、動作
////////////////////////////////////////////////////////
void Jiki::Action(int Joypad,VECTOR TekiPos)
{
//自機、敵座標を計算しやすい型に変換
JikiX = ModelPos.x;
JikiZ = ModelPos.z;
TekiX = TekiPos.x;
TekiZ = TekiPos.z;
//敵と自機の距離
Kyori = pow((TekiX - JikiX),2)+pow((TekiZ-JikiZ),2);
Kyori = sqrt(Kyori);
//右ボタンを押した時反時計回り
if(Joypad & PAD_INPUT_RIGHT)//→ボタン
{
JikiX = Kyori*cos(ChangeS+ActionChangeS)+TekiX;
JikiZ = Kyori*sin(ChangeS+ActionChangeS)+TekiZ;
}
//左ボタンを押した時時計回り
if(Joypad & PAD_INPUT_LEFT)//←ボタン
{
JikiX = Kyori*cos(ChangeS-ActionChangeS)+TekiX;
JikiZ = Kyori*sin(ChangeS-ActionChangeS)+TekiZ;
}
//位置をセット
ModelPos.x = JikiX;
ModelPos.z = JikiZ;
MV1SetPosition(ModelHandle,ModelPos);
}
////////////////////////////////////////////////////////
void Jiki::Update(int Joypad,VECTOR TekiPos,int jSX,int jSY)
{
StickPoint(jSX,jSY,Joypad);
Action(Joypad,TekiPos);
}
//デストラクタ
Jiki::~Jiki()
{
//モデルの開放
MV1DeleteModel(ModelHandle);
}