テキスト篇次回予告:p.282「構造体でインターフェイスを実装する」 ゲーム開発演習次回予告:図形の塗りつぶし、文字列の描画 など 講義メモ:memo20250531.zip
for trainees of Hirano's class only
テキスト篇次回予告:p.282「構造体でインターフェイスを実装する」 ゲーム開発演習次回予告:図形の塗りつぶし、文字列の描画 など 講義メモ:memo20250531.zip
:図形の描画 など 提出フォロー:演習13 Escキーが押されたら終了 ・何かキーが押されたら、どのキーかを得て、Escキー(文字列"Escape")であれば終了しよう ※メッセージボックスの表示は削除する 作成例 //演習13 Escキーが押されたら終了 using System; //C#標準クラス用 using System.Windows.Forms; //C#が提供するApplication、Formクラス用 using System.Drawing; //Size、Graphics、Imageクラス用 class Program : Form { //Formクラスの派生クラス Image backi, playeri; //画像ファイル用変数 protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド base.OnPaint(e); //元のメソッドの内容を呼び出す e.Graphics.DrawImage(backi, 0, 0); //画像をフォーム左上に配置 e.Graphics.DrawImage(playeri, backi.Width / 2 – playeri.Width / 2, backi.Height – playeri.Height * 2); //自機を中央下部に描画 } public Program() { //コンストラクタ try { //例外処理対象 backi = Image.FromFile("backb2.bmp"); //背景画像ファイルを読み込む playeri = Image.FromFile("player.gif"); //自機画像ファイルを読み込む } catch (Exception e) { //例外処理内容 MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示 } KeyDown += new KeyEventHandler(OnKeyDown); //キー押し下げ時のメソッドを登録 } void OnKeyDown(object o, KeyEventArgs e){ //キー押し下げ時に呼ばれるメソッド if (e.KeyCode.ToString() == "Escape") { //【変更】押されたキーのコードを文字列化したらEscape? Close(); //フォームアプリケーションを終了 //【復活】 } } static void Main() { //実行用メソッド(publicはなくてOK) Program f…
テキスト篇:第11章「構造体」から ゲーム開発演習:図形の描画 など 第11章 構造体 p.275 構造体とは ・C#の基であるC言語にあった「クラスの基になったデータ構造」で、複数の変数や配列をグループ化して名前を付け、 ユーザー定義の型であるとして用いる手法 ・対して、C#はこれをっ拡大定義して、メソッドやプロパティなども持つことができるようにしている ・結果的に、C#の構造体は「軽量クラス」の位置づけで、クラスの機能を削って軽くしたもの。 ※そのため、Unityなどで活用されており、Vector3構造体など、Unity独自の構造体の出番が多い ・クラスの違いは: ①値型(p.188)なので、メソッドに渡した場合、全データメンバのコピーが発生する ②継承(p.223)できない(インターフェイスの実装であれば可能) ③引数のないコンストラクタ(p.167)をプログラマが定義することはできない(自動的に用意されるもののみ) ④インスタンス変数(p.154)の初期化は不可 ⑤デストラクタ(p.171)は定義不可 ・定義書式: struct 構造体名 {…} 例: struct Map { int x; int y; } //X座標とY座標を持つマップの構造体 ・インターフェイス(p.255)を実装する場合の書式: struct 構造体名 : インターフェイス名 {…} ・クラスと同様に構造体オブジェクトを宣言して利用する(宣言のみでオブジェクトが生成される) ・宣言書式: 構造体名 変数名; //構造体を型とする変数の宣言 ・メンバの利用書式はクラスのインスタンスメンバと同様で「変数名.メンバ名」で良い 例: Map hoimin; hoimin.x = 50; hoimin.y = 60; //マップ「hoimin」を生成しX座標Y座標を設定 ・構造体のメンバとしては、データメンバに加えて、メソッド、プロパティ、インデクサ、コンストラクタ(引数有り)などが 定義できる アレンジ演習:p.276 struct01.cs ・p.277にあるとおり、インスタンス変数xを初期化するとどういうエラーになるか確認しよう ⇒ 初期化において変数に「10.0以上の言語バージョンをお使いください」と表示される ※.NETフレームワークでは6.xに該当するが、VS2022に標準インストールされるのは4.7.2 https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-versioning ※よって「Visual Studio用 .NET SDK」のページで上位バージョンの.NETフレームワークをインストールすれば解決するが、 他の影響に配慮が必要 https://dotnet.microsoft.com/ja-jp/download/visual-studio-sdks?cid=getdotnetsdk 作成例 //アレンジ演習:p.276 struct01.cs using System; struct MyStruct //構造体MyStructの定義 { public int x; //公開のインスタンス変数 //public int x = 10; //公開のインスタンス変数 ※初期化するとエラーになる public void show() //公開のインスタンスメソッド { Console.WriteLine("x = {0}", x); } } class struct01 { public static void Main() { MyStruct ms;…
ゲームソフト販売本数ランキング:今週1位は「ファンタジーライフi グルグルの⻯と時をぬすむ少女(Switch)」 GO!「MMORPG運営はユーザーの気持ちがわかるのか」運営Dとユーザーを呼んで答え合わせしてみた。 GO!AI活用ゲーム開発ハッカソン、賞金100万円を獲得した作品は?QwenのAlibaba Cloud主催『Tokyo Game Jam』イベントリポート GO!PlayStationロイヤリティプログラム「PlayStation Stars」2026年11月2日サービス終了。新規メンバー受付はすでに終了 GO! 6月7日より開催の「Summer Game Fest 2025」は60以上のパートナーが参加!スイッチ2も名を連ねる GO! トランプ対策!?テイクツー、年次報告の多様性に関する表記を「思考の多様性」に置き換え―LGBTQ支援で授賞の雇用賞も表記せず GO!米ニュースメディア連合、Google 『AIモード』は記事の「窃盗そのものだ」と非難 GO! 【参考】Switch2でアップデートしたフレームレートやHDR、DLSS、レイトレーシングなどの用語をなるべくわかりやすく解説してみます GO!
テキスト篇次回予告:第11章「構造体」から ゲーム開発演習次回予告:図形の描画 など 講義メモ:memo20250524.txt
画像のプロパティ、画像の重ね合わせ、キーが押された情報を得る など 提出フォロー:演習9 背景画像の描画(エラー対処付き) ・画像ファイルの読み込みをコンストラクタで行うようにしよう ・そして、画像ファイル読込のトラブルへの対応を盛り込み、エラー発生時はメッセージボックスを表示しよう ・この時、catchを「catch (exception e)」とすることで、エラー発生オブジェクトを得ると良い ・このオブジェクトの文字列表現を「e.ToString()」で得てメッセージボックスに表示しよう 作成例 //演習9 背景画像の描画(エラー対処付き) using System; //C#標準クラス用 using System.Windows.Forms; //C#が提供するApplication、Formクラス用 using System.Drawing; //Size、Graphics、Imageクラス用 class Program : Form { //Formクラスの派生クラス Image backi; //【変更】画像ファイル用変数 protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド base.OnPaint(e); //元のメソッドの内容を呼び出す e.Graphics.DrawImage(backi, 0, 0); //【変更】画像をフォーム左上に配置 } public Program() { //【以下追加】コンストラクタ try { //例外処理対象 backi = Image.FromFile("back.bmp"); //画像ファイルを読み込む } catch (Exception e) { //例外処理内容 MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示 } } static void Main() { //実行用メソッド(publicはなくてOK) Program f = new Program(); //自クラスのインスタンスを生成 f.Text = "Game"; //Form名を設定 f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定 Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成 f.Location = p; //インスタンスプロパティで初期位置を設定 f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化 f.ControlBox = false; //コントールボックスの非表示 f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定 Application.Run(f);…
オブジェクト指向演習:仕上げ(継承によるラスボスの生成と登場) ゲーム開発演習:画像のプロパティ、画像の重ね合わせ、キーが押された情報を得る など RPG演習9 3人の魔導士 ver.5 継承によるラスボス(大魔道)の生成と登場 ・ラスボス(大魔道)はDaimadoクラスで実装する ・Daimadoクラスは機能が重複するMadoshiクラスを継承することで効率的に扱う ・下記はそのまま継承できる ① public int HP //HPを返すプロパティ ② public int Fight() //魔道士があなたを攻撃し、あなたのダメージ値を返す ③ public void Damage() //魔道士があなたからダメージをくらう ・public void DispInfo()はオーバライドして、大魔道用にアレンジしよう ・public static bool isSurvプロパティは、new public bool isSurvプロパティとして隠ぺいし、大魔道用にアレンジしよう ・データメンバはそのままで良い(ただし、int id; //魔導士番号 は用いない) ・コンストラクタは、MPとHPの初期値を40~49にする。mnum、id、survに関する処理は不要 ・minimadouクラスのMainメソッドでは、メインループの後に大魔道戦を追記する ・内容は「3人の魔導士」とほぼ同じだが、配列を用いずに、下記をアレンジしよう ① 戦闘開始では、プレイヤーのHPを回復(倍増)し、大魔道を生成して情報を表示する ②「あなたのHPがあり、生きている魔導士がいる間」は「あなたと大魔道のHPがある間」に ③「どれを攻撃しますか?(1/2/3:魔導士を攻撃 0:やめる):」を「攻撃しますか?(1:攻撃 0:やめる)」に ④「攻撃対象の魔導士の添字を得る」ことは不要 ⑤「魔導士の数だけ繰返す」ことは不要 ⑥「全ての魔道士を倒した!」は「大魔道を倒した」にする 作成例(完成版) //オブジェクト指向演習 RPG演習9 3人の魔導士 ver.5 継承によるラスボス(大魔道)の生成と登場 using System; class Madoshi { //魔導士を表すクラス(部品) protected int mp; //【変更】MP(継承可能) protected int hp; //【変更】HP(継承可能) int id; //魔導士番号 static int mnum = 0; //魔導士が何人生成されたか static int surv = 0; //生きている魔導士は何人いるか protected static Random rnd = new Random(); //【変更】乱数用のRandomクラスのインスタンスを生成(継承可能) public Madoshi () { //コンストラクタ mp = rnd.Next(10); //0~9の間のランダムな整数を得てMPの初期値とする hp = 10 + rnd.Next(10); //10~19の間のランダムな整数を得てHPの初期値とする mnum++;…
ゲームソフト販売本数ランキング:今週1位は「カプコン ファイティング コレクション2(Switch)」 GO! データイーストIPは死なず! 権利を保持するジー・モードの担当者にライセンス事業戦略を訊く。GO!コナミ新会社「コナミアーケードゲームス」誕生。代表取締役は西村“DJ YOSHITAKA”宜隆氏―果たしてどんな立ち位置に GO! 新作脱出シューター『Marathon』にてデザイン盗用!?Bungieは元スタッフの関与を認め調査 GO!iOS版『フォートナイト』近日復活と意気込むも…「Appleが審査をブロックしている」Epic Gamesが報告 GO!
オブジェクト指向演習次回予告:仕上げ(継承によるラスボスの生成と登場) ゲーム開発演習次回予告:画像のプロパティ、画像の重ね合わせ、キーが押された情報を得る など 講義メモ:memo20250510.txt
:メッセージボックス、システム側からの必要に応じた再描画の確認、背景画像の描画 テーマ7 メッセージボックス ・フォームアプリケーションにおいてテスト用に短い文字列を表示させたい場合などに便利なのがメッセージボックス ・System.Windows.Forms.MessageBoxクラスの静的メソッドShow(string)に引数として表示させたい文字列を渡すだけで良い ・「OK」ボタンの表示により閉じることができる 演習7 システム側からの必要に応じた再描画の確認 ・描画処理のオーバライド(override void OnPaint())において、メッセージボックスを表示しよう ・これにより、システム側からの必要に応じた再描画が行われ、自動的にOnPaint()が呼び出されることを確認しよう ・フォームの一部を画面外に移動させてから、戻す時にシステム側からの必要に応じた再描画が起きて、OnPaint()が呼び出されることがわかる 作成例 //演習7 システム側からの必要に応じた再描画の確認 using System; //C#標準クラス用 using System.Windows.Forms; //C#が提供するApplication、Formクラス用 using System.Drawing; //Sizeクラス用 class Program : Form { //Formクラスの派生クラス protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド base.OnPaint(e); //元のメソッドの内容を呼び出す MessageBox.Show("OnPaintが呼ばれた"); //【追加】 } static void Main() { //実行用メソッド(publicはなくてOK) Program f = new Program(); //自クラスのインスタンスを生成 f.Text = "Game"; //Form名を設定 f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定 Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成 f.Location = p; //インスタンスプロパティで初期位置を設定 f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化 f.ControlBox = false; //コントールボックスの非表示 f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定 Application.Run(f); //生成済のインスタンスを実行 } } テーマ8 フォーム上への画像の描画 ・画像ファイルをプロジェクトに配置することで、フォーム上に描画できる ・画像ファイルの形式としてはjpeg、bmp、gifなどに対応している ・描画の手順 ① System.Drawing.Imageクラスの静的メソッドFromFile(string)に、画像ファイル名を渡すと、Imageクラスのオブジェクトが生成される ② 描画処理の中で、System.Drawing.Graphicsクラスの静的メソッドDrawImage(Image, int, int)に、①とX座標、Y座標を渡すと、指定した位置に画像が描画される ・なお、X座標、Y座標はフォームの左上隅を(0,0)とする座標になる ・②で用いるGraphicsクラスのオブジェクトはOnPaintメソッドの引数「PaintEventArgs e」で得られるPaintEventArgsオブジェクトのGraphicsプロパティの戻り値で得る ・よって「e.Graphics.DrawImage(Image, int, int)」と呼び出せば良い 演習8 背景画像の描画 ・下記のテスト用画像をプロジェクトの\bin\debugフォルダにダウンロード…