void move(double *lx,*ly)
{
double langle;
if(key[key_input_a]!=0){
langle=-pi/2;
}
if(key[key_input_d]!=0){
langle=pi/2;
}
if(key[key_input_w]!=0){
langle=pi*2;
}
if(key[key_input_a]!=0){
langle=pi;
}
if(~全てのキーのいずれかが押されているたら~)
{
*lx=cos(player.angle+langle)*player.speed;
*ly=sin(player.angle+langle)*player.speed;
}
}
[\code]
このコードだと、斜め移動ができません。
どうしたらいいでしょうか?
角度の合成がわかりません!
角度の合成がわかりません!
- aquashooting
- 記事: 67
- 登録日時: 13年前
Re: 角度の合成がわかりません!
>soodbtさん
コードタグで囲んだつもりなのでしょうが、機能していないのはなぜでしょうか?
もう一度確認してみてください。
私からみる質問の答えとしては
1:「pi」とは「円周率」のことなのか?
2:最後の条件式「if(key[key_input_a]!=0)」だったら「langle=-pi/2;」をしているのに
二回目に「langle=pi;」としているのはおかしいのではないのか?
3:「input_a」にある「a」はどういう意味でつけたのか?
この3つです。
コードタグで囲んだつもりなのでしょうが、機能していないのはなぜでしょうか?
もう一度確認してみてください。
私からみる質問の答えとしては
1:「pi」とは「円周率」のことなのか?
2:最後の条件式「if(key[key_input_a]!=0)」だったら「langle=-pi/2;」をしているのに
二回目に「langle=pi;」としているのはおかしいのではないのか?
3:「input_a」にある「a」はどういう意味でつけたのか?
この3つです。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 角度の合成がわかりません!
a d w aはキーボードの左手のとこのa d w sキーの間違いじゃないですかね?
PCのゲームでキーボードのときは結構使われますし。
PCのゲームでキーボードのときは結構使われますし。
Re: 角度の合成がわかりません!
現在進んでいる方向が、player.angleでスピードがplayer.speedに対し、w,d,a,z(sかな?)のキーを押して、
現在の進行方向に対し、0°、90°、-90°、180°のベクトルを合成したいということなのでしょうか?
角度を足しただけでは、大きさを加味していないので、加速や減速ができませんよ。
現在の進行方向に対し、0°、90°、-90°、180°のベクトルを合成したいということなのでしょうか?
角度を足しただけでは、大きさを加味していないので、加速や減速ができませんよ。
non
Re: 角度の合成がわかりません!
みなさんありがとうございます。
バックスラッシュになっていますね、言い訳させてもらうと
iPhoneだと自然にタップキーにあったので気づきませんでした。
以後気をつけます。
また、atan2という関数について、知ることができました。ありがとうございます。
ちなみに、やりたいことというのは全方位シューティングのキャラクターの移動制御です。
wasdというのは移動キーのことです。
つまり
自分のキャラの正面がどこを向いていても(正確にはキャラクターからみて右手から0ラジアンですが)
平行移動できる様にしたかった。
しかし、上記の自分のソースコードだと平行移動だけで同時押しによる斜め移動が出来ない。
そこで、入力されたキーに割り振られている角度を全て合成すれば良いのではないか
と考えました。
しかし、角度を合成するにはタンジェントを使えば良いのではないかとまでは分かっていたのですが・・・肝心の関数がわかりませんでした。
少し試行錯誤して成功したら改めて解決にしたいと思います。
バックスラッシュになっていますね、言い訳させてもらうと
iPhoneだと自然にタップキーにあったので気づきませんでした。
以後気をつけます。
また、atan2という関数について、知ることができました。ありがとうございます。
ちなみに、やりたいことというのは全方位シューティングのキャラクターの移動制御です。
wasdというのは移動キーのことです。
つまり
自分のキャラの正面がどこを向いていても(正確にはキャラクターからみて右手から0ラジアンですが)
平行移動できる様にしたかった。
しかし、上記の自分のソースコードだと平行移動だけで同時押しによる斜め移動が出来ない。
そこで、入力されたキーに割り振られている角度を全て合成すれば良いのではないか
と考えました。
しかし、角度を合成するにはタンジェントを使えば良いのではないかとまでは分かっていたのですが・・・肝心の関数がわかりませんでした。
少し試行錯誤して成功したら改めて解決にしたいと思います。
Re: 角度の合成がわかりません!
すいません、調子に乗りましたができませんでした。。
うまい具合に角度が合成できません。
今は8方向に角度を使った平行移動がしたいのですが、できません。
できたとしても、if文の8連発や6連発です。
どうしたらいいでしょうか?
うまい具合に角度が合成できません。
今は8方向に角度を使った平行移動がしたいのですが、できません。
できたとしても、if文の8連発や6連発です。
どうしたらいいでしょうか?
一応、もう2つxyを表すstatic変数を作って置いて、キーを押し続けている間増え続ける変数(管理人さんの関数コードのパクリです、ごめんなさい)から値を押されてる間だけ貰い続けて、加速する、ということを考えています。non さんが書きました:現在進んでいる方向が、player.angleでスピードがplayer.speedに対し、w,d,a,z(sかな?)のキーを押して、
現在の進行方向に対し、0°、90°、-90°、180°のベクトルを合成したいということなのでしょうか?
角度を足しただけでは、大きさを加味していないので、加速や減速ができませんよ。
Re: 角度の合成がわかりません!
こんな感じでしょうか?
void move(double *lx,*ly){
int x=0,y=0;
double angle=0;
if(key[key_input_w]!=0){
x++;
}
if(key[key_input_s]!=0){
x--;
}
if(key[key_input_d]!=0){
y++;
}
if(key[key_input_a]!=0){
y--;
}
if(x!=0 || y!=0){
angle=atan2(y,x);
*lx=cos(player.angle+angle)*player.speed;
*ly=sin(player.angle+angle)*player.speed;
}
else{
*lx=0;
*ly=0;
}
}