|
分類:[C#]
C#とDXライブラリを使ってVC#2008を用いてアクションゲームをつくり始めました。が,いままでSTGはつくったことがあるのですが,アクションゲームだといろんな原理がわからなくて困っています。
とりあえず,二次元配列でマップのブロックの位置を格納し,1はブロック,0は何もおかないことをあらわすことにしました。そして,キャラクターとブロックの判定をとり,位置を補正する(あたったらとめる)関数をhttp://hakuhin.jp/as/collide.html#COLLIDE_01を参考にしてつくってみました。しかし,うまくいきません。
public class Block
{
const int CHIP_SIZE = 40;
const int MAX_LENGTH = 10;
int i, j;
static int bl_rect_x; // 矩形x座標
static int bl_rect_y; // 矩形y座標
static int bl_rect_w; // 矩形幅
static int bl_rect_h; // 矩形高さ
public static int bl_x_min; // x最小
public static int bl_y_min; // y最小
public static int bl_x_max; // x最大
public static int bl_y_max; // y最大
int[,] haiti =
{
{ 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{ 0,1,0,0,1,0,1,0,1,0,0,0,0,0,0,1},
{ 0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,1},
{ 0,1,0,0,1,0,1,0,1,0,0,0,0,0,0,1},
{ 0,1,0,0,1,1,0,1,1,0,0,0,0,0,0,1},
{ 0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,1},
{ 0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
{ 0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,1},
{ 0,1,1,1,1,0,1,0,1,1,1,0,0,0,1,1},
{ 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
public void DrawBlock()
{
for (i = 0; i < 12; i++)
{
for (j = 0; j < 16; j++)
{
if (haiti[i, j] == 1)
{
DX.DrawBox(j * CHIP_SIZE, i * CHIP_SIZE, (j + 1) * CHIP_SIZE, (i + 1) * CHIP_SIZE, DX.GetColor(0, 255, 255), 1);
}
}
}
}
public string Atari(int x_max, int y_max, int x_min, int y_min)
{
for (i = 0; i < 12; i++)
{
for (j = 0; j < 16; j++)
{
if (haiti[i, j] == 1)
{
bl_rect_x = j * 40;
bl_rect_y = i * 40;
bl_rect_w = 40;
bl_rect_h = 40;
bl_x_min = bl_rect_x;
bl_y_min = bl_rect_y;
bl_x_max = bl_x_min + bl_rect_w;
bl_y_max = bl_y_min + bl_rect_h;
if (x_max < bl_x_min)
{
}
else if (y_max < bl_y_min)
{
}
else if (x_min > bl_x_max)
{
}
else if (y_min > bl_y_max)
{
}
else
{
// ブロックの上端
if (y_max - bl_y_min < MAX_LENGTH)
{
return "上";
}
// ブロックの下端
if (bl_y_max - y_min < MAX_LENGTH)
{
return "下";
}
// ブロックの左端
if (x_max - bl_x_min < MAX_LENGTH)
{
return "左";
}
// ブロックの右端
if (bl_x_max - x_min < MAX_LENGTH)
{
return "右";
}
else
{
return "あたってないです";
}
}
}
}
}
return "あたってないです";
}
}
}
そして,動かすキャラクターのクラスで,
public class Ship
{
public static int x, y;
static int my_rect_x = -10; // 矩形x座標(座標からのオフセット)
static int my_rect_y = -10; // 矩形y座標(座標からのオフセット)
static int my_rect_w = 20; // 矩形幅
static int my_rect_h = 20; // 矩形高さ
static int my_x_min = my_rect_x + x;
static int my_y_min = my_rect_y + y;
static int my_x_max = my_x_min + my_rect_w;
static int my_y_max = my_y_min + my_rect_h;
//省略
public void AtariPlayer(Block bl)
{
string atari = bl.Atari(my_x_max, my_y_max, my_x_min, my_y_min);
if (atari == "上")
{
y = Block.bl_y_min - my_rect_y - my_rect_h;
}
else if (atari == "下")
{
y = Block.bl_y_max - my_rect_y;
}
else if (atari == "左")
{
x = Block.bl_x_min - my_rect_x - my_rect_w;
}
else if (atari == "右")
{
x = Block.bl_x_max - my_rect_x;
}
else
{
}
}
}
この処理を実行しても,キャラクターが当たったことにはなっていません。どうやって直せばいいでしょうか?
|