ルールとしては制限時間内に操作キャラの吸い込み、吹き飛ばし機能を使いゴールまで導くというものです。
マップは以下のように配列で作っています。
int mapdata[3][15][20]={
{ // 1ステージ目
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, //1
{1,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1}, //2
{1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,0,1,1,0,1}, //3
{1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,0,1}, //4
{1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,2,1}, //5
{1,0,4,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,1}, //6
{1,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,1,1,1,1}, //7
{1,0,0,0,4,0,0,1,1,1,1,4,1,1,0,0,0,0,1,1}, //8
{1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,1,1,0,1,1}, //9
{1,0,4,0,0,0,0,1,1,1,1,0,0,1,0,1,1,0,1,1}, //10
{1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,0,1,1}, //11
{1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,1}, //12
{1,0,0,4,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1}, //13
{1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1}, //14
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} //15
},
{ // 2ステージ目
{1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, //1
{0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, //2
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, //3
{1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,0,1}, //4
{1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,2,1}, //5
{1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,0,1}, //6
{1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,1}, //7
{1,0,0,0,0,0,0,0,1,1,1,0,1,1,0,0,0,0,0,1}, //8
{1,0,0,0,0,0,0,0,1,1,1,0,1,1,0,1,1,0,0,1}, //9
{1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,1,0,0,1}, //10
{1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,1}, //11
{1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,1}, //12
{1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1}, //13
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, //14
{1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} //15
},
{ // 3ステージ目
{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, //1
{1,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1}, //2
{1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,0,1,1,0,1}, //3
{1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,0,1}, //4
{1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,2,1}, //5
{1,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,1,1}, //6
{1,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,1,1,1,1}, //7
{1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,0,0,0,1,1}, //8
{1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,1,1,0,1,1}, //9
{1,0,0,0,0,0,0,1,1,1,1,0,0,1,0,1,1,0,1,1}, //10
{1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,0,1,1}, //11
{1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,0,1,1}, //12
{1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1}, //13
{1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1}, //14
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} //15
}
};
画面サイズは(800,600)です。
やりたいこととしましては、
2ステージ目の[1][0]に操作キャラがいる場合左方向に吸い込みをすると[1][17]から[1][19]までに玉があれば吸い込んで、操作キャラと同じ座標に移動させたいのです。
吸い込む機能の関数は以下のとおりです。
// 吸い込まれる関数
void testApp::reach(float *pos_x,float *pos_y,float tpos_x,float tpos_y){
const int BLOCK_SIZE = 40;
//仮想的に上下左右にもう1ステージを作りそっちの配列を調べるようにした
//プレイヤーの進む先にブロックのサイズ20個分(もう1ステージ分)足し配列に戻してから1ステージ分引いて元の場所にもどす。
int circleX = ((int)*pos_x +BLOCK_SIZE * 20) / BLOCK_SIZE - 20;
int circleY = ((int)*pos_y +BLOCK_SIZE * 15) / BLOCK_SIZE - 15;
circleX = (circleX + 20) % 20; // マイナスの値も正の値にもどす
circleY = (circleY + 15) % 15;
int z = circle.stage; //配列[z][y][x]の[z]
int x = ((int)tpos_x + BLOCK_SIZE * 20)/ BLOCK_SIZE - 20; //配列[z][y][x]の[x]
int y = ((int)tpos_y + BLOCK_SIZE * 15)/ BLOCK_SIZE - 15; //配列[z][y][x]の[y]
int offsetX, offsetY;
x = (x + 20) % 20;
y = (x + 15) % 15;
// 左方向
if( player.axisX < 0 && y == circleY ){ // player.axisX(プレイヤーの向きに*4したもの)<0(プレイヤーの向きが左)かつy == circleY(Y座標の配列番号が同じ)なら
for(int i=0; i<abs(player.axisX); i++) { // i < abs(player.axisX)(=4)だけX方向の配列を調べる
offsetX = x - i;
if( offsetX < 0 ) break; // 配列外を参照しないため
if( mapdata[z][y][offsetX] == 1 ) break;
if( mapdata[z][y][offsetX] == 4 && offsetX == circleX ){ // 玉とキャラの間に壊れる壁があったら
mapdata[z][y][offsetX] = 0; // その配列のデータを0にして床にする
}
if( offsetX == circleX || offsetX + circleX == 20 ){ // 調べた配列先が玉の配列の同じかまたは(足したときに20になったら←仮)
if(abs(*pos_x - tpos_x) < 3) break; // 玉とプレイヤーの長さが3より小さければ以下の処理を飛ばす
if(player.blow_active == false){ // 吹き飛ばすフラグがfalseなら玉の座標を+2.0fづつしていく
*pos_x += 2.0f;
}else{
*pos_x -= 2.0f; // trueなら玉の座標を-2.0fしていく
}
break;
}
}
}
// 右方向
else if( player.axisX > 0 && y == circleY){
for(int i=0; i < abs(player.axisX); i++){
offsetX = x + i;
if( offsetX > 20 )break;
if( mapdata[z][y][offsetX] == 1)break;
if( mapdata[z][y][offsetX] == 4 && offsetX == circleX){
mapdata[z][y][offsetX] = 0;
}
if( offsetX == circleX || offsetX + circleX == 20){
if(abs(*pos_x - tpos_x) < 3) break;
if(player.blow_active == false){
*pos_x -= 2.0f;
}else{
*pos_x += 2.0f;
}
break;
}
}
}
//上方向
else if( player.axisY < 0 && x == circleX){
for(int i = 0; i < abs(player.axisY); i++){
offsetY = y - i;
if( offsetY < 0)break;
if( mapdata[z][offsetY][x] == 1) break;
if( mapdata[z][offsetY][x] == 4 && offsetY == circleY){
mapdata[z][offsetY][x] = 0;
}
if( offsetY == circleY ){
if(abs(*pos_y - tpos_y) < 3) break;
if(player.blow_active == false){
*pos_y += 2.0f;
}else{
*pos_y -= 2.0f;
}
break;
}
}
}
//下方向
else if( player.axisY > 0 && x == circleX){
for(int i = 0; i < abs(player.axisY); i++){
offsetY = y + i;
if( offsetY < 0)break;
if( mapdata[z][offsetY][x] == 1) break;
if( mapdata[z][offsetY][x] == 4 && offsetY == circleY){
mapdata[z][offsetY][x] = 0;
}
if( offsetY == circleY ){
if(abs(*pos_y - tpos_y) < 3) break;
if(player.blow_active == false){
*pos_y -= 2.0f;
}else{
*pos_y += 2.0f;
}
break;
}
}
}
}
足りないところ言っていただければ補足していきます。
回答お願いします。