はじめまして。大変お世話になっています。初心者です。
EnemyPattarnの円運動を参考にして、
左上から右下へ向かい中央で円運動して左斜め下へ
向かうとか、数パターン作ってみたんですが、
Enemyの画像が宇宙船タイプなので、
Enemyが常に下を向いているのでは違和感を感じます。
進行方向を向く方法のアドバイスをお願いします。
敵の画像を進行方向に向けたい
Re:敵の画像を進行方向に向けたい
DrawRotaGraph関数を使うと良いと思います。
http://homepage2.nifty.com/natupaji/DxL ... html#R3N10
移動量を角度で求めている場合は話は早いですが、
移動量をベクトルで求めている場合は、atan2などの関数で
角度に変換する必要があるかもしれません。
http://homepage2.nifty.com/natupaji/DxL ... html#R3N10
移動量を角度で求めている場合は話は早いですが、
移動量をベクトルで求めている場合は、atan2などの関数で
角度に変換する必要があるかもしれません。
Re:敵の画像を進行方向に向けたい
MNSさん、ありがとうございます。
atan2ですか。
敵弾の場合はplayer.x,player.yがあるので
atan2が使えますが、enemyの場合は目標がありません。
出現時の角度は分かっているので、それ以降は10個古い座標を
記憶して一番遠い座標といまの座標でatan2を求めればいいのかと
考えいろいろやってみましたが、記憶の仕方が悪いのか、
考え方自体が悪いのか、結果が出ませんでした。
atan2を使う方向で試行錯誤してみたいと思います。
今回は弱音を吐くのが早すぎたようです。
ありがとうございました。
atan2ですか。
敵弾の場合はplayer.x,player.yがあるので
atan2が使えますが、enemyの場合は目標がありません。
出現時の角度は分かっているので、それ以降は10個古い座標を
記憶して一番遠い座標といまの座標でatan2を求めればいいのかと
考えいろいろやってみましたが、記憶の仕方が悪いのか、
考え方自体が悪いのか、結果が出ませんでした。
atan2を使う方向で試行錯誤してみたいと思います。
今回は弱音を吐くのが早すぎたようです。
ありがとうございました。
Re:敵の画像を進行方向に向けたい
敵の移動量はどうやって求めているのでしょうか?
例えば、敵が斜め右下に移動する場合、
ベクトルで移動量を求めるとすると、
enemy.x += 1;
enemy.y += 1;
などとやることになりますが、
この時の角度は、atan2(1,1)で求めることができます。
角度で求める場合は、
double theta = 4.7123889803846898576939650749193;
enemy.x += cos(theta);
enemy.y += sin(theta);
で移動量が求められますが、
この場合はこのthetaをそのまま使えばいいです。
(DrawRotaGraph関数で使う場合は、角度に90度分のラジアンを足す必要があります)
例えば、敵が斜め右下に移動する場合、
ベクトルで移動量を求めるとすると、
enemy.x += 1;
enemy.y += 1;
などとやることになりますが、
この時の角度は、atan2(1,1)で求めることができます。
角度で求める場合は、
double theta = 4.7123889803846898576939650749193;
enemy.x += cos(theta);
enemy.y += sin(theta);
で移動量が求められますが、
この場合はこのthetaをそのまま使えばいいです。
(DrawRotaGraph関数で使う場合は、角度に90度分のラジアンを足す必要があります)
Re:敵の画像を進行方向に向けたい
MNSさん、ありがとうございます。
ここで勉強させてもらっていますので
enemy.x += 1;
enemy.y += 1; です。
サンプルのプログラムでは
enemy.vx = 1;
enemy.vy = 1;
enemy.x += enemy.vx;
enemy.y += enemy.vy;
となっているので
atan2(enemy.vy, enemy.vx)
というかんじでしょうか。
さっそく試してみたいと思います。
ありがとうございました。
ここで勉強させてもらっていますので
enemy.x += 1;
enemy.y += 1; です。
サンプルのプログラムでは
enemy.vx = 1;
enemy.vy = 1;
enemy.x += enemy.vx;
enemy.y += enemy.vy;
となっているので
atan2(enemy.vy, enemy.vx)
というかんじでしょうか。
さっそく試してみたいと思います。
ありがとうございました。
Re:敵の画像を進行方向に向けたい
さっそくやってみました。
void enemy_enter(){ の下のほうにある
// enemy.vx = 0;
// enemy.vy = 0;をコメントアウトして
enemy.ang = 0;を
enemy.ang = atan2(enemy.vy,enemy.vx);
としたら、やはり
enemy.vx = 0;
enemy.vy = 0; は必要なようなので
void enemy_act()関数の中へ移動しました。
結果は、確かに移動中に向きが変わりました。
まだ完全ではないのでMNSさんのアドバイスを
参考にして詰めていきたいと思います。
void enemy_enter(){ の下のほうにある
// enemy.vx = 0;
// enemy.vy = 0;をコメントアウトして
enemy.ang = 0;を
enemy.ang = atan2(enemy.vy,enemy.vx);
としたら、やはり
enemy.vx = 0;
enemy.vy = 0; は必要なようなので
void enemy_act()関数の中へ移動しました。
結果は、確かに移動中に向きが変わりました。
まだ完全ではないのでMNSさんのアドバイスを
参考にして詰めていきたいと思います。
Re:敵の画像を進行方向に向けたい
そちらでどのようなコードを書いていらっしゃるかわからないのですが、
ひよこさんの言うとおり、atan2(enemy.vy, enemy.vx)などで求めればよいと思います。
どうやら、ang という変数がenemy構造体にあるようですね。
恐らく、ひよこさんは初期化の段階で角度を求めようとされたと思うんですが、
特に、「左上から右下へ向かい中央で円運動して左斜め下へ 向かう」
などの動きは、時間によってenemy.vx,vyの値が変わってくるはずです。
その値を決める処理が書かれているところで、一緒にangの値を求めればいいと思います。
描画方法は、
DrawRotaGraph(enemy.x, enemy.y, 1.0, enemy.ang + 1.57, enemy.img, TRUE);
のような感じで行えば良いでしょう。
頑張ってください。
ひよこさんの言うとおり、atan2(enemy.vy, enemy.vx)などで求めればよいと思います。
どうやら、ang という変数がenemy構造体にあるようですね。
恐らく、ひよこさんは初期化の段階で角度を求めようとされたと思うんですが、
特に、「左上から右下へ向かい中央で円運動して左斜め下へ 向かう」
などの動きは、時間によってenemy.vx,vyの値が変わってくるはずです。
その値を決める処理が書かれているところで、一緒にangの値を求めればいいと思います。
描画方法は、
DrawRotaGraph(enemy.x, enemy.y, 1.0, enemy.ang + 1.57, enemy.img, TRUE);
のような感じで行えば良いでしょう。
頑張ってください。
Re:敵の画像を進行方向に向けたい
シューティングゲームの館の円運動をさせるをちょっとアレンジして
//=====================================================================
// 斜め右下へ途中で円を描いて左斜め下へ
//=====================================================================
void enemy_pattern11(int i){
int t=enemy.cnt;
if(t<360){
enemy.vx=1.0f;
enemy.vy=1.0f;
}
if(t>=360 && t<600){
enemy.vx=float(sin(PI*(t-320.0f)/160.0f)*1.2f);//300
enemy.vy=float(sin(PI*(t-240.0f)/160.0f)*1.2f);//240
}
if(t >= 600){
enemy.vx = -1.0f;
enemy.vy = 1.0f;
}
}
これを龍神録プログラミングの館のenemy_act_patternに加えました。
enemy.cppの
//敵の行動制御
void enemy_act(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy.flag==1){//その敵のフラグがオンになってたら
if(0<=enemy.pattern && enemy.pattern<ENEMY_PATTERN_MAX) {
enemy_pattern[enemy[i].pattern](i);
//ここにatan2をいれた
enemy[i].ang =atan2(enemy[i].vy, enemy[i].vx);
// enemy[i].vec.x+=cos(enemy[i].ang)*enemy[i].sp;
// enemy[i].vec.y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].vec.x+=enemy[i].vx;
enemy[i].vec.y+=enemy[i].vy;
enemy[i].cnt++;
//敵が画面から外れたら消す
if(enemy[i].vec.x<FLD_X-en_w || FLD_X+FLD_W<enemy[i].vec.x ||
enemy[i].vec.y<FLD_Y-en_h || FLD_Y+FLD_H<enemy[i].vec.y)
enemy[i].flag=0;
if(enemy[i].bltime == enemy[i].cnt)
enter_shot(i);
}
}
}
}
結果は、大成功です。見事に進行方向を向いたまま
回転しました。
たいへんありがとうございました。
//=====================================================================
// 斜め右下へ途中で円を描いて左斜め下へ
//=====================================================================
void enemy_pattern11(int i){
int t=enemy.cnt;
if(t<360){
enemy.vx=1.0f;
enemy.vy=1.0f;
}
if(t>=360 && t<600){
enemy.vx=float(sin(PI*(t-320.0f)/160.0f)*1.2f);//300
enemy.vy=float(sin(PI*(t-240.0f)/160.0f)*1.2f);//240
}
if(t >= 600){
enemy.vx = -1.0f;
enemy.vy = 1.0f;
}
}
これを龍神録プログラミングの館のenemy_act_patternに加えました。
enemy.cppの
//敵の行動制御
void enemy_act(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy.flag==1){//その敵のフラグがオンになってたら
if(0<=enemy.pattern && enemy.pattern<ENEMY_PATTERN_MAX) {
enemy_pattern[enemy[i].pattern](i);
//ここにatan2をいれた
enemy[i].ang =atan2(enemy[i].vy, enemy[i].vx);
// enemy[i].vec.x+=cos(enemy[i].ang)*enemy[i].sp;
// enemy[i].vec.y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].vec.x+=enemy[i].vx;
enemy[i].vec.y+=enemy[i].vy;
enemy[i].cnt++;
//敵が画面から外れたら消す
if(enemy[i].vec.x<FLD_X-en_w || FLD_X+FLD_W<enemy[i].vec.x ||
enemy[i].vec.y<FLD_Y-en_h || FLD_Y+FLD_H<enemy[i].vec.y)
enemy[i].flag=0;
if(enemy[i].bltime == enemy[i].cnt)
enter_shot(i);
}
}
}
}
結果は、大成功です。見事に進行方向を向いたまま
回転しました。
たいへんありがとうございました。