プレイヤーモーションについて
Posted: 2015年2月22日(日) 22:43
SetMotion()という値にモーションを入れているのですが通常時がSetMotion(1)でCキーを押すとSetMotion(2)になるように自分では設定しているつもりなのですがCキーを押して動かすとモーションをとってくれません。なぜですか?
#include "iextreme.h"
#include "system/system.h"
#include "player.h"
#include "camera.h"
#include "enemy.h"
#include "effect.h"
#include "collision.h"
//extern Vector3 cpos, ctarget;
//*****************************************************************************************************************************
//
// グローバル変数
//
//*****************************************************************************************************************************
// 攻撃データ
typedef struct{
int start;
int end;
int jump;
int next;
int endframe;
int hitstart;
int hitend;
int damage;
int movestart;
int moveend;
}AttackData;
AttackData attackdata[]={
// start end- jump next endframe hitstart hitend damage
{95, 105, 108, 5, 123, 100, 103, 2, },
{190, 200, 205, 6, 221, 200, 203, 4, },
{250, 260, 273, 2, 272, 242, 245, 10, },
};
//*****************************************************************************************************************************
//
// 初期化
//
//*****************************************************************************************************************************
Player::Player() :BaseObj(), weapon(NULL)
{
// プレイヤー初期化
//obj = new iex3DObj ( "DATA\\CHR\\ECCMAN_SHOT\\ECCMAN.iem" );
obj = new iex3DObj("DATA\\CHR\\player\\magic.iem");
//scale = 0.04f;
scale = 0.02f;
step = 0;
mode = MODE_MOVE;
//mode = MODE_FP;
weapon = new iexMesh("DATA\\CHR\\M4\\M4.IMO");
//weapon = new iexMesh("DATA\\CHR\\player\\toon09m.BMP");
}
//*****************************************************************************************************************************
//
// 更新
//
//*****************************************************************************************************************************
//-----------------------------------------------------------
// コントローラによるプレイヤー制御
//-----------------------------------------------------------
bool Player::Control(float max )
{
static float speed=0;
// 軸の傾きの取得
float axisX = KEY_GetAxisX()*0.001f;
float axisY = -KEY_GetAxisY()*0.001f;
// 加速
speed+= 0.02f;
if( speed > max ) speed = max;
// 軸の傾きと長さ
float d = sqrtf( axisX*axisX + axisY*axisY );
// 軸の傾きの遊び(適当)
if( d < 0.4f){
speed=0;
return false;
}
// 軸の傾き補正
if( d > 1.0f){
axisX /= d;
axisY /= d;
}
// カメラ前方方向取得と正規化
Vector3 f(matView._13 , 0, matView._33 );
f.Normalize();
// カメラ左右方向算出
Vector3 r( f.z, 0, -f.x );
// 移動方向算出
Vector3 m( 0,0,0);
m = f*axisY + r*axisX;
// 移動
pos.x +=m.x*speed;
pos.z +=m.z*speed;
// 現在の向き
Vector3 v( 0,0,0);
v.x = sinf( angle );
v.z = cosf( angle );
// 左右判定(外積)
float cross = m.x * v.z - m.z * v.x;
// 角度補正計算(内積)
float dot = m.x * v.x + m.z * v.z;
float L1 = sqrtf( m.x * m.x + m.z * m.z );
dot /= L1;
dot = 1.0f - dot;
if( dot > 0.1f) dot = 0.1f;
if (cross < -0.1f) angle -= dot;
else if (cross > 0.1f) angle += dot;
//if (cross < 0) angle -= dot;
//else angle += dot;
return true;
}
//---------------------------------------------------------------------
// プレイヤージャンプ
//---------------------------------------------------------------------
void Player::Jump()
{
float work;
switch( step ){
case 0:
SetMotion(3);
step ++;
//break;
case 1:
if( obj->GetFrame() == 156 ){
move.y += 2.0f;
step ++;
}
break;
case 2:
Control( 0.4f);
move.y -=0.1f;
pos.y += move.y;
work = Collision::getHeight(pos,up);
if( pos.y < work )
{
pos.y = work;
move.y = 0;
SetMotion(4);
step ++;
}
break;
case 3:
if( obj ->GetFrame () == 181){
SetMode( Player::MODE_MOVE );
}
break;
}
}
//---------------------------------------------------------------------
// プレイヤー攻撃
//---------------------------------------------------------------------
void Player::Attack()
{
int frame =obj ->GetFrame ();
switch (step)
{
case 0:
SetMotion(2);
IEX_PlaySound(2, true);
step++;
break;
case 1:
if (frame >= 360)
{
SetMode(Player::MODE_MOVE);
}
break;
}
//static bool flg = false;
//static int n=0;
//int frame =obj ->GetFrame ();
//switch( step ){
// case 0:
// SetMotion(2);
// step ++;
// //break;
// case 1:
//
// // コンボ
// if((frame > attackdata[n].start )&&(frame < attackdata[n].end )){
// if( KEY_Get(KEY_B)==3)
// flg = true;
// }
//
// if( frame >= attackdata[n].jump ){
// if( flg ){
// SetMotion( attackdata[n].next );
// flg = false;
// n++;
// break;
// }
// }
// //-----------------------------------------------------------
// // 敵との当たり判定
// //-----------------------------------------------------------
// if( frame > attackdata[n].hitstart && frame < attackdata[n].hitend ){
// // 剣の先の位置
// Vector3 p1;
// Matrix m = ( *obj ->GetBone (8) ) *( obj ->TransMatrix ) ;
// p1.x = m._41 + m._31 * 50.0f;
// p1.y = m._42 + m._32 * 50.0f;
// p1.z = m._43 + m._33 * 50.0f;
// }
// if( frame == attackdata[n].endframe ){
// SetMode(Player::MODE_MOVE );
// n=0;
// }
// break;
//}
}
//---------------------------------------------------------------------
// プレイヤー移動
//---------------------------------------------------------------------
void Player::Move( void )
{
float walk = FP;
float act = MOVE;
if (Control(0.12f)){
SetMotion(1);
// IEX_PlaySound(2, false);
}
else SetMotion(0);
if (KEY_Get(KEY_D) && walk){
Control(0.002f);
SetMotion(3);
}
if (KEY_Get(KEY_C)){
Control(0.8f);
SetMotion(2);
}
//// 左右で回転
//if( KEY_Get( KEY_LEFT ) ) player.angle -= 0.15f;
//if( KEY_Get( KEY_RIGHT ) ) player.angle += 0.15f;
//// 上で前進
//if( KEY_Get( KEY_UP ) ){
// player.x += sinf(player. angle) * 0.6f;
// player.z += cosf(player. angle) * 0.6f;
// PlayerMotion(1);
//} else PlayerMotion(0);
move.y -= 0.1f;
pos.y += move.y;
float work = Collision::getHeight(pos,up);
if( pos.y < work )
{
pos.y = work;
move.y = 0;
}
//プレイヤー壁あたり判定(前)
float work2 = Collision::getFront(pos);
if (pos.z > work2 - 2.0f)
{
pos.z = work2 - 2.0f;
move.z = 0;
//move.y = 0;
}
//プレイヤー壁あたり判定(後ろ)
float work3 = Collision::getBack(pos);
if (pos.z < work3 + 2.0f)
{
pos.z = work3 + 2.0f;
move.z = 0;
}
//プレイヤー壁あたり判定(右)
float work4 = Collision::getRight(pos);
if (pos.x > work4 - 2.0f)
{
pos.x = work4 - 2.0f;
move.x = 0;
}
//プレイヤー壁あたり判定(左)
float work5 = Collision::getLeft(pos);
if (pos.x < work5 + 2.0f)
{
pos.x = work5 + 2.0f;
move.x = 0;
}
if( KEY_Get(KEY_A)==3)
SetMode(Player::MODE_JUMP); // ジャンプ
if( KEY_Get(KEY_B)==3)
SetMode(Player::MODE_ATTACK); // 攻撃
}
void Player::Update()
{
switch( mode ){
case Player::MODE_MOVE: // 移動
Move();
break;
case Player::MODE_ATTACK: // 攻撃
Attack();
break;
case Player::MODE_JUMP: // ジャンプ
Jump();
break;
}
// 基底クラス更新
BaseObj::Update ();
//Matrix mat = *obj->GetBone(8)*obj->TransMatrix;
//mat._21 = -mat._21;y
//mat._22 = -mat._22;
//mat._23 = -mat._23;
//weapon->TransMatrix = mat;
//骨の行列取得
Matrix mat = *obj->GetBone(8) * obj->TransMatrix;
//武器の向き補正
mat._21 *= -1, mat._22 *= -1, mat._23 *= -1;
//武器行列設定
weapon->TransMatrix = mat;
//if (obj->GetParam(4) == 1)
//{
// Matrix m = weapon->TransMatrix;
// Vector3 p(m._41 + m._31 * 80.0f + m._21 * 20.0f, );
// Effect::Gun(p.x, p.y, p.z);
// obj->SetParam(4, 0);
//}
// prepos = pos;
}
void Player::Render()
{
obj->Render();
weapon->Render();
}
#include "iextreme.h"
#include "system/system.h"
#include "player.h"
#include "camera.h"
#include "enemy.h"
#include "effect.h"
#include "collision.h"
//extern Vector3 cpos, ctarget;
//*****************************************************************************************************************************
//
// グローバル変数
//
//*****************************************************************************************************************************
// 攻撃データ
typedef struct{
int start;
int end;
int jump;
int next;
int endframe;
int hitstart;
int hitend;
int damage;
int movestart;
int moveend;
}AttackData;
AttackData attackdata[]={
// start end- jump next endframe hitstart hitend damage
{95, 105, 108, 5, 123, 100, 103, 2, },
{190, 200, 205, 6, 221, 200, 203, 4, },
{250, 260, 273, 2, 272, 242, 245, 10, },
};
//*****************************************************************************************************************************
//
// 初期化
//
//*****************************************************************************************************************************
Player::Player() :BaseObj(), weapon(NULL)
{
// プレイヤー初期化
//obj = new iex3DObj ( "DATA\\CHR\\ECCMAN_SHOT\\ECCMAN.iem" );
obj = new iex3DObj("DATA\\CHR\\player\\magic.iem");
//scale = 0.04f;
scale = 0.02f;
step = 0;
mode = MODE_MOVE;
//mode = MODE_FP;
weapon = new iexMesh("DATA\\CHR\\M4\\M4.IMO");
//weapon = new iexMesh("DATA\\CHR\\player\\toon09m.BMP");
}
//*****************************************************************************************************************************
//
// 更新
//
//*****************************************************************************************************************************
//-----------------------------------------------------------
// コントローラによるプレイヤー制御
//-----------------------------------------------------------
bool Player::Control(float max )
{
static float speed=0;
// 軸の傾きの取得
float axisX = KEY_GetAxisX()*0.001f;
float axisY = -KEY_GetAxisY()*0.001f;
// 加速
speed+= 0.02f;
if( speed > max ) speed = max;
// 軸の傾きと長さ
float d = sqrtf( axisX*axisX + axisY*axisY );
// 軸の傾きの遊び(適当)
if( d < 0.4f){
speed=0;
return false;
}
// 軸の傾き補正
if( d > 1.0f){
axisX /= d;
axisY /= d;
}
// カメラ前方方向取得と正規化
Vector3 f(matView._13 , 0, matView._33 );
f.Normalize();
// カメラ左右方向算出
Vector3 r( f.z, 0, -f.x );
// 移動方向算出
Vector3 m( 0,0,0);
m = f*axisY + r*axisX;
// 移動
pos.x +=m.x*speed;
pos.z +=m.z*speed;
// 現在の向き
Vector3 v( 0,0,0);
v.x = sinf( angle );
v.z = cosf( angle );
// 左右判定(外積)
float cross = m.x * v.z - m.z * v.x;
// 角度補正計算(内積)
float dot = m.x * v.x + m.z * v.z;
float L1 = sqrtf( m.x * m.x + m.z * m.z );
dot /= L1;
dot = 1.0f - dot;
if( dot > 0.1f) dot = 0.1f;
if (cross < -0.1f) angle -= dot;
else if (cross > 0.1f) angle += dot;
//if (cross < 0) angle -= dot;
//else angle += dot;
return true;
}
//---------------------------------------------------------------------
// プレイヤージャンプ
//---------------------------------------------------------------------
void Player::Jump()
{
float work;
switch( step ){
case 0:
SetMotion(3);
step ++;
//break;
case 1:
if( obj->GetFrame() == 156 ){
move.y += 2.0f;
step ++;
}
break;
case 2:
Control( 0.4f);
move.y -=0.1f;
pos.y += move.y;
work = Collision::getHeight(pos,up);
if( pos.y < work )
{
pos.y = work;
move.y = 0;
SetMotion(4);
step ++;
}
break;
case 3:
if( obj ->GetFrame () == 181){
SetMode( Player::MODE_MOVE );
}
break;
}
}
//---------------------------------------------------------------------
// プレイヤー攻撃
//---------------------------------------------------------------------
void Player::Attack()
{
int frame =obj ->GetFrame ();
switch (step)
{
case 0:
SetMotion(2);
IEX_PlaySound(2, true);
step++;
break;
case 1:
if (frame >= 360)
{
SetMode(Player::MODE_MOVE);
}
break;
}
//static bool flg = false;
//static int n=0;
//int frame =obj ->GetFrame ();
//switch( step ){
// case 0:
// SetMotion(2);
// step ++;
// //break;
// case 1:
//
// // コンボ
// if((frame > attackdata[n].start )&&(frame < attackdata[n].end )){
// if( KEY_Get(KEY_B)==3)
// flg = true;
// }
//
// if( frame >= attackdata[n].jump ){
// if( flg ){
// SetMotion( attackdata[n].next );
// flg = false;
// n++;
// break;
// }
// }
// //-----------------------------------------------------------
// // 敵との当たり判定
// //-----------------------------------------------------------
// if( frame > attackdata[n].hitstart && frame < attackdata[n].hitend ){
// // 剣の先の位置
// Vector3 p1;
// Matrix m = ( *obj ->GetBone (8) ) *( obj ->TransMatrix ) ;
// p1.x = m._41 + m._31 * 50.0f;
// p1.y = m._42 + m._32 * 50.0f;
// p1.z = m._43 + m._33 * 50.0f;
// }
// if( frame == attackdata[n].endframe ){
// SetMode(Player::MODE_MOVE );
// n=0;
// }
// break;
//}
}
//---------------------------------------------------------------------
// プレイヤー移動
//---------------------------------------------------------------------
void Player::Move( void )
{
float walk = FP;
float act = MOVE;
if (Control(0.12f)){
SetMotion(1);
// IEX_PlaySound(2, false);
}
else SetMotion(0);
if (KEY_Get(KEY_D) && walk){
Control(0.002f);
SetMotion(3);
}
if (KEY_Get(KEY_C)){
Control(0.8f);
SetMotion(2);
}
//// 左右で回転
//if( KEY_Get( KEY_LEFT ) ) player.angle -= 0.15f;
//if( KEY_Get( KEY_RIGHT ) ) player.angle += 0.15f;
//// 上で前進
//if( KEY_Get( KEY_UP ) ){
// player.x += sinf(player. angle) * 0.6f;
// player.z += cosf(player. angle) * 0.6f;
// PlayerMotion(1);
//} else PlayerMotion(0);
move.y -= 0.1f;
pos.y += move.y;
float work = Collision::getHeight(pos,up);
if( pos.y < work )
{
pos.y = work;
move.y = 0;
}
//プレイヤー壁あたり判定(前)
float work2 = Collision::getFront(pos);
if (pos.z > work2 - 2.0f)
{
pos.z = work2 - 2.0f;
move.z = 0;
//move.y = 0;
}
//プレイヤー壁あたり判定(後ろ)
float work3 = Collision::getBack(pos);
if (pos.z < work3 + 2.0f)
{
pos.z = work3 + 2.0f;
move.z = 0;
}
//プレイヤー壁あたり判定(右)
float work4 = Collision::getRight(pos);
if (pos.x > work4 - 2.0f)
{
pos.x = work4 - 2.0f;
move.x = 0;
}
//プレイヤー壁あたり判定(左)
float work5 = Collision::getLeft(pos);
if (pos.x < work5 + 2.0f)
{
pos.x = work5 + 2.0f;
move.x = 0;
}
if( KEY_Get(KEY_A)==3)
SetMode(Player::MODE_JUMP); // ジャンプ
if( KEY_Get(KEY_B)==3)
SetMode(Player::MODE_ATTACK); // 攻撃
}
void Player::Update()
{
switch( mode ){
case Player::MODE_MOVE: // 移動
Move();
break;
case Player::MODE_ATTACK: // 攻撃
Attack();
break;
case Player::MODE_JUMP: // ジャンプ
Jump();
break;
}
// 基底クラス更新
BaseObj::Update ();
//Matrix mat = *obj->GetBone(8)*obj->TransMatrix;
//mat._21 = -mat._21;y
//mat._22 = -mat._22;
//mat._23 = -mat._23;
//weapon->TransMatrix = mat;
//骨の行列取得
Matrix mat = *obj->GetBone(8) * obj->TransMatrix;
//武器の向き補正
mat._21 *= -1, mat._22 *= -1, mat._23 *= -1;
//武器行列設定
weapon->TransMatrix = mat;
//if (obj->GetParam(4) == 1)
//{
// Matrix m = weapon->TransMatrix;
// Vector3 p(m._41 + m._31 * 80.0f + m._21 * 20.0f, );
// Effect::Gun(p.x, p.y, p.z);
// obj->SetParam(4, 0);
//}
// prepos = pos;
}
void Player::Render()
{
obj->Render();
weapon->Render();
}