tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル円周上の座標の求め方
記事No11845
投稿日: 2008/03/21(Fri) 10:31
投稿者
少し数学的なものになってしまうかもしれませんが、困っていますので答えて頂ければ幸いです。

現在VB6.0でシューティングゲームを作っているのですが、その弾丸の記述についてです。

中点をXYとして弧を描いた弾丸を表示させたいのですが、どうしても上手くいきません。

現在の記述は、
円周率をPAI、XYから見た角度をNo、
円周上の座標=(cosθ,sinθ)なので、
Cos((No) * PAI / 180)
Sin((No) * PAI / 180)

Noを0 to 200としてForで回してそれぞれに座標を指定しました。

そしてXYから求めた座標(X,Y)にBitBltで表示させ、その後に、
X+改めて求めた座標のX
Y+改めて求めた座標のY
を記述して・・・・をForで繰り返して弧を描くような表示をさせようとしたのですが、
弧というよりは長方形の形になってしまいました。

綺麗に弧を描く弾丸を作るにはどうすればよいのでしょうか?

いくつか数学講座サイト等を参考にした結果が上記の状態なので、これ以上どうすれば良いのか分からず困っています。

どうぞご助力願います。

[ツリー表示へ]
タイトルRe: 円周上の座標の求め方
記事No11847
投稿日: 2008/03/21(Fri) 11:56
投稿者
> 現在の記述は、
> 円周率をPAI、XYから見た角度をNo、
> 円周上の座標=(cosθ,sinθ)なので、
> Cos((No) * PAI / 180)
> Sin((No) * PAI / 180)

計算で求められた値をDebug.Printなどで確認してみてください。
Cos関数やSin関数は -1 〜 1 の範囲の値を返すようになっています。
座標を求めるにはもう一手間必要です。

[ツリー表示へ]
タイトル緩やかに移動する弧の描き方
記事No11848
投稿日: 2008/03/21(Fri) 13:48
投稿者
> 計算で求められた値をDebug.Printなどで確認してみてください。
> Cos関数やSin関数は -1 〜 1 の範囲の値を返すようになっています。
> 座標を求めるにはもう一手間必要です。

早速の返信ありがとうございます。

確認をしてみると、
-0.358367945802948
-0.358367945802948
-0.358367945802948
といった数値が戻ってきました。
関連するヘルプを再度確認した結果、Cos・Sinの単位をラジアンのままにしていた事がげんいんではないかと思い、180/PAIを求めた値に掛けてみた所、何とか弧を描く動きになりました。(←この単位を度に戻すのが「もう一手間」という事でよろしいのでしょうか?)

本当にありがとうございました。

・・・しかし、今度はこの弧が高速で描かれるような描写になってしまいました。
この弧の移動を緩やかにしたいと思っているのですが、何か方法は無いでしょうか?
(変数を一つ作り、3カウントごとに座標の変数に値を入れるような記述をしてみたのですが、どうにも上手くいかず、また躓いてしまいました。)

度々の質問で申し訳ありませんが、こちらもどうぞご助力願います。

[ツリー表示へ]
タイトルRe: 緩やかに移動する弧の描き方
記事No11849
投稿日: 2008/03/21(Fri) 14:37
投稿者
> (←この単位を度に戻すのが「もう一手間」という事でよろしいのでしょうか?)

はい、その通りです。

> ・・・しかし、今度はこの弧が高速で描かれるような描写になってしまいました。
> この弧の移動を緩やかにしたいと思っているのですが、何か方法は無いでしょうか?
> (変数を一つ作り、3カウントごとに座標の変数に値を入れるような記述をしてみたのですが、どうにも上手くいかず、また躓いてしまいました。)

何も対処をしなければFor文が回るスピードで描画されるので高速になってしまいます。
3カウント程度ではほとんど変化が感じられないのではないかと思います。
もっと大きな値でカウントしてみては?

[ツリー表示へ]
タイトルRe^2: 緩やかに移動する弧の描き方
記事No11850
投稿日: 2008/03/21(Fri) 15:00
投稿者
> 何も対処をしなければFor文が回るスピードで描画されるので高速になってしまいます。
> 3カウント程度ではほとんど変化が感じられないのではないかと思います。
> もっと大きな値でカウントしてみては?

カウントを50に設定して、50カウントに達したら座標を変数に代入する記述をし、記述をし終わったら描写をするといったコードを組んでみました。

これにより当たり前ではありますが、一つの弧が形成される間隔は空きましたが、一つの弧の広がりの速度が速いままになってしまっています。
弧の広がりの速度をゆったりとさせるにはどうすればよいでしょうか?
(座標X,Yに値するCos,Sinの値を小さくさせればよいのでしょうが、(Cos()-10)などの記述をしては偏った弧になってしまいます。
CosとSinの値を小さくさせる、もしくは同じような効果を持つよい方法は無いでしょうか?)

[ツリー表示へ]
タイトルRe^3: 緩やかに移動する弧の描き方
記事No11851
投稿日: 2008/03/21(Fri) 15:11
投稿者
> カウントを50に設定して、50カウントに達したら座標を変数に代入する記述をし、記述をし終わったら描写をするといったコードを組んでみました。
>
> これにより当たり前ではありますが、一つの弧が形成される間隔は空きましたが、一つの弧の広がりの速度が速いままになってしまっています。

描画に使うカウントで間を取るのではなくて、
別の変数でカウントを取るようにしては?

For No = 0 To 200

    〜 計算・描画処理 〜

    For WaitCnt = 0 To 10000
        
    Next
Next

といった感じで。

[ツリー表示へ]
タイトルRe^4: 緩やかに移動する弧の描き方
記事No11852
投稿日: 2008/03/21(Fri) 16:31
投稿者
> 描画に使うカウントで間を取るのではなくて、
> 別の変数でカウントを取るようにしては?

その方法でも試してみたのですが、そうなると、他の処理(シューティングなので敵機の移動処理や自機の移動処理などがあります)も遅くなってしまうので・・・。

円の半径を今よりも小さくするような方法があればいいのですが、何かないでしょうか?
現在、自分でも三角関数の公式を調べ直したり、ForやIF等をつかってどうにかならないか試していますが、なかなか上手くいきません。

聞いている身で、条件が些か多すぎる感がしなくも無いですが、何かご助言頂ければ幸いです。

[ツリー表示へ]
タイトルRe^5: 緩やかに移動する弧の描き方
記事No11853
投稿日: 2008/03/21(Fri) 17:08
投稿者
> その方法でも試してみたのですが、そうなると、他の処理(シューティングなので敵機の移動処理や自機の移動処理などがあります)も遅くなってしまうので・・・。

自機の移動と弾の移動を同時に行うなら
弾の移動はTimerで行った方がいいですかね。

検索すればVBでシューティングゲームを作る解説を行っているサイトも
いろいろ出てきますからその辺は参考にできると思いますよ。

[ツリー表示へ]
タイトルありがとうございました。
記事No11854
投稿日: 2008/03/21(Fri) 17:15
投稿者
> 検索すればVBでシューティングゲームを作る解説を行っているサイトも
> いろいろ出てきますからその辺は参考にできると思いますよ。

はい、改めて参考に出来るサイトを検索してみようと思います。

琴様、長々と本当にありがとうございました。

[ツリー表示へ]