プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース

Slides:



Advertisements
Similar presentations
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
Advertisements

情報処理演習C2 ファイル操作について (2).
IO - 入出力 小西 亨.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第13回構造体.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
第12回構造体.
とても使いやすい Boost の serialization
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
とても使いやすい Boost の serialization
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
プログラミング基礎I(再) 山元進.
第13回 プログラミングⅡ 第13回
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
情報科学1(G1) 2016年度.
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
インタラクティブ・ゲーム制作 <プログラミングコース>
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミング 平成24年10月30日 森田 彦.
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
情報処理技法 (Javaプログラミング)2 第2回 前期の復習(2)
補足説明.
インタラクティブ・ゲーム制作 <プログラミングコース>
プログラミング 平成25年11月5日 森田 彦.
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
Cプログラミング演習 第6回 ファイル処理と配列.
プログラミング応用 printfと変数.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング 4 記憶の割り付け.
はぐれたメルでプログラムを 担当した一人の仁藤が 授業開始前の2時間くらいで作成
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
2016年度 植物バイオサイエンス情報処理演習 第6回 情報処理(4) データを加工する・2
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
プロジェクト演習Ⅱ インタラクティブゲーム制作
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
統計ソフトウエアRの基礎.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習I 2003年7月2日(第11回) 木村巌.
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
プログラミング入門 電卓を作ろう・パートI!!.
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
第5回 プログラミングⅡ 第5回
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
vc-3. ダンプリスト,配列 (Visual Studio C++ の実用知識を学ぶシリーズ)
精密工学科プログラミング基礎 第7回資料 (11/27実施)
標準入出力、変数、演算子、エスケープシーケンス
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
情報処理Ⅱ 第2回 2004年10月12日(火).
プログラミング 平成28年10月25日 森田 彦.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
Presentation transcript:

プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース 第5回 ファイル読み込みとクラスの応用 ~マップデータを作ろう~

今日の内容 具体的な目的を掲げて、それを達成するために必要な材料の使い方、組み合わせ方を学ぶ ファイルからマップデータを読み込んで、それに従ってプログラムで地形を生成! ファイル入出力 vector配列 newとdeleteの実践

ファイル入出力の重要性 もうパラメータとかをプログラム中で ゴリゴリ代入するのはまっぴらだ! 「ハードコーディング」と言われて、 現場では忌み嫌われる行為 ちょっとマップを手直しするのにもビルドが必要=Visual Studioが必要=マップも自分で作らなくてはいけなくなる=あばばばばばb

読み書きのターゲットは とりあえずテキストファイル マップデータ、キャラクタパラメータ、 シナリオデータ、セーブデータなどなど 特にCSVやタブ区切りテキストは扱えると 超便利 マップデータ、キャラクタパラメータ、 シナリオデータ、セーブデータなどなど 「テキストファイルとか見られたら  恥ずかしいし…」とか言うのは後だ!

とりあえず使うもの C++の標準機能だけでやってみよう インクルードは以下の通り 読み込みは「ifstream」 書き込みは「ofstream」 インクルードは以下の通り #include <iostream> #include <fstream> 両方必要なので気をつける 必要に応じてusing namespace std;も

書き込みは絶望的に簡単だ! インスタンス生成時にファイル名指定 is_open()で開けているかチェック <<で書き込むデータを繋げて流し込む 最後はclose() ofstream out_file(“ファイル名”); if(out_file.is_open() == false) エラー処理; out_file << “書き込みたい文字” << endl; // int値やdouble値も<<で繋いで書ける // もちろんstring型やchar型もOK out_file << x << “,” << y << endl; //書き込み終わったらcloseして終了 out_file.close();

読み込みも ただ読み込むだけなら簡単だ! インスタンス生成時にファイル名指定 is_open()で開けて いるかチェック getlineで1行ずつ 取り出し、必要に 応じて処理する 最後はclose() ifstream in_file(“ファイル名”); string lineStr; vector<string> readBuffer; if(in_file.is_open() == false) エラー処理; // 1行ずつwhileループで読み出す while(getline(in_file, lineStr) == true) { // lineStrに1行分入る // とりあえず配列にしまうならこう readBuffer.push_back(lineStr); } in_file.close();

結局何が面倒って 読み込んだ後の文字列処理なんです C++のstringクラスはJavaに比べると 機能が正直貧弱です 最低限のものは揃っているので、うまく素材を組み合わせて関数を作ろう サンプルあります データを取り出しやすいファイル構造を作ろう

区切り取り出し関数実装例 vector<string> fk_StrSplit(string argStr, string argToken) { vector<string> retStrArray; string::size_type curPos = 0, nextPos = 0; while(nextPos != string::npos) { nextPos = argStr.find(argToken, curPos); retStrArray.push_back(argStr.substr(curPos, nextPos-curPos)); curPos = nextPos+argToken.size(); } return retStrArray;

区切って取り出す fk_StrSplit()関数 カンマ区切り、タブ区切りはExcelでの 編集が容易なので、出来ておいて損は ない JavaのStringクラスのsplit()のようなもの 正規表現は使えないけどカンマ区切り、 タブ区切り程度なら対応可能 カンマ区切り、タブ区切りはExcelでの 編集が容易なので、出来ておいて損は ない マップやシナリオのエディタをExcelで 代用しているソフトハウスもあります

整数値・実数値変換 Cの標準関数をなんだかんだで使う ただしstring型の変数は直接引数に 渡せないので、c_str()関数を使う atoi()がInteger.parseInt()にあたる atof()がDouble.parseDouble()にあたる ただしstring型の変数は直接引数に 渡せないので、c_str()関数を使う atoi(anyStr.c_str())のようにする 実数値は誤差に厳しいものだと変換時に値がズレることがあるので注意

ファイル形式の作り方のコツ FK Performerのモーションデータなどを見てみるとよい 「ファイルヘッダ」は必ず付ける ファイルの先頭でファイルの種類が 識別できるようにする 階層構造を持つデータを扱う場合 [BEGIN]~[END]で囲っておくと、 データを読み込むべき範囲が 分かりやすくなるので処理しやすい

Worldクラスを ファイル読み込み対応にしてみる buildModel[6]というメンバ変数に注目 配列だけど、6個固定になってしまっている ここが状況に応じて変動したら幸せなんじゃなかろうか? makeBuild()という関数に注目 init()内で何度もコールして建物を生成 この処理をファイルから読み込んだ内容に 置き換えられたら幸せなんじゃなかろうか?

データ形式を仮決めしよう 次のようなテキストファイルを作ることにする 最初の行に[MY MAP DATA]と表記する 次の行に建物の個数を記述する 3行目以降から、 1行で建物1個分を表すことにする X座標,Z座標,高さ,色指定(とりあえず英語で)

データの例 [MY MAP DATA] 6 -250.0, 100.0, 5.0,Red -150.0, 400.0, 2.0,DimYellow 50.0, 250.0, 4.0,Blue 300.0, 200.0, 3.0,Gray 250.0, -250.0, 0.5,Green -50.0, -350.0, 6.0,Orange

個数に応じて配列を作りなおす ただの配列から、vector<fk_Model *>に変更 ポインタの配列なので、用意する時にnewし、片付ける時はdeleteが必要! intやdoubleやfk_Vectorの場合は ここまで面倒ではない // 配列の中身の準備 for(int i = 0; i < num; ++i) { vArray.push_back(new fk_Model()); } // こう書いても同じ意味 vArray.resize(num); vArray[i] = new fk_Model();

お片付けもセットで よく使うvector配列の メンバ関数 resize() size() push_back() back() at() 配列のサイズ変更 size() 今のサイズを得る push_back() 配列のお尻に1部屋足す back() 配列のお尻を参照する at() [i]のかわりに.at(i)とする clear() resize(0)とほぼ一緒 // お片付けのパターン int len = vArray.size(); for(int i = 0; i < len; ++i) { delete vArray[i]; } vArray.clear(); 配列を作りかえる時には必ず↑の 処理を呼んでおくべし。 でないと以前に作っていた要素が まるっとメモリリークする。

ここまでの要素で出来るはず 後はどこまで理解できていて、 組み合わせられるかの問題 やってみよう!