進捗どうですかの会-1回目 by森元

いままで更新を一切しなかったので報告を

タイトル  :新入社員よ社畜となれ
プラットフォーム:Android iOS
ジャンル    :横スクロールアクション
テーマ     :時間
コンセプト   :時間+就活
ターゲット :男子中高生

2015/04/02
せっかくなので自分たちに当てはまるものを入れた企画を考える

2015/04/03
即日決まったのでゲーム制作に取り掛かる

内容:新入社員となったプレイヤーを誰よりも早く出勤させるというのが目的

操作:タッチ&スワイプをシンプルに

スコア:ゴールタイム

2015/04/04
決まっていた点から作成開始
ロゴ、タイトル、ゲームプレイ、リザルトの作成
自機の移動、タイムを実装

2015/04/06
ジャンプの実装

2015/04/07
障害物、あたり判定の実装

2015/04/09
ジャンプの改善
リザルトでのスコア表示

今後の予定
・BGM・効果音の実装
・リザルト画面の改善
・ランキング、遊び方を実装

トライデントコンピュータ専門学校卒業制作展2014

当ゼミでは、 **トライデントコンピュータ専門学校卒業制作展2014** にて発表と展示を行います。

– 日時:2014年2月13日(金)
– 10:00~12:00 ゲームサイエンス学科及びゲーム制作研究科卒業制作発表
– 13:00~16:00 卒業制作作品展示
– 場所:トラインデントコンピュータ専門学校3階 F31教室

## 当ゼミの発表内容

| グループ名 | タイトル       | テーマ |
|:———————–|:——————-|:————————————-:|
| KGG Maid | ぜったいぜつメイド2 | Android端末+PHPサーバーを使ったオンライン2Dシミュレーションゲーム |
| 酔餃子 | Survivor | Unityベースのスマホ向けマルチプラットフォーム3Dアクションゲーム |
| KNK Project | MASHBASE | FuelPHPサーバーとCocos2d-xを使ったオンラインスマホ向けマルチプラットフォーム ディフェンスゲーム |
| おとさナイトプロジェクト | おとさナイト | Bluetoothを使ったiOS4人対戦アクションゲーム |

みなさまのご来場をお待ちしております。

cocos2d-x 3.0 シーンの切り替え

トライデントコンピュータ専門学校
ゲームサイエンス学科3年の福島です。

今回はシーンの切り替えについて書いていきたいと思います。

##シーンの切り替え方
1.切り替えるシーンの作成
    ↓
2.シーンの切り替え関数の呼び出し

これが大まかな流れになっています。

この処理を実際にプログラミングしていきます。

##1.切り替えるシーンの作成

[cpp]

// タイトルシーンへ移動
// タイトルシーンを生成
Scene* scene = Title::createScene();

[/cpp]

##2.シーンの切り替え関数の呼び出し

[cpp]

// ディレクターの取得
auto director = Director::getInstance();

// シーン切り替え
director->replaceScene(scene);

[/cpp]

上手くいくとシーンが切り替わります。

ここまでがゲーム制作に必ず必要な知識です。
今まで紹介したことを使うと簡単なスマートフォン向けのゲームを作ることができます。

次回からは、スマートフォン向けのゲームを制作し、その過程を書いていきたいと思います。

enchant.jsでゲームを作る 9leap編

トライデントコンピュータ専門学校 ゲームサイエンス学科3年の森です。
私はenchant.jsをJavaScriptの勉強もかねて学んで行こうと思います。

前回のブログに書きましたが、9leapに自作のゲームを投稿しました。
今回は9leapへの投稿の方法や、投稿したゲームの中身について書きます。
ゲームは[ここ](http://9leap.net/games/4105)にあります。

##9leap
まず、9leapへの投稿はソースなどを一まとめしたzipファイルを直接投稿することができます。
特に9leapの機能を使わないのなら。
・ゲームデータのzipファイル
・サムネイル用画像
の二つだけ用意すればOKです。

だがしかし、プラグインの一つである「nineleap.enchant.js」を導入すれば、簡単に9leapの機能が使用できるようになります。
機能としては、「スコア機能」「ゲームスタート, ゲームオーバー画像表示」の二つになります。
今回は使いませんが、これを前提条件としたプラグインに「witter のユーザ情報を取得する[twitter.enchant.js]」「Twitterアカウントを使ってログインしているユーザについて、セーブデータを保存する[memory.enchant.js]があります。

nineleap.enchant.jsの使い方の説明。
index.html内のenchant.jsを読み込んでいるところあたりに
[code language=”html”]
<script type="text/javascript" src="./enchant.js"></script> //enchant.js
<script type="text/javascript" src="./nineleap.enchant.js"></script> //9leap(これを書く)
<script type="text/javascript" src="./main.js"></script> //main
[/code]
と書きます。
さらに、main.jsの方のゲームが終わるところ(ゲームクリアorゲームオーバー)に
[code language=”javascript”]
game.end(score, ‘スコア=’+score +’点’); //表示例:「スコア=80点」
[/code]
と書き加える。

そうすると、ゲーム開始時にゲームスタート画像が表示がされ、game.endが呼ばれた際にゲームオーバー画像を自動で表示されるようになる。
注意:imageフォルダ内に[end.png][start.png]が必要になる

##ゲームの説明
ゲームの説明としては。
車に当たらないように階段まで進み、何階層まで到達できるかな?というゲームです。(死んだ際に居る階層がスコアとして残る)
このゲームに組み込んだ機能としては、自動MAP生成機能がメインでになります。
そもそも自動MAP生成のプログラムを作ってから、どうやってゲームにするか考えた物が、このゲームです。
小さな機能として、車が左手の法則で進みます。

今回は[こちらのサイト](http://d.hatena.ne.jp/yaneurao/20130125)のドルアーガの塔方式を見て自分で同じ方式で作ってみました。(他の自動MAP生成の方法も色々のっているので、興味のある人は見てみては?)

上記のサイトではとても詳しく書かれていますが、自分は簡単に「棒倒しの連続ですればいいんじゃね?」と考え複雑な部分はすべて捨てて考えました。
つまり、1を棒と見たとき
[0,0,0,0,0,0,0]
[0,1,0,1,0,1,0]
[0,0,0,0,0,0,0]
[0,1,0,1,0,1,0]
[0,0,0,0,0,0,0]
と交互に棒があるとして、1の四方上下左右のどこか一方の0を1に置き換える。をすべての棒に行えば良い(カンタン!


[0,1,0,0,0,0,0]
[0,1,1,1,0,1,0]
[0,0,0,1,0,1,0]
[1,1,0,1,1,1,0]
[0,0,0,0,0,0,0]
みたいな感じになる。
注意
①この方式だと外枠がない
②棒の斜めの位置には100%棒が来ない

この考えを元に私が書いたプログラムがこちら
[code language=”javascript”]
var blocks = [
[130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],

[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],

[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,131, 1,130],
[130, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,130],
[130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130]
];
var flagBlock=true;
for(var i=0; i<29; i++){
for(var j=0; j<31; j++){
if(blocks[i][j] == 131){
while(flagBlock==true){
var rand = Math.floor(Math.random() *10);
if(rand%2==0){
//上下
rand = Math.floor(Math.random() *10);

if(rand%2==0){
//上
if(blocks[i-1][j] != 130){
blocks[i-1][j] = 130;
flagBlock=false;
}
} else {
//下
if(blocks[i+1][j] != 130){
blocks[i+1][j] = 130;
flagBlock=false;
}
}
} else if(rand%2==1){
//左右
rand = Math.floor(Math.random() *10);

if(rand%2==0){
//左
if(blocks[i][j-1] != 130){
blocks[i][j-1] = 130;
flagBlock=false;
}
} else {
//右
if(blocks[i][j+1] != 130){
blocks[i][j+1] = 130;
flagBlock=false;
}
}
}
}
flagBlock=true;
}
}
}
//壁部分を木の画像にする
for(var i=0; i<29; i++){
for(var j=0; j<31; j++){
if(blocks[i][j] == 130){
blocks[i][j] = 131;
}
}
}

//実際にMap生成
var map = new Map(16, 16);
map.image = game.assets["./img/map1.png"];
map.loadData(blocks);
[/code]
ちょっと解説
131とは木の画像を表しており、私のゲームでは木=壁となっています。
1は芝生の画像を表しています
130と指定してある理由は、131を探して四方に~と言う書き方をしているので、一旦131以外の数字で誤魔化しているためです。

こうやってMAPを生成した後。車の配置と、ゴールの配置を行います。
ここで一つ問題が起こります。
スタート位置は左上に固定していますが、ゴール位置はランダムで配置しているため、左上からゴールまで行くためのルートがない可能性が生まれてしまいました。
私はそれを防ぐために、ゴールの配置の後スタートまでに、左上からゴールまで行くためのルートを調べて。
スタートしても良いかどうかをチェックしています。

方法としては、初めに左上をチェックしておき、次からはチェックしてあるマスの四方のマスでチェックしていないマスでかつ木があるマスでもないマスをチェックしていく。これを「ゴールがあるマスにチェックが入るか」「前の状態から1つもチェックが入らなかった」の条件に入るまで繰り返すと言う方法を取っています。

後は、「自キャラが木があるマスに入らない」「自キャラがハートに当たるとHP回復」「自キャラがNPCに当たるとHP減少」「自キャラがゴールのあるマスに入ると初期化してステージ番号と敵を一つ増やす」といった処理をしてゲームができています。

色々試行錯誤しながら作ったのでソースは正直きれいではありませんが、興味のある方は9leapの下のほうに「このゲームをzip形式でダウンロード」という所からダウンロードできます。

enchant.jsでゲームを作る  サンプルプログラム集

トライデントコンピュータ専門学校 ゲームサイエンス学科3年の森です。
私はenchant.jsをJavaScriptの勉強もかねて学んで行こうと思います。

これまで横スクロールアクションゲームもどきを作りましたが。
目移りしてしまい、別のゲームを作成し[9leap]のほうに投稿しました。ゲームは[こちら](http://9leap.net/games/4105)
次のブログでこのゲームの説明をしますが。今回は今まで私がenchant.jsを使って来て身についた知識をサンプルプログラムという形で紹介します。

内容は
01Spriteの表示
02Spriteの移動
03シーンについて
04文字の表示
05キー入力
06クリック&タッチ座標
07Spriteの大きさ&向き
08クラス
09MAP
10あたり判定
で、内容はQiitaに投稿しました。[こちら](http://qiita.com/Yusuke_mori/items/87215c46426f60401c6b)

Three.js 【3D描画の流れ】

**Three.jsとは?**
Web上で3Dグラフィックを実現する「WebGL」を簡易的に扱うことができるJavaScriptライブラリの一つです。

##◆ Three.jsのダウンロード
Three.jsは下記のサイトから
ダウンロードすることができます。
[Three.js](https://http://threejs.org/
)

##1.描画までの下準備
・シーンを作成(制作していく上での3D空間です)
・カメラを配置する
・ライティングの設定をする
・オブジェクトを配置する。

以下の処理などを行ったあと最後にレンダリングするという流れになります。

**2. シーンを作成
[code lang=”js”]
/**
* main
* main関数
*/
var main = function () {
// シーンの生成
var scene = new THREE.Scene();
};
[/code]

enchant.jsでゲームを作る MAP編

トライデントコンピュータ専門学校 ゲームサイエンス学科3年の森です。
私はenchant.jsをJavaScriptの勉強もかねて学んで行こうと思います。

今回はゲーム作りではなくゲームを作る際に必要になる「MAP」の作り方を説明していきます。

実際にはめちゃくちゃ簡単。
MAPはタイルのように等間隔で四角い画像を配置して作ってあります。
enchant.jsにはMAPクラスがあり、それに二次配列でどの画像を使うかを指定するだけ!
map2
↑の画像の左上から右に向かって[0,1,2,3,4…]となっている。

[code language=”javascript”]
//ブロック
var blocks = [
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1, 7, 8,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,10,-1,-1,-1],
[-1, 0, 0, 0, 0, 0, 0, 0, 0,-1],
[-1, 1, 1, 1, 1, 1, 1, 1, 1,-1],
];
var map = new Map(16, 16); //絵の中の1種類の四角の大きさ
map.image = game.assets["./img/map2.png"]; //使う絵
map.loadData(blocks); //ブロック(二次配列)をMAPに入れる
[/code]
と、実際に書いて見ました。 SceneにMAPを渡してシーンに描画すればOKです。
しかし、この数字の状態でMAPを作るのは大変です。脳内で数字と絵を当てはめて…とか

なので、enchant.js公式で用意されているマップエディタを使います。
公式の enchantMapEditor は、[GitHub](https://github.com/wise9/enchantMapEditor) よりダウンロードできます。
右下の「Download ZIP」をクリックしてダウンロードし、その中に「mapeditor.html」というファイルがあると思うのでブラウザで立ち上げてください。

立ち上げると[横幅][縦幅][画像][マップ拡張を有効にする]の4個の項目があると思います。
横幅、縦幅、は言葉の通り。MAPの大きさです。
画像は[RPG][2D Scroll]のどちらかを選びます。今回は[2D Scroll]
拡張のチェックはRPGの時は問題ありませんは、2D Scrollの時はバグるのでチェックを外しておきます。

あとは右側の絵の中から使用したい絵を選び左の枠内に配置していくだけです。
ちなみに、「-1」は何も表示しない。の意味です。

MAPが完成したら右下の「コード生成」をクリックし、出てきた配列をコピペして使用する。
注意:ところどころ画像の数字とエディタで作った配列の数字が違う場合があります。

以上でenchant.jsでのMAPの作り方の説明を終わります。

html5

今回は円と四角のあたり判定を調べました。

これがソースです

<html>
  <head>
    <title>Canvas tutorial</title>
    <script type="text/javascript">
    	// ここがプログラム
    	var canvas;
    	var ctx;
    	
    	var x = 250;//円のx軸
    	var y = 250;//円のy軸
    	var bool = 10;//円の大きさ
    	
    	
		var rightDown = false;
		var upDown = false;
		var leftDown = false;
		var downDown = false;
		
		var block_x = 225;//四角のx軸
		var block_y = 175;//四角のy軸
		var block_w = 50;//四角の幅
		var block_h = 50;//四角の高さ
///////////////////////////////////////
function onKeyDown(evt) {
	if (evt.keyCode == 39)
		rightDown = true;
	else if (evt.keyCode == 37)
		leftDown = true;
	
	else if (evt.keyCode == 38)
		upDown = true;
	else if (evt.keyCode == 40)
		downDown = true;
		

}

function onKeyUp(evt) {
	if (evt.keyCode == 39)
		rightDown = false;
	else if (evt.keyCode == 37)
		leftDown = false;
		
	else if (evt.keyCode == 38)
		upDown = false;
	else if (evt.keyCode == 40)
		downDown = false;
		
}

document.onkeydown = onKeyDown;
document.onkeyup = onKeyUp;

//////////////////////////////////////
		
      	function draw(){
        	canvas = document.getElementById('tutorial');
        	ctx = canvas.getContext('2d');
        	if (canvas.getContext){
          		
          		setInterval('gameLoop()', 16);
          		
        	}
      	}

		/**
		 * ゲームループ
		 */
		function gameLoop() {
			//initContext(canvas,ctx);
			
			ctx.clearRect(0,0,canvas.width,canvas.height);
			
			ctx.font = "18px 'MS Pゴシック'";
    		ctx.fillText("X:" + x ,10,75);//円のx軸表示
    		ctx.fillText("Y:" + y ,10,100);//円のy軸表示
			
			//四角の表示
			ctx.strokeRect (block_x, block_y, block_w, block_h);
			
			//円の表示
			ctx.beginPath();
        	ctx.arc(x,y,bool , 0,360*Math.PI/180,true);
        	ctx.stroke();
        		
//------------------------円と四角のあたり判定-------------------------

	//円の中心が四角から見て上中下の時
	if(( block_x < x && x < block_x+block_w )&&( block_y-bool < y && y < block_y+block_h+bool ))
	{
		ctx.fillText("上中下当たり" ,10,225);
		
	}
	 
	//円の中心が四角から見て左中右の時
	if(( block_x-bool < x && x < block_x+block_w+bool )&&( block_y < y && y < block_y+block_h ))
	{
		ctx.fillText("左中右当たり" ,10,250);
	}
	
	//円の中心が四角から見て斜め上下の時
	if(( (block_x-x)*(block_x-x)                 + (block_y-y)*(block_y-y) < bool*bool ) ||
	( (block_x+block_w-x)*(block_x+block_w-x) + (block_y-y)*(block_y-y) < bool*bool ) ||
	( (block_x-x)*(block_x-x)                 + (block_y+block_h-y)*(block_y+block_h-y) < bool*bool ) ||
	( (block_x+block_w-x)*(block_x+block_w-x) + (block_y+block_h-y)*(block_y+block_h-y) < bool*bool ))
	{
		ctx.fillText("斜め上下当たり" ,10,275);
	}

//---------------------------------------------------------------------

  	//円移動
    if(rightDown == true){
		x += 1;
	}
	if(leftDown == true){
		x -= 1;
	}
	
 	else if(upDown == true){
		y -= 1;
	}
	else if(downDown == true){
		y += 1;
 	}
 
 
        	
		}
    </script>
    
    <style type="text/css">
      canvas { border: 1px solid black; }
    </style>
  </head>
  <body onload="draw();">
    <canvas id="tutorial" width="500" height="500"></canvas>
  </body>
</html>

となります

	//円の中心が四角から見て上中下の時
	if(( block_x < x && x < block_x+block_w )&&( block_y-bool < y && y < block_y+block_h+bool ))
	{
		ctx.fillText("上中下当たり" ,10,225);
		
	}
	 
	//円の中心が四角から見て左中右の時
	if(( block_x-bool < x && x < block_x+block_w+bool )&&( block_y < y && y < block_y+block_h ))
	{
		ctx.fillText("左中右当たり" ,10,250);
	}
	
	//円の中心が四角から見て斜め上下の時
	if(( (block_x-x)*(block_x-x)                 + (block_y-y)*(block_y-y) < bool*bool ) ||
	( (block_x+block_w-x)*(block_x+block_w-x) + (block_y-y)*(block_y-y) < bool*bool ) ||
	( (block_x-x)*(block_x-x)                 + (block_y+block_h-y)*(block_y+block_h-y) < bool*bool ) ||
	( (block_x+block_w-x)*(block_x+block_w-x) + (block_y+block_h-y)*(block_y+block_h-y) < bool*bool ))
	{
		ctx.fillText("斜め上下当たり" ,10,275);
	}

上のif文は上中下の時の判定です
真ん中のif文は左中右の時の判定です
下のif文は上下ふちの時の判定です

ATAN2(アークタンジェント)

今回は**ATAN2**について書いていこうと思います。
ATAN2とはなにか・・・?

指定された x-y 座標のアークタンジェントを返します。
アークタンジェントとは、x 軸から、原点 0 と x 座標、y 座標で表される点を結んだ直線までの角度のことです。
戻り値の角度は、-PI 〜 PI (ただし -PI を除く) の範囲のラジアンとなります。

と書いてありました。
詳しくはコチラのページを参照して下さい。
[http://office.microsoft.com/ja-jp/excel-help/HP005208991.aspx](http://)

簡単にいうと角度を取得することができます。
C言語での書き方はこうです。

[c]double atan2(double y,double x);[/c]
ではゲームではどのように使えるのでしょうか?

例えば、プレイヤーが入力された方向へ360度回転することができます。
ほかにもシューティングで使われるホーミングミサイルなどにも使うことができます。

ではサンプルプログラムを見てみましょう。
[c]// プレイヤーの向きを360度変える
float angle = atan2(player.vecY,player.vecX);
player.rotz = angle;[/c]

こちらのソースではプレイヤーのベクトルから向きを取得して
向いた方向へ回転させています。

但しこの関数で帰ってくる値はラジアン(radian)なので
角度(degree)に変換する場合は注意が必要です。

変換の式も載せておきます。

角度(degree)からラジアン(radian)に変換
[c]double radian = degree * PI / 180.0;[/c]

ラジアン(radian)から角度(degree)に変換
[c]double degree = radian * 180.0 / PI;[/c]