私は今、DXライブラリでベルトスクロールアクションゲームを作っている途中の初心者です。
新ゲームプログラミングの館などのサイトを参考にプログラムを書いてみましたが、現時点でキャラクター同士の衝突判定のところが分からず困っています。こちらが衝突判定部分のプログラムです。
//敵の追跡
{
double sb, sbx, sby, bx, by, sx, sy;
sx = enemyx / 2;
sy = enemyy / 2;
bx = ch.plx / 2;
by = ch.ply / 2;
sbx = bx - sx;
sby = by - sy;
sb = sqrt(sbx*sbx + sby*sby);
enesx = sbx / sb * 2;
enesy = sby / sb * 2;
if (damage==0&&tekiatk==0(((ch.plx > enemyx && ch.plx < enemyx+100)|| //敵がダメージを受けていないかつ敵が攻撃を行っていない、主人公がダメージを受ける範囲内にいない場合、主人公を追いかけ、敵の歩行アニメーションをする
(ch.plx < enemyx && ch.plx + 100 > enemyx)) &&
((ch.ply > enemyy && ch.ply < enemyy+40)||
(ch.ply < enemyy && ch.ply+40 > enemyy ))) == 0)
{
{
enemyx += enesx;
enemyy += enesy;
DrawGraph(enemyx - camerax, enemyy-40, eimage[enemygra], FALSE);//敵の歩行アニメーション
enewcounter++;
tekiatk = 0;
}
{
if (sayu==0&&(enemyx > ch.plx + 101)|| sayu == 1 && (enemyx > ch.plx + 101))
{
enemygra = 1 + (enewcounter % 128) / 16;
}
if ((enemyx > ch.plx + 101) && (enemyy+40 == ch.ply))//敵が消えてしまう現象を防ぐための補正←効果なし
{
enemyy--;
enemyy--;
}
if (enemygra < 9 && (ch.plx == enemyx))//敵が消えてしまう現象を防ぐための補正
{
enemyx++;
enemyx++;
}
}
{
if (sayu==0&&(enemyx < ch.plx +99)|| sayu == 1 && (enemyx < ch.plx + 99))
{
enemygra = 10 + (enewcounter % 128) / 16;
}
if ((enemyx > ch.plx + 99) && (enemyy+40 == ch.ply))//敵が消えてしまう現象を防ぐための補正←効果なし
{
enemyy--;
enemyy--;
}
if (enemygra < 18 && (ch.plx == enemyx))//敵が消えてしまう現象を防ぐための補正
{
enemyx--;
enemyx--;
}
}
}
if (sayu==0 && (((ch.plx > enemyx && ch.plx < enemyx + 100) || //主人公が右を向いてて主人公がダメージを受ける範囲内にいる場合、敵の攻撃アニメーションをする
(ch.plx < enemyx && ch.plx + 100 > enemyx)) &&
((ch.ply > enemyy && ch.ply < enemyy + 40) ||
(ch.ply < enemyy && ch.ply + 40 > enemyy))) == 1)
{
{
damagetime++;
dmaecounter++;
tekiatk = 1;
}
if ((enemyx > ch.plx))
{
DrawGraph((enemyx - 100) - camerax, enemyy, dmaeimage[dmaei], FALSE);//(前から)敵の攻撃アニメーション
dmaei = 0 + (dmaecounter % 60) / 20;
}
if ((enemyx < ch.plx ))
{
DrawGraph((enemyx+95) - camerax, enemyy , dusiimage[dusii], FALSE);//(後ろから)敵の攻撃アニメーション
dusii = 3 + (dmaecounter % 60) / 20;
}
}
if (sayu==1 && (((ch.plx > enemyx && ch.plx < enemyx + 100) || //主人公が左を向いてて主人公がダメージを受ける範囲内にいる場合、敵の攻撃アニメーションをする
(ch.plx < enemyx && ch.plx + 100 > enemyx)) &&
((ch.ply > enemyy && ch.ply < enemyy + 40) ||
(ch.ply < enemyy && ch.ply + 40 > enemyy))) == 1)
{
damagetime++;
dusicounter++;
tekiatk = 1;
if ((enemyx > ch.plx))
{
DrawGraph((enemyx-91) - camerax, enemyy, dusiimage[dusii], FALSE);//(前から)敵の攻撃アニメーション
dusii = 0 + (dusicounter % 60) / 20;
}
if ((enemyx < ch.plx))
{
DrawGraph((enemyx+100) - camerax, enemyy , dmaeimage[dmaei], FALSE);//(後ろから)敵の攻撃アニメーション
dmaei = 3 + (dusicounter % 60) / 20;
}
}
}