とりあえず、atan2も内部でsinやcos使ってたと思うので結構重いです。
そっちもテーブル化してしまうほうが処理速度は稼げます。
static const int atanTable[/url] =
{
0, 40, 81, 122, 162, 203, 244, 285,
325, 366, 407, 447, 488, 529, 569, 610,
651, 691, 732, 772, 813, 853, 894, 934,
974, 1015, 1055, 1096, 1136, 1176, 1216, 1256,
1297, 1337, 1377, 1417, 1457, 1497, 1537, 1576,
1616, 1656, 1696, 1735, 1775, 1814, 1854, 1893,
1933, 1972, 2011, 2051, 2090, 2129, 2168, 2207,
2246, 2285, 2323, 2362, 2401, 2439, 2478, 2516,
2555, 2593, 2631, 2669, 2708, 2746, 2784, 2821,
2859, 2897, 2935, 2972, 3010, 3047, 3084, 3122,
3159, 3196, 3233, 3270, 3307, 3343, 3380, 3416,
3453, 3489, 3526, 3562, 3598, 3634, 3670, 3706,
3742, 3777, 3813, 3848, 3884, 3919, 3954, 3989,
4024, 4059, 4094, 4129, 4164, 4198, 4233, 4267,
4301, 4335, 4369, 4403, 4437, 4471, 4505, 4538,
4572, 4605, 4638, 4671, 4704, 4737, 4770, 4803,
4836, 4868, 4901, 4933, 4965, 4997, 5029, 5061,
5093, 5125, 5156, 5188, 5219, 5251, 5282, 5313,
5344, 5375, 5406, 5436, 5467, 5497, 5528, 5558,
5588, 5618, 5648, 5678, 5708, 5738, 5767, 5797,
5826, 5855, 5884, 5913, 5942, 5971, 6000, 6028,
6057, 6085, 6114, 6142, 6170, 6198, 6226, 6254,
6282, 6309, 6337, 6364, 6391, 6419, 6446, 6473,
6500, 6527, 6553, 6580, 6606, 6633, 6659, 6685,
6711, 6737, 6763, 6789, 6815, 6841, 6866, 6892,
6917, 6942, 6967, 6992, 7017, 7042, 7067, 7092,
7116, 7141, 7165, 7190, 7214, 7238, 7262, 7286,
7310, 7333, 7357, 7381, 7404, 7428, 7451, 7474,
7497, 7520, 7543, 7566, 7589, 7611, 7634, 7657,
7679, 7701, 7724, 7746, 7768, 7790, 7812, 7833,
7855, 7877, 7898, 7920, 7941, 7963, 7984, 8005,
8026, 8047, 8068, 8089, 8109, 8130, 8151, 8171,
};
int atan2_(int x, int y) {
if (x == 0) return 0;
return atanTable[(int)(((long long)y << 8) / x)];
}
int atan1_(int x, int y) {
if (x == y) return (1 << 13);
if (y > x) return (1 << 14) - atan2_(y, x);
return atan2_(x, y);
}
int atan0_(int x, int y) {
if (x < 0) return atan1_(y, -x) + (1 << 14);
return atan1_(x, y);
}
/*!
* @brief atanを求める
*/
int myatan(int x, int y)
{
if (x == 0 & y == 0) {
return 0;
}
if (y < 0) {
return (atan0_(-x, -y) + (1 << 15)) >> 6;
}
return atan0_(x, y) >> 6;
}
int shotatan2(int n){
const int x = ch.x - enemy[shot[n].num].x;
const int y = ch.y - enemy[shot[n].num].y;
return myatan(x, y);
}
>shot[n].bullet.x += (float)((long long)mycos(angle) * (long long)shot[n].bullet.spd >> 16);
>の部分を
>shot[n].bullet.x +=mycos(shot[n].bullet.angle) * shot[n].bullet.spd /65536;
>のように戻してみたところ自機を狙うようになり、所望の動作が得られました。
shot[n].bullet.spdがfloatだからですね。shot[n].bullet.xもfloatだし。
浮動小数を使うとビット演算子は使用できないので、個人的には座標もスピードも固定小数推奨ですが
作りが多少面倒になるし、/ 65536で処理速度として問題なければ、今のままでもいいと思います。