2012-01-12 8 views
3

私は、フレームの幅、高さ、行、列、およびフレーム数を与えることによって、アニメーションスプライトシートのフレームのX座標とY座標を取得する方法を理解しようとしています。それから、frameNumberが与えられた行と列の番号を返すようにします。Java Game Dev:行と列によるスプライトシートフレーム?

frameNumber % rowsを実行するだけで列番号(int[][]で表される行と列を考えるとわかります)が得られることがわかりましたが、どのようにするのが難しいですか行番号を取得します。何か案は?

答えて

4

あなたはcolsの列を持っている場合、あなたは、単に使用することができます。

用途:あなたは1000のcolsを持っており、フレーム番号3989をしたい場合は

row = Math.floor(frameNumber/cols); 
col = frameNumber % cols; 

ので、それはあなたを与えるだろう:

行を= 3; col = 989;

frameX = ((frameNumber - 1) % columns) * frameWidth; 

    frameY = ((frameNumber - 1)/columns) * frameHeight; 

なお:あなたが欲しいの幅と高さがありますどのように多くのフレームの行あたりのフレーム、の、そしてどのフレームをわかっている場合

+0

私はこれについて考えましたが、確かではありませんでした.Math.floor演算は、数値が次の最大整数に近い場合でも最も近い完全整数に切り捨てられますか?同様に1.99999は1になりますか? –

+0

はい、常にフロアです。この場合、なぜそれが必要なのですか。 (実際にはモジュロの/ではない) – Niko

1

は、x、y座標を取得するよりも、非常に簡単です「/」操作は、あなたが残りを必要とするようXを得るために四捨五入されるように、int型短い、またはバイト部門でなければならず、どこかとは対照的に、Yは、フレームのを開始の座標途中で。

これらの式は、フレームが左から右に、次に上から下に行くスプライトシート用です。あなたはそれ他の方法で回避したい場合は、単に「%」と「/」演算子、および「行」に変更「列」を切り替えるより:

frameX = ((frameNumber - 1)/rows) * frameWidth; 

    frameY = ((frameNumber - 1) % rows) * frameHeight; 

これはまた、あなたのフレームを参照されることを想定していますより、

また
frameX = (frameNumber % columns) * frameWidth; 

    frameY = (frameNumber/columns) * frameHeight; 
    //assuming that frameNumber indexes from 0; 

、あなただけのフレームがどの列や行を知りたい場合は: - 「1」部分削除することができますが、あなたが代わりにインデックス彼らはより、0から始まる場合は、1から始まります'* frameWidth'と '* frameHeight'部分を削除すると、0から始まる行と列のインデックスが返されます:

frameX = (frameNumber - 1) % columns; 

    frameY = (frameNumber - 1)/columns; 

希望すると便利です。
Zistack

+0

frameYを見つける部分が正しいとは思わないが、ちょうど10進数で終わる。 –

+0

私が言ったように、それは小数点が切り捨てられるようにint、byte、またはlong divisionでなければなりません。それでも問題が解決しない場合は、式全体を前述のタイプのいずれかに戻してください。 – Zistack

+0

申し訳ありませんが、私はこの回答が混乱していると思いますので、私はそれをdownvoteする必要があります。 –