インタラクティブ・ゲーム制作 <プログラミングコース>

Slides:



Advertisements
Similar presentations
1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
Advertisements

情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
Generic programming と STL
オブジェクト指向プログラミング(4) 静的分析(2)
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
Step-by-Step Guide on How to Start ALICE Analysis
アルゴリズムとデータ構造1 2007年6月12日
プログラミング基礎I(再) 山元進.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
情報科学1(G1) 2016年度.
アルゴリズムとデータ構造 2011年6月13日
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
第10回 プログラミングⅡ 第10回
インタラクティブ・ゲーム制作 <プログラミングコース>
~手続き指向からオブジェクト指向へ[Ⅱ]~
プログラミング言語入門 手続き型言語としてのJava
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
第二回 VB講座 電卓を作ろう.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
インタラクティブ・ゲーム制作 <プログラミングコース>
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
情報 第1回:状態遷移 その1.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
オブジェクト・プログラミング 第8回.
アルゴリズムとプログラミング (Algorithms and Programming)
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
プログラミング 3 2 次元配列.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとプログラミング (Algorithms and Programming)
サブゼミ第7回 実装編① オブジェクト型とキャスト.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
精密工学科プログラミング基礎 第7回資料 (11/27実施)
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
C#プログラミング実習 第1回.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
C言語講座第5回 2017 構造体.
プログラミング 3 ポインタ(1).
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

インタラクティブ・ゲーム制作 <プログラミングコース> 第1回 オブジェクト指向:事始め

この授業の目的 アーキテクチャ アルゴリズム オブジェクト指向 プログラミング(OOP) グラフィクス プログラミング(OpenGL) C++を使って実践する グラフィクス プログラミング(OpenGL) FKを使って実践する アルゴリズム ベクトルと行列 ゲーム数学再入門 当たり判定&物理 一部はゲーム数学 AIの基礎 オセロを通じて学ぶ

授業予定 OOP:事始め オブジェクト設計 コードレビュー#1 コンテナとポインタ 継承 コードレビュー#2 対戦版オセロ完成 ゲーム数学再入門 コードレビュー#3 AIの基礎 Boostの利用 コードレビュー#4 AI版オセロ完成 AIオセロ頂上決戦

何故C++なのか? 今でも事実上現役だから 設計思想を知り、学ぶ教材として有用 弊社の開発でもメインストリーム ネイティブ(CPU上で直接動作する)コードを吐ける数少ない言語 設計思想を知り、学ぶ教材として有用 長年使われており、最新の概念も取り込む マルチパラダイム言語

パズドラでわかる オブジェクト指向 まずはお馴染みのゲームで考えてみよう ©2012-2013 GungHo Online Entertainment, Inc. All Rights Reserved.

変数のおさらい iA 値を覚えておくための箱のようなもの 1つの箱に1つだけ、値を入れておける 入れる値の種類に応じて、違う型を使う 整数なら int 型、実数なら double 型など int iA = 12; iA int型 12

変数の限界 iDs[0] iDs[1] iDs[2] iDs[3] 変数1つには、 1つの値しか 入れられない だが実際には、 1つの数値だけでは 表せない物事が 多数存在する 配列は複数の値を まとめてしまえるが、 あくまで同じ型の 集合でしかない iDs[0] iDs[1] iDs[2] iDs[3] int型

パズドラのモンスターで 考えてみる [Thinking time] モンスターを構成するパラメータを列挙してみよう ヴァルキリーたん ふつくしいですん…… ©2012-2013 GungHo Online Entertainment, Inc. All Rights Reserved.

列挙してみた例 名前 属性 タイプ HP 攻撃 回復 それぞれの+値 レベル 経験値 レアリティ コスト スキル スキルレベル リーダースキル

プログラムで表現してみよう 右のような感じ? このように、 何かをプログラムで表現するのは複数の変数が必要 string name = “ヘラ・イース”; // 火水木光闇の順に1~5とする int attrib = 2; // 6が神だとする int type = 6; int level = 50; int exp = 883883; int hitPoint = 2161; int attack = 1183; int heal = 238; int cost = 40; // スキルについては数値や文字で 表現できないので今回は割愛

複数のモンスターを扱いたい パズドラは最大6体のモンスターで戦う さっきの変数を 6セット分用意する? string m2_name = “ワルキューレ”; // 火水木光闇の順に1~5とする int m2_attrib = 4; // 3が回復だとする int m2_type = 3; int m2_level = 50; int m2_exp = 265165; int m2_hitPoint = 1000; int m2_attack = 555; int m2_heal = 256; int m2_cost = 6;

複数のモンスターを扱いたい もしくは配列使う? 複数の変数を 1セットで扱うのは 面倒&ナンセンス! string name[6]; int attrib[6], type[6], level[6], exp[6], hitPoint[6], attack[6], heal[6], cost[6]; name[1] = “ワルキューレ”; // 火水木光闇の順に1~5とする attrib[1] = 4; // 3が回復だとする type[1] = 3; level[1] = 50; exp[1] = 265165; hitPoint[1] = 1000; attack[1] = 555; heal[1] = 256; cost[1] = 6;

そこで偉大なる先人は考えた 1つのものは1つの変数のように扱えたら よいのではなかろうか? 中身の要素は変数ごとに別々に扱えると いいよね こんな感じで…… Monster hera_ys, valkyrie; 中身の要素は変数ごとに別々に扱えると いいよね 「変数名.メンバ名」でアクセス hera_ys.hitPoint = 2161; valkyrie.hitPoint = 1000;

これがクラスの原形 正確には「構造体」という こうすると、intやdoubleと同じように「変数の型の1種類」 として扱える クラスになる手前の 段階 こうすると、intやdoubleと同じように「変数の型の1種類」 として扱える もちろん配列にも できる class Monster { public: string name; int attrib, type; int level, exp; int hitPoint, attack; int heal, cost; };

こんなイメージ 普通の変数が1つ分の箱なら、 クラス(構造体)は、1つの箱に複雑な 仕切りがついているイメージ 配列と違って色んな型をまとめられる string型 int型 int型 int型 int型 name attrib level hitPt atk Monster型 monsterA

トピック:数字で種類を表す時 1が火で、2が水で… みたいな割り当てを うろ覚えでやるのは ナンセンス 名前で対応付ければ 間違いにくくなる 列挙型(enum)を使う 中身は整数値だが、 型の1種類として扱う enum Attrib { ATT_FIRE = 1, ATT_WATER, ATT_WOOD, ATT_LIGHT, ATT_DARK }; Attrib att = ATT_DARK;

演習 Monster型に副属性とタイプ(サブタイプ)を追加してみよう 属性はAttrib型を利用して、 タイプは新たにType型の列挙型を作る 列挙型を新たに追加する場合は、 クラスの宣言の前に書く

値をまとめるだけでいいのか? レベルアップ処理を考えてみる →みたいにいちいち変数名.~で操作するのもまたナンセンス 面倒だし、間違えそう Monster vampire; // 初期値を入れたとして vampire.level++; vampire.hitPoint += 5; vampire.attack += 3; vampire.heal += 1;

メンバーの値に関することは 自分自身にやらせたい! 経験値合成と判定 レベルアップ 卵合成 +値のメンバが必要? スキルの発動 メンバー関数と呼ぶ 後々の使い回しが楽 他の人に使って もらいやすい 上限チェックなども 仕込める void Monster::levelUp() { level++; hitPoint += 5; attack += 3; heal += 1; } // こんな関数を作っておけば vampire.levelUp(); // これで済んじゃう!

トピック:アクセス制御 メンバ関数を作っても、 直接変数に触れては 意味がない いじれるものは他人は絶対いじる 自分でも楽しようと ついいじっちゃう 変数はprivateに、 外部から触る関数はpublicにする class Monster { public: string name; int attrib, type; int level, exp; int hitPoint, attack; int heal, cost; };

トピック:コンストラクタ メンバ変数に初期値は必ず入れなくてはいけない クラス名と同じ メンバ関数を作る 0になっている保証は ない!! オブジェクト生成時に 自動的に呼び出される Monster::Monster() { level = 1; hitPoint = 100; attack = 50; heal = 10; } // こんな関数を作っておけば Monster mon; // この時点で初期値が入る

オブジェクトとは 今回で言うなら、Monsterがクラス、 hera_ysやvalkyrieがオブジェクト 何かを表す変数や手続きがまとまっており、 メッセージを送る(メンバ関数を呼び出す) ことで様々な処理を実現できるもののこと このオブジェクトを作るための設計図が 「クラス」 その「クラス型の変数」がオブジェクト 今回で言うなら、Monsterがクラス、 hera_ysやvalkyrieがオブジェクト

ただ、今日の内容だけでは不十分 Monsterというのは抽象的な括り ValkyrieやHeraYsもクラスになり得る スキルやパラメータの伸びは種類ごとに違う ValkyrieやHeraYsもクラスになり得る 同じ種類のモンスターを複数所持することは 十分あり得るので でも別々のクラスにしちゃうと、 パーティを配列で表現出来ない…… 来週、さらにオブジェクト指向を 掘り下げて解決します

To be continued…