[C++]クラスの使い方について(STG)
Posted: 2013年5月12日(日) 08:04
以前「Cでアニメーションの質問」でお世話になりましたマシュマロです。
usao氏に提示して頂いたコードを、今回クラスで扱いたいのですが、肝心なアニメーション部分がプログラム内で反映されません。
http://dixq.net/forum/viewtopic.php?f=3&t=13026
クラスなど使わずにすべてメイン関数で実行すると思い通りに動くので、クラスの書き方(使い方)が間違っているかと思います。現在のクラス宣言とメンバー関数・変数の定義はこの通りです
プレーヤークラス宣言
次に定義部分です。
関係ない部分もありますが無視してください。
メイン関数ではもちろん上のAll関数を呼び出しMove()とDraw()を順に呼んでます。
このまま実行するとエラー無しで画面表示、描画、移動処理は成功、しかし肝心なアニメーション処理がPLAYER::DrawのDrawRotaGraph関数で反映されません。
つまりgh[2]固定のままで左右キー入力しても変化(アニメーション)が起きない状態です。
やはりroll()の書き方・使い方が間違っているのでしょうか?
usao氏に提示して頂いたコードを、今回クラスで扱いたいのですが、肝心なアニメーション部分がプログラム内で反映されません。
http://dixq.net/forum/viewtopic.php?f=3&t=13026
クラスなど使わずにすべてメイン関数で実行すると思い通りに動くので、クラスの書き方(使い方)が間違っているかと思います。現在のクラス宣言とメンバー関数・変数の定義はこの通りです
プレーヤークラス宣言
class PLAYER{
private:
double x, y;//自機x、y座標
int tilt;//傾き状態(自機のアニメーション)
int width, height;//自機各イメージの幅、高さ
int gh[5];//自機フレーム画像のハンドル
double speed;//自機の速さ
protected:
//移動計算処理
void Move(double&,double&,double&,char&,char&,char&,char&);
//描画処理
void Draw();
public:
PLAYER();
void All();//上記Move関数とDraw関数の呼び出し
};
#include "player.h"
#include "DxLib.h"
#include <math.h>
extern char Key[256];
int roll(char& left, char&right)
{//usao氏から頂いたコードを関数にまとめて見たけど正しいかどうか不安・・・
const int MaxAbsCount=8; //一方へのキー押し続けを数える最大数
const int TiltTable[2*MaxAbsCount+1] = { 0,0,0,0,1,1,1,2, 2, 2,3,3,3,4,4,4,4 };
int ShiftedTableIndex = 0;
if( !left && !right )
{ ShiftedTableIndex /= 2 ; } //てきとー.ShiftedTableIndex=0;とかで一気に戻すのとどっちが良いか?
else if(right)
{
ShiftedTableIndex = ( ShiftedTableIndex>=0 ? ShiftedTableIndex+1 : 1 );
if( ShiftedTableIndex>MaxAbsCount )ShiftedTableIndex=MaxAbsCount;
}
else if(left)
{
ShiftedTableIndex = ( ShiftedTableIndex<=0 ? ShiftedTableIndex-1 : -1 );
if( ShiftedTableIndex<-MaxAbsCount )ShiftedTableIndex=-MaxAbsCount;
}
//0~4までの結果値
return TiltTable[ShiftedTableIndex+MaxAbsCount];
}
//コンストラクタ
PLAYER::PLAYER()
{
width=320, height=240;
LoadDivGraph("playerframeset.png",5,5,1,width,height,gh);//フレーム画像の分割ロード
//上のroll関数の戻り値をtilt変数に格納
tilt = roll(Key[KEY_INPUT_LEFT],Key[KEY_INPUT_RIGHT]);
speed=6;
x=300, y=400;
}
void PLAYER::Move(//移動処理 あまり関係ないですが・・
double& x, double& y,
double& speed,
char& up, char& down,
char& left, char& right)
{
double s=speed/sqrt(2.0);
if(up && left) x-=s,y-=s; else
if(up && right)x+=s,y-=s; else
if(down && left)x-=s,y+=s; else
if(down && right)x+=s,y+=s;else
if(up && !down) y-=speed; else
if(down && !up) y+=speed; else
if(left && !right) x-=speed; else
if(right&& !left) x+=speed;
if(x>600){
x=600;
}else if(x<0){
x=0;
}
if(y>800){
y=800;
}else if (y<0){
y=0;
}
}
void PLAYER::Draw()
{
//roll関数で得た値を描画・・・のつもり
DrawRotaGraph((int)x,(int)y, 0.5,0.0,gh[tilt],TRUE);
}
void PLAYER::All()
{
Move(x,y,speed,Key[KEY_INPUT_UP],Key[KEY_INPUT_DOWN],Key[KEY_INPUT_LEFT],Key[KEY_INPUT_RIGHT]);
Draw();
}
メイン関数ではもちろん上のAll関数を呼び出しMove()とDraw()を順に呼んでます。
このまま実行するとエラー無しで画面表示、描画、移動処理は成功、しかし肝心なアニメーション処理がPLAYER::DrawのDrawRotaGraph関数で反映されません。
つまりgh[2]固定のままで左右キー入力しても変化(アニメーション)が起きない状態です。
やはりroll()の書き方・使い方が間違っているのでしょうか?