スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【コード】整数型の絶対値を求める

整数型に対応している絶対値を求める関数・・・
<cstdlib> をインクルードすると使える std::abs(std::labs)。
int 版と、long 版(std::labs)があります。


浮動小数点型に対応している絶対値を求める関数・・・
<cmath> をインクルードすると使える std::abs(std::fabs)。
float 版、double 版、long double 版があります。


これを使えば絶対値を求めれるのでわざわざ記事を作るほどでもないんですが、
せっかくなので整数型の絶対値を求める関数を作成しておこうということで記事を書きました。

//*******************************************
// 絶対値を取得する
// 第一引数 : 取得したい絶対値
// 戻り値 : 絶対値
//*******************************************
template<typename T>T MyAbs(T Val)
{
return (Val^(Val>>31)) - (Val>>31);
}

//*******************************************
// 絶対値を取得する
// 第一引数 : 値1
// 第二引数 : 値2
// 戻り値 : 値1と値2の絶対値
//*******************************************
template<typename T>T MyAbs(T Val1, T Val2)
{
T wTemp = Val1 - Val2;
return (wTemp^(wTemp>>31)) - (wTemp>>31);
}

わざわざ template を使う必要は有りませんが、なんとなく使ってみました。
記事にしといてなんですが、これはあまり良くないかもしれません。
素直に int 型、long 型等で分けた方がいい気がします。


使い方は MyAbs(30, 50) のように引数を二つ取る形のもの。
もう一つは MyAbs(10-80) のように計算式を渡すものの二つを用意しました。
上は20、下は70という具合に、どちらも戻り値に絶対値が返って来るようになってます。

あくまで整数型での絶対値ですので浮動小数点型の絶対値は求まりません。
MyAbs(5.2-3.1) とかやろうとしてもエラーが出ます。



2の補数表現を使った方法なのでもしかすると対応していない処理系があるかもしれませんが
少なくとも Visual C++ 2008 Express Edition ではそのような事はありませんので採用しました。
ビット演算を使って求める分、早いのかな~なんて思いますがあんま気にしてません。


当たり判定表示

自機に当たり判定の画像を付けたので画像としてアップしました。
薄くて見難いですが、白い丸の内側に青い丸が表示されててそこが当たり判定になります。
もっと見易く濃い色を付ける予定なので今はこんなもんです。

低速移動中に表示させる方がいいのか、常時表示させとく方がいいのか悩ましい所です。

今は低速移動中のみ表示させてるのですが、一瞬で消えたり表示されたりするので
す~っと浮かび上がるような処理に変える必要があるかもしれません。
いきなり出てくるとやっぱ違和感がありますのでまたこの辺は後で対応したいなと思います。



新アニメが徐々に放送されるようになり、楽しみで仕方ありません。
今の所、カンピオーネ!、貧乏神が!、TARI TARI は見ました。
アルカナファミリアも見たいので今度時間あったら見ようと思います。
楽しみであります。

とりあえず、クロノストーンは超展開超次元過ぎて時空の話とかは雰囲気で楽しんでるくらいになりました。
信長とマキシミックスとかどういうことよwww

ベータが可愛い。
化身出す時の声の変わり具合がたまらん・・・
アームドは何回見ても聖闘士星矢だ・・・。

だが、楽しみだ。
無理だろうけど初代のキャラと今のキャラ達とでサッカーの試合とかやって欲しい。

そんな感じでアニメも堪能しつつ日々過ごしてます。
既に予兆始まってるけど・・・暫く更新止るなこれは・・・。

この記事へのコメント

- Ui - 2012年07月05日 22:50:05

私も前作りましたねw
今は普通に整数型にラップしちゃいましたけど。

- DVDM♪管理人♪ - 2012年07月06日 02:38:23

>> Uiさん
全然 template の恩恵を受けていませんし、
どの道整数型にしか使えないので
std::abs(std::labs) のように、INT型やLONG型で多重定義すればよかったなと思います。
と言う訳で、自分の方は変更しました(笑)

- ペン猫 - 2012年07月06日 03:50:13

C++使ってたころなつかしい!
型の変換や絶対値求めたりと必要な時が来ますよねw

当たり判定○にしましたかw
弾も丸いのでそれがいいかもしれませんね。
自分も当たり判定の○を作ろうかなって思ってます。

また来ます~ノシ

- DVDM♪管理人♪ - 2012年07月06日 19:47:54

>> ペン猫さん
コレに関して言えば template を使う必要性は全くありませんね;
まぁ絶対値を求めるのが必要になる時はどこかで来ますね。
元からある関数を使うと便利なんで代用してしまってもいいと思いますけどね;


当たり判定は今の所矩形同士です。
丸のオブジェクトの中で矩形の判定を行ってます。

とりあえず回転しない矩形と言う前提の話なので
弾のように、回転するようなオブジェクトはどうしようかなと言う感じです。
ごり押しで矩形にするのも有りですし、回転しても形が変わらない円形も有りですし、
ちょっと計算式を増やして外積、内積を使ってきちんと画像に沿った当たり判定にするもいいですし・・・。


当たり判定の回数を減らすための工夫も考えないといけないので
当たり判定は奥が深いです(笑)

トラックバック

URL :

検索フォーム
プロフィール

DVDM

Author:DVDM
自作ゲームの開発過程ブログ。
赤髪愛なら誰にも負けない。

 
Pixiv バナー


ブロとも申請フォーム
最新記事
カテゴリ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
ブロとも一覧
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。