角度の合成がわかりません!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
soodbt

角度の合成がわかりません!

#1

投稿記事 by soodbt » 12年前

コード:

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: 角度の合成がわかりません!

#2

投稿記事 by aquashooting » 12年前

>soodbtさん
コードタグで囲んだつもりなのでしょうが、機能していないのはなぜでしょうか?
もう一度確認してみてください。

私からみる質問の答えとしては
1:「pi」とは「円周率」のことなのか?

2:最後の条件式「if(key[key_input_a]!=0)」だったら「langle=-pi/2;」をしているのに
二回目に「langle=pi;」としているのはおかしいのではないのか?

3:「input_a」にある「a」はどういう意味でつけたのか?

この3つです。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 角度の合成がわかりません!

#3

投稿記事 by Dixq (管理人) » 12年前

私も _a _d _w _aの意味が良く分かりませんが、やりたい事は解りました。以下のようなプログラムはどうでしょう?

コード:

int x=0, y=0;
if( 左キーが押されている ){
    x--;
}
if( 右キーが押されている ){
    x++;
}
if( 上キーが押されている ){
    y--;
}
if( 下キーが押されている ){
    y++;
}
if( x!=0 || y!=0 ){
    angle = atan2(y,x);
}

hidden

Re: 角度の合成がわかりません!

#4

投稿記事 by hidden » 12年前

a d w aはキーボードの左手のとこのa d w sキーの間違いじゃないですかね?
PCのゲームでキーボードのときは結構使われますし。

non
記事: 1097
登録日時: 13年前

Re: 角度の合成がわかりません!

#5

投稿記事 by non » 12年前

現在進んでいる方向が、player.angleでスピードがplayer.speedに対し、w,d,a,z(sかな?)のキーを押して、
現在の進行方向に対し、0°、90°、-90°、180°のベクトルを合成したいということなのでしょうか?
角度を足しただけでは、大きさを加味していないので、加速や減速ができませんよ。
non

soodbt

Re: 角度の合成がわかりません!

#6

投稿記事 by soodbt » 12年前

みなさんありがとうございます。
バックスラッシュになっていますね、言い訳させてもらうと
iPhoneだと自然にタップキーにあったので気づきませんでした。
以後気をつけます。

また、atan2という関数について、知ることができました。ありがとうございます。

ちなみに、やりたいことというのは全方位シューティングのキャラクターの移動制御です。
wasdというのは移動キーのことです。
つまり
自分のキャラの正面がどこを向いていても(正確にはキャラクターからみて右手から0ラジアンですが)
平行移動できる様にしたかった。
しかし、上記の自分のソースコードだと平行移動だけで同時押しによる斜め移動が出来ない。
そこで、入力されたキーに割り振られている角度を全て合成すれば良いのではないか
と考えました。
しかし、角度を合成するにはタンジェントを使えば良いのではないかとまでは分かっていたのですが・・・肝心の関数がわかりませんでした。

少し試行錯誤して成功したら改めて解決にしたいと思います。

soodbt

Re: 角度の合成がわかりません!

#7

投稿記事 by soodbt » 12年前

すいません、支離滅裂な発言になっていますがうまく解読して読んでください。申し訳ない;;

soodbt

Re: 角度の合成がわかりません!

#8

投稿記事 by soodbt » 12年前

すいません、調子に乗りましたができませんでした。。
うまい具合に角度が合成できません。
今は8方向に角度を使った平行移動がしたいのですが、できません。
できたとしても、if文の8連発や6連発です。
どうしたらいいでしょうか?
non さんが書きました:現在進んでいる方向が、player.angleでスピードがplayer.speedに対し、w,d,a,z(sかな?)のキーを押して、
現在の進行方向に対し、0°、90°、-90°、180°のベクトルを合成したいということなのでしょうか?
角度を足しただけでは、大きさを加味していないので、加速や減速ができませんよ。
一応、もう2つxyを表すstatic変数を作って置いて、キーを押し続けている間増え続ける変数(管理人さんの関数コードのパクリです、ごめんなさい)から値を押されてる間だけ貰い続けて、加速する、ということを考えています。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: 角度の合成がわかりません!

#9

投稿記事 by Tatu » 12年前

こんな感じでしょうか?

コード:

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;
	}
}

soodbt

Re: 角度の合成がわかりません!

#10

投稿記事 by soodbt » 12年前

おーー!
まさに理想的なコードです。
ありがとうございました!

soodbt

Re: 角度の合成がわかりません!

#11

投稿記事 by soodbt » 12年前

解決とさせてもらいます!

閉鎖

“C言語何でも質問掲示板” へ戻る