コード:
#define CARD_WIDTH 200
#define CARD_HEIGHT 300
#define CARD_MAX (13*4)
#define CARD_SCALE 0.5f
#define CARD_YAMAHUDA 24
#define CARD_BA 7
/******************************************************************************
* 概要 | メニュークラス
* 詳細 | 当たり判定用
******************************************************************************/
class MENU{
public:
float Px, Py;
int Width, Height;
float SizeX, SizeY;
cocos2d::Sprite* tex;
bool TouchCheck( int x, int y );
bool TouchCheck( void );
void Init( int px, int py, int width, int height, float sx, float sy );
void InitSprite( cocos2d::Layer *layer, int x, int y, const std::string& filename, int sx, int sy, int cx, int cy, float scaleX, float scaleY, bool flag );
void SetPostion( int x, int y, float scaleX, float scaleY );
};
bool MENU::TouchCheck( int x, int y ){
int sx = ( this->Width * this->SizeX ) / 2;
int sy = ( this->Height * this->SizeY ) / 2;
if(x < this->Px+sx && x > this->Px-sx &&
y < this->Py+sy && y > this->Py-sy ){
return true;
}else{
return false;
}
}
bool MENU::TouchCheck( void ){
return MENU::TouchCheck( TouchData::X, TouchData::Y );
}
void MENU::Init( int px, int py, int width, int height, float sx, float sy ){
this->Px = px;
this->Py = py;
this->Width = width;
this->Height = height;
this->SizeX = sx;
this->SizeY = sy;
}
void MENU::InitSprite( cocos2d::Layer *layer, int x, int y, const std::string& filename, int sx, int sy, int cx, int cy, float scaleX, float scaleY, bool flag ){
this->Init( x, y, cx, cy, scaleX, scaleY );
this->tex = DrawUtil::LoadImage( layer, x, y, filename, sx, sy, cx, cy, flag );
this->tex->setScale( scaleX, scaleY );
}
void MENU::SetPostion( int x, int y, float scaleX, float scaleY ){
this->Init( x, y, this->Width, this->Height, scaleX, scaleY );
this->tex->setPosition( x, y );
}
class TRUMP{
public:
enum CARD_TYPE{
CARD_SPADE,
CARD_HEART,
CARD_CLUB,
CARD_DIAMOND,
};
// カード情報
typedef struct{
int Number;
CARD_TYPE Type;
bool OpenFlag;
Point PosInit;
MENU Btn;
}CARD;
// 変数
Layer *layer;
CARD Card[CARD_MAX];
MENU btnYama;
std::vector<CARD> FieldSet;
std::vector< vector<CARD> > FieldBa;
std::vector<CARD> FieldYama;
CARD selected_card;
bool MoveFlag;
int MoveI, MoveNum, MoveZorder;
int CardCount[CARD_BA];
int YamaCount;
//int YamaCount;
//CARD Yama[CARD_YAMAHUDA];
//CARD Ba[7][];
// 関数
void Init( Layer* layer );
void Loop();
//void SetTexture( int x, int y, TEX_CELL mode );
void Shuffle();
};
void TRUMP::Init( Layer* layer ){
// レイヤー情報を保存
this->layer = layer;
this->MoveFlag = false;
this->MoveI = 0;
this->MoveNum = 0;
this->MoveZorder = 0;
this->YamaCount = 0;
// カードの初期化
for(int i=0; i<CARD_MAX; i++){
this->Card[i].Number = i % ( CARD_MAX/4 );
this->Card[i].Type = (CARD_TYPE)(i / ( CARD_MAX/4 ));
this->Card[i].OpenFlag = false;
int px = WIN_W/2;
int py = pH(WIN_H/2);
this->Card[i].PosInit = Point( px, py );
this->Card[i].Btn.InitSprite( this->layer, px, py, "object_trump.png", this->Card[i].Number*CARD_WIDTH, this->Card[i].Type*CARD_HEIGHT, CARD_WIDTH, CARD_HEIGHT, CARD_SCALE, CARD_SCALE, true );
}
this->Shuffle();
/* 配列のサイズをセット */
// 山札にカードをセット
for(int i=0; i<CARD_YAMAHUDA; i++){
int num = i;
this->Card[num].Btn.Px = 100;
this->Card[num].Btn.Py = pH(200);
}
// フィールドの初期化
this->FieldYama.resize(CARD_YAMAHUDA);
this->FieldBa.resize(CARD_BA);
for( int i=0; i<this->FieldBa.size(); i++ ){
this->FieldBa[i].resize(i+1);
}
// セット用の初期化
this->FieldSet.resize(CARD_DIAMOND+1);
//for(int i=0; i<this->FieldSet.size(); i++){
// this->FieldSet[i].resize(13);
//}
/* カードをセット */
// 山札の初期化
int cnt = 0;
for(int i=0; i<this->FieldYama.size(); i++){
this->FieldYama[i] = this->Card[cnt];
cnt++;
}
// 場の初期化
for( int i=0; i<this->FieldBa.size(); i++ ){
for( int j=0; j<this->FieldBa[i].size(); j++ ){
this->FieldBa[i][j] = this->Card[cnt];
this->CardCount[i] = j;
cnt++;
}
}
/* ポジションをセット */
for(int i=0; i<this->FieldYama.size(); i++){
int px = 80;
int py = pH(100);
this->FieldYama[i].Btn.tex->setZOrder( i + 100 );
this->FieldYama[i].PosInit = Point( px, py );
this->FieldYama[i].Btn.SetPostion( px, py, this->FieldYama[i].Btn.SizeX, this->FieldYama[i].Btn.SizeY );
}
// 山札用のボタンを初期化
this->btnYama.Init( this->FieldYama[0].Btn.Px, this->FieldYama[0].Btn.Py, this->FieldYama[0].Btn.Width, this->FieldYama[0].Btn.Height, this->FieldYama[0].Btn.SizeX, this->FieldYama[0].Btn.SizeY );
// 場を初期化
for( int i=0; i<this->FieldBa.size(); i++ ){
for( int j=0; j<this->FieldBa[i].size(); j++ ){
int px = ( i * 80 ) + 80;
int py = pH( j*50 - 500 );
this->FieldBa[i][j].Btn.tex->setZOrder( i*10+j );
this->FieldBa[i][j].PosInit = Point( px, py );
this->FieldBa[i][j].Btn.SetPostion( px, py, this->FieldBa[i][j].Btn.SizeX, this->FieldBa[i][j].Btn.SizeY );
}
}
// おく場所
for(int i=0; i<this->FieldSet.size(); i++){
int px = ( i * 110 ) + 270;
int py = pH( 200 );
this->FieldSet[i].Number = -1;
this->FieldSet[i].Btn.InitSprite( this->layer, px, py, "object_trump.png", 0*CARD_WIDTH, 5*CARD_HEIGHT, CARD_WIDTH, CARD_HEIGHT, CARD_SCALE, CARD_SCALE, true );
this->FieldSet[i].PosInit = Point( px, py );
this->FieldSet[i].Btn.tex->setZOrder( 0 );
//for(int j=0; j<this->FieldSet[i].size(); j++){
//}
}
}
void TRUMP::Shuffle(){
int i, rnd;
CARD temp;
for( i=0; i<CARD_MAX; i++ ){
rnd = rand() % CARD_MAX;
temp = this->Card[i];
this->Card[i] = this->Card[rnd];
this->Card[rnd] = temp;
}
}
void TRUMP::Loop(){
// 山札をタッチしたか
if( TouchData::Trg ){
if( this->btnYama.TouchCheck() ){
int i = this->YamaCount;
this->FieldYama[i].Btn.Px = this->FieldYama[i].PosInit.x + 110;
this->FieldYama[i].Btn.Py = this->FieldYama[i].PosInit.y;
this->FieldYama[i].Btn.SetPostion( this->FieldYama[i].Btn.Px, this->FieldYama[i].Btn.Py, this->FieldYama[i].Btn.SizeX, this->FieldYama[i].Btn.SizeY );
this->YamaCount++;
// 最後まで行ったら初期化
if( this->YamaCount >= CARD_YAMAHUDA ){
this->YamaCount = 0;
for(int ii=0; ii<CARD_YAMAHUDA; ii++){
this->FieldYama[ii].Btn.Px = this->FieldYama[ii].PosInit.x;
this->FieldYama[ii].Btn.Py = this->FieldYama[ii].PosInit.y;
this->FieldYama[ii].Btn.SetPostion( this->FieldYama[ii].Btn.Px, this->FieldYama[ii].Btn.Py, this->FieldYama[ii].Btn.SizeX, this->FieldYama[ii].Btn.SizeY );
}
}
}
}
if( TouchData::Flag ){
//this->YamaCount++;
//if( this->YamaCount >= CARD_YAMAHUDA ) this->YamaCount = 0;
}
// タッチしてなければ
if( !TouchData::Trg && TouchData::Flag && TouchData::Pul ){
this->MoveFlag = false;
this->MoveI = 0;
this->MoveNum = 0;
this->MoveZorder = 0;
}
// 移動するオブジェクトを決める
if( !this->MoveFlag ){
if( TouchData::Trg || TouchData::Flag ){
// 場所
for( int i=0; i<this->FieldBa.size(); i++ ){
int num = this->CardCount[i];
if( this->FieldBa[i][num].Btn.TouchCheck() ){
this->selected_card = this->FieldBa[i][num];
this->MoveFlag = true;
break;
}
}
// 山札
int num = this->YamaCount;
if( this->FieldYama[num].Btn.TouchCheck() ){
this->selected_card = this->FieldYama[num];
this->MoveFlag = true;
}
log( "type %d %d", this->selected_card.Number, this->selected_card.Type );
}
}
if( this->MoveFlag ){
this->selected_card.Btn.Px = TouchData::X;
this->selected_card.Btn.Py = TouchData::Y;
this->selected_card.Btn.SetPostion( this->selected_card.Btn.Px, this->selected_card.Btn.Py, this->selected_card.Btn.SizeX, this->selected_card.Btn.SizeY );
}
if( TouchData::Pul ){
this->MoveFlag = false;
for( int i=0; i<this->FieldBa.size(); i++ ){
int num = this->CardCount[i];
if( MyFunction::HitSprite( this->FieldBa[i][num].Btn.tex, this->selected_card.Btn.tex ) ){
//log( "push %d", i );
//log( "size %d", this->FieldBa[i].size() );
this->FieldBa[i].push_back( this->selected_card );
//log( "size %d", this->FieldBa[i].size() );
//MoveTo *move = MoveTo::create( 1.0f, this->FieldBa[i][j].PosInit );
//this->FieldBa[i+1].Btn.tex.runAction(move);
this->selected_card.Number = -1;
for( int j=0; j<this->FieldBa.size(); j++ ){
//this->FiledBa[j].Number = 0;
//this->FiledBa[j].Number = 0;
}
//this->selected_card
break;
}
}
int type = this->selected_card.Type;
if( MyFunction::HitSprite( this->selected_card.Btn.tex, this->FieldSet[type].Btn.tex ) ){
if( this->FieldSet[type].Number+1 == this->selected_card.Number ){
this->selected_card.PosInit = this->FieldSet[type].Btn.tex->getPosition();
}
}
/*
// ナンバー+1なら配置
if( this->FieldSet[type].Number+1 == this->FieldBa[i][num].Number ){
this->FieldSet[type].Number = this->FieldBa[i][num].Number;
this->FieldBa[i][num].PosInit = this->FieldSet[type].Btn.tex->getPosition();
this->CardCount[i]--;
this->FieldSet[type] = this->FieldBa[i][num];
//this->FieldBa[i].pop_back();
//this->FieldBa[i].resize(i+1);
}
*/
}
}