プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2

Slides:



Advertisements
Similar presentations
プログラミング Ⅱ 第2回 第1回(プログラミングⅠの復 習) の解説. プログラムの作り方 いきなり完全版を作るのではなく,だんだ んふくらませていきます. TicTa cToe1.
Advertisements

形状デザイン 様々な形 制御構造.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
プログラミング入門 電卓番外編 ~エクセルで関数表示~.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング基礎I(再) 山元進.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
プログラミングができるようになるには…. 一週間に1回では無理! 自分の力でできるだけがんばる
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
6/26 前回復習 for文、while文による繰り返し計算
第四回 VB講座 画像とタイマー.
基礎プログラミングおよび演習 第8回.
C言語 配列 2016年 吉田研究室.
C言語講座 第4回 ポインタ.
プロジェクト演習Ⅱ インタラクティブゲーム制作
第6章 2重ループ&配列 2重ループと配列をやります.
情報基礎A 第11週 プログラミング入門 VBAの基本文法3 配列・For~Next
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
配列(1) 第9回目 [6月15日、H.16(‘04)] 本日のメニュー 1)前回の課題について 2)前回の宿題について 3)配列 4)課題
第7回 条件による繰り返し.
CGと形状モデリング 授業資料 長井 超慧(東京大学)
C 言語について 補足資料 資料および授業の情報は :
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング入門 電卓を作ろう・パートIV!!.
プロジェクト演習Ⅱ インタラクティブゲーム制作
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
第7回 条件による繰り返し.
第6回:ラケットを動かそう! (キーボードによる物体の操作)
 情報の授業 アルゴリズムとプログラム(1) Go.Ota.
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
プログラミング 4 整列アルゴリズム.
プロジェクト演習Ⅱ インタラクティブゲーム制作
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
プログラムの基本構造と 構造化チャート(PAD)
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
第4章 反復作業を楽にする方法!! ~繰り返しその1 while~
第1章 いよいよプログラミング!! ~文章の表示 printf~
基礎プログラミング演習 第6回.
プログラミングⅡ 第2回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
プログラミング入門 電卓を作ろう・パートI!!.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
第6回:得点を表示しよう! (文字の表示、乱数)
ウェブデザイン演習 第6回.
精密工学科プログラミング基礎 第7回資料 (11/27実施)
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
アルゴリズム入門 (Ver /10/07) ・フローチャートとプログラムの基本構造 ・リスト ・合計の計算
プログラミング基礎演習 第4回.
参考:大きい要素の処理.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プロジェクト演習Ⅱ インタラクティブゲーム制作
情報処理Ⅱ 第2回 2004年10月12日(火).
3.1 シューティングゲームの当たり判定 当たったら死亡.
情報処理Ⅱ 2005年11月25日(金).
プロジェクト演習Ⅱ インタラクティブゲーム制作
プログラミング1 プログラミング演習I 第2回.
プログラミング入門2 第5回 配列 変数宣言、初期化について
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
情報処理Ⅱ 第3回 2004年10月19日(火).
第5回 配列.
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
ファーストイヤー・セミナーⅡ 第10回 if文による選択処理(2).
Presentation transcript:

プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2 第5回 はじめての3Dプログラミング 配列と繰り返しと当たり判定

こんなことがしたいとする X方向にブロックを 8個並べて配置する X方向に5個ずつ、 Z方向に5個ずつで 計25個のブロックを 並べて配置する

ただし、力技は禁止 変数8個(16個)用意して、ちまちま数字と変数名を変えたプログラムを書きたいか? おれはいやだぜ!

じゃあどうすればいい? 配列と繰り返しをうまく使おう

配列の作り方 整数の変数5個分なら ブロック8個分なら 普通の変数の作り方に加えて[個数]を足す int values[5]; fkut_BlockModel blocks[8]; 普通の変数の作り方に加えて[個数]を足す 変数(オブジェクト)の型 配列名[個数];

配列の使い方 [個数]を付けることで、その個数分変数を 作ったことになる 配列名[部屋番号]で、普通の変数と同じように使える values[0], values[1] …values[4]、で5個 blocks[0], blocks[1] …block[6], blocks[7]、 で8個 部屋番号は0~個数-1 配列を使った例 // 値の代入、計算、全部一緒 values[0] = 0; values[1] = values[0] + 3; // ブロックの場合も一緒 blocks[0].create(10, 10, 10); blocks[1].create(5, 5, 5); // 中略 window.entry(blocks[0]); window.entry(blocks[1]);

でもこれじゃ変数作る手間しか 減ってないじゃん! ごもっとも! だが、配列には変数を 1個ずつ作った場合より 大きなアドバンテージがある 部屋番号に 整数の変数が使える 部屋ごとに同じ処理するなら、ほぼコピペで行けそうな気がする // 整数iを部屋番号指定に使ってみる int i = 0; fkut_BlockModel blocks[8]; // 部屋番号0への処理 blocks[i].create(5, 5, 5); ++i; // i = i + 1;と一緒で、iの値を1増やす処理を表す // 部屋番号1への処理 ++i; // 部屋番号2への処理 // 部屋番号3への処理

ここで繰り返しを投入 whileループ forループ while(条件式) { // 繰り返す処理 } ある状態を維持している間に繰り返したい処理向け ウィンドウが開いている間 何か入力されている間 などなど forループ for(初期値;条件式;増分) { // 繰り返す処理 } 繰り返す回数、 変数が変化する範囲が決まっている処理向け 10回繰り返す -5.0から5.0まで繰り返す 配列の個数分繰り返す これがおいしい!!

個数・回数分の繰り返し forループの使い方の基本 for(int i = 0; i < 回数; ++i) {   // 繰り返したい処理 } 変数iを慣例的に使うことが多い 名前が被る場合はj,k...と変えていく iを0の状態から初めて(i=0)、 1回の繰り返しにつきiを1ずつ増やし(++i)、 iが回数未満の間は繰り返し続ける(i < 回数)

さあ、どっちがいい? fkut_BlockModel blocks[8]; blocks[0].create(5, 5, 5); blocks[1].create(5, 5, 5); blocks[2].create(5, 5, 5); blocks[3].create(5, 5, 5); blocks[4].create(5, 5, 5); blocks[5].create(5, 5, 5); blocks[6].create(5, 5, 5); blocks[7].create(5, 5, 5); // 配列なら個数が増えたら繰り返しの回数いじればいいだけだが、こうしちゃうと…ええ…はいぃ… fkut_BlockModel blocks[8]; // この繰り返しで、iは0~7の順に推移していくので、配列の部屋番号とジャストフィットする for(int i = 0; i < 8; ++i) { blocks[i].create(5, 5, 5); // 一緒に繰り返したい処理があればもちろん入れていい }

でも完全に同じ処理しか できないんじゃ意味なくね? 条件分岐を使う iの値に応じて処理を分岐するとか 3の倍数の時だけ 色を赤くするとか… if(i % 3 == 0) { blocks[i].setMaterial(Red); } else { blocks[i].setMaterial(Green); } 計算で座標などを 変化させる iの値を座標計算に うまく使う // iの値を10倍してx座標に使う blocks[i].glMoveTo(i*10, 0, 0);

と、いうわけで むやみやたらに変数を大量生産するのはやめよう 同じ用途でオブジェクト(変数)を量産するなら、配列だ! 繰り返しとの組み合わせは混乱するが、 「どっちがいい?」のスライドを見て どのように繰り返されるかを把握しよう

配列を使う上での注意点 添え字が[個数-1]を超えないように! 配列の個数には変数を使えません [10]で作ったら0,1,2,…,8,9までです オーバーした場合、落っこちるならまだよし、落ちずに不可思議な挙動をすることも… 配列の個数には変数を使えません 10とか20とか、数値を直接指定します プログラム中に直書きする値のことを「定数」と呼びます

数値の直打ちはやめましょう 変数を使った移動制御

数値の直打ちはよくないよ glTranslate()みたいな命令に直接数値を打ち込むのは、あまりよろしくない 位置や速度を直したくなったら大変 じゃあdoubleの変数ちまちま用意する? それも面倒な話です x,y,zみたいにいつもセットで使う数値をひとまとめにできればいいのにねー

できます fk_Vectorというスペシャルな型の変数を 使います 変数の作り方 値のセット方法 各種命令での利用方法 fk_Vector vPos, vSpd; 値のセット方法 vPos.set(50.0, 0.0, -10.0); vSpd.x = 0.0; vSpd.y = 0.0; vSpd.z = -2.0; 各種命令での利用方法 hogeModel.glMoveTo(vPos); hogeModel.loTranslate(vSpd);

こんなこともできるよ x,y,zそれぞれで足し算や引き算をしたい 掛け算や割り算もできる こう書かなきゃいけないところが… こう書けばできる vC.x = vA.x + vB.x; vC.y = vA.y + vB.y; vC.z = vA.z + vB.z; こう書けばできる vC = vA + vB; 掛け算や割り算もできる 方向は同じで進む距離だけ変えたい、なんて時に超絶便利

Coolなプログラムを 書くためのポイント 数値をセットする部分と、 命令を出す部分を、 出来る限り分けて書く 変数を使えば、数値のセットを先頭で 済ませて、後ろは純粋に命令の手順だけ、 という書き方にできる 今の内から意識できていると、後々お得

ガチ数学の世界へようこそ 当たり判定の基礎

衝突判定とは CG上で物がぶつかっているか どこでぶつかったか いつぶつかったか どのくらい位置を動かすと帳尻が合うか などなどを計算して求める、数学を ふんだんに活用する技術分野である

衝突判定用の形状 見た目通りに厳密な判定をすると、大量に物体が存在するゲーム(無双など)は処理が重くて大変なことになる 力業で考えた場合、物体数*物体数の回数分判定処理を行わなければならない 判定用の簡易形状を用意し、裏ではそれで計算するのがセオリー

判定素材としての「球」 中心間の距離が、お互いの半径の合計より小さかったら衝突 一番シンプルな判定 球だけで押し通すのは厳しいが、他の判定と併用することも多く、活躍する 球の中心を「点」から「線分」に拡張することにより「カプセル」へと進化する

判定の原理 2つの球の中心点をA,Bとする 2点(A,B)間の距離は以下のように表せる C=B-A dist = √(C.x*C.x + C.y*C.y + C.z*C.z) 2点間の距離が2つの球の半径の合計以上なら未衝突、以下なら衝突発生

とりあえず 細かいことはこっちでやっておきました 球モデル.checkToSphere(他の球モデル, 戻しベクトルを受け取るfk_Vectorの変数); 命令の実行結果として、衝突していたらtrue(条件式のYesに相当)、していなければfalse(Noに相当)が返ってくる if(命令 == true)でYesなら衝突している 戻しベクトル:球モデルをどれだけglTranslate()すれば衝突寸前まで戻せるかを表すベクトル

戻し方 操作キャラVS障害物全部の判定が必要 1つずつ調べ、ぶつかっていたらめり込み分動かして元に戻す 障害物が別々の変数だと大変、だが… 戻す方向に注意が必要 障害物が別々の変数だと大変、だが… 配列を使うことで繰り返しで片付けられる

注意点 あまり高速に動かしていると、貫通してしまう場合がある 物体が密集していると、押し合いへし合いしてあらぬ方向へ押し出される 速度が大きい場合は、少しずつ動かして判定するのが吉 物体が密集していると、押し合いへし合いしてあらぬ方向へ押し出される ゲームを構成する最低限の配置を工夫しよう

ブロックも判定素材として使える 原理は複雑ですが、 とりあえず気にせず使ってください checkToSphere()と checkToBlock()が あるので、状況に 合わせて使い分ける 球側にはcheckToBlock()が 無いのでブロック側から判定する 戻しベクトルを反転して扱うので注意!

今日の課題 BASIC ADVANCED ボンバーマンの ステージを作ろう 無理に1回のループに しなくていい 緑背景と、周囲の壁と、 壊せないブロックだけ表現すればよい 無理に1回のループに しなくていい ADVANCED ボンバーマンステージに アイテム(球)を設置して、 取得できるようにする 全部取得したら メッセージを出してクリア、とかできるとなお良し

さらに倍してドン EXTREME おまけ 取得できるアイテムの他に押して動かせる 障害物を作る 押して動かしたものが他の物にめりこむのは気にしなくてよい おまけ ボンバーマンステージの背景を、チェス盤の ような市松模様にする