テキスト編次回予告:p.323「例外処理の基礎(tryブロック・catchブロック)」から ゲーム開発演習次回予告:キーボードの状態を得る、画像の左右移動、簡易アニメーション など 講義メモ:memo20250712.zip
for trainees of Hirano's class only
テキスト編次回予告:p.323「例外処理の基礎(tryブロック・catchブロック)」から ゲーム開発演習次回予告:キーボードの状態を得る、画像の左右移動、簡易アニメーション など 講義メモ:memo20250712.zip
ゲーム開発演習:画面遷移、タイマー処理 など テーマ20 画面遷移【再掲載+α】 ・タイトル画面とプレイ画面とゲームオーバー画面のように、画面が移り変わることを画面遷移という ・画面ごとに違うプログラムを用意して呼び出すこともあるが、プログラム内で「今はどの画面なのか」を変数で保持すればシンプルに記述できる ・この変数をゲームモードやシーン等と呼び、プログラム内で共有することで、画面遷移を見やすく記述できる ・ゲームモードやシーンに用いる値は列挙型(p.66)にすると意味がわかりやすくなる ・構造例: class クラス名 : Form { //Formクラスを継承 enum { TITLE, PLAY, OVER }; //タイトル画面、プレイ画面、ゲームオーバー画面 int ゲームモード = TITLE; その他の初期化処理を記述 protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド 全画面に共通の描画処理 ゲームモードがTITLEならばタイトル画面を描画 ゲームモードがPLAYならばプレイ画面を描画 ゲームモードがOVERならばゲームオーバー画面を描画 } public static void Main() { //実行用メソッド : } クラス名() { //コンストラクタ : } キー押し下げ時に実行されるメソッド { 共通処理(Escキーが押し下げられたら終了) ゲームモードがTITLEの時にEnterやSpaceキーが押し下げられたらゲームモードをPLAYに ゲームモードがOVERの時にEnterキーが押し下げられたらゲームモードをTITLEやPLAYに } } テーマ21 画面再描画【再掲載】 ・プログラム側で画面を書き換えても、そのままでは実画面には反映しない ・そのため、画面再描画をシステムに依頼する必要がある(OnPaintの直接実行は不可) ・画面再描画をシステムに依頼するにはContolクラスの静的メソッドInvalidateを引数なしで呼べばよい(「Contol.」は省略可) ・書式:Invalidate(); //画面再描画を依頼 演習21 タイトル画面の表示とプレイ画面への遷移 ・テーマ20「画面遷移」の「構造例」を実装してタイトル画面の表示とプレイ画面への遷移を確認しよう ・タイトル画面は中央に「GAME」、中央下に「Hit Enter Key」と適当なフォントで表示 ・プレイ画面は中央に「START」と適当なフォントで表示 ※チェス盤、機体などの描画はいったん削除 ・エンターキー(キーコード:return)が押されたら、プレイ画面に遷移する ・この時、画面がチラつくが、対処は次のテーマで扱う 作成例 //演習21 タイトル画面の表示とプレイ画面への遷移 using System; //C#標準クラス用 using System.Windows.Forms; //Application、Formクラス用 using System.Drawing; //Size、Graphics、Image、Penクラス、Color構造体用 class Program : Form { //Formクラスの派生クラス enum mode { TITLE, PLAY, OVER }; //タイトル画面、プレイ画面、ゲームオーバー画面 mode scene = mode.TITLE; //シーンをタイトル画面とする Image backi; //画像ファイル用変数…
テキスト編:p.310「12.5 イベント」から ゲーム開発演習:画面遷移、タイマー処理 など p.310 12.5 イベント ・コンソールアプリケーションにおける Console.ReadLine()メソッドのように、起動したプログラムが動的に情報を得る 手段がある ・しかし、Console.ReadLine()メソッドは単なる入力待ちであり、プログラム側からの制御はできない ・そこで、あらかじめ「これが起きたらあれをする」という定義をしておき、必要時に動的に呼び出される仕掛として、 イベント機能が提供されている。 ・キー入力、マウスの操作、通信の受信、時間の経過などの「何かが起きた」ことをイベントの発生という。 ・イベントに対して処理を実行するものをイベントハンドラという。 ※Java言語などではイベントリスナといい、C#の書籍においてもイベントリスナとされていることがある。 ・C#では主にフォームアプリケーションでイベントを扱うが、コンソールアプリケーションでもデリゲートを用いることで、 イベント処理の実装が可能。 ・例えば、Enterキー以外のキーの入力を即時に受け取るプログラムを記述できる。 p.312 イベントのプログラミング ・コンソールアプリケーションでもデリゲートを用いてイベント処理を実装する場合の例(クラス側): ① 戻り値なし、引数なしのデリゲートを宣言する ② イベントの発生を担うクラスを定義する ③ ②の中に①を用いるイベントフィールドを定義する 書式: public event デリゲート名 イベント名; ④ ②の中にイベントを発生させるメソッドを定義(「Onイベント名」というメソッド名を推奨) ⑤ ④の中で「イベント名();」を実行することでイベントを発生させる。 ただし、イベントフィールドの準備ができていないときに動作するのを避けるために、イベント名がnullではないか をチェックすること ・コンソールアプリケーションでもデリゲートを用いてイベント処理を実装する場合の例(Main()側): ① イベントの発生により動作させたいメソッドを記述しておく。 ② main()の中で、イベントの発生を担うクラスのインスタンスを生成。 ③ main()の中で「②.イベントフィールド」に対して、マルチキャストデリゲートの書式で①を登録 ④ main()の中で「②.Onイベント名()」メソッドを呼び出すことで、イベントを発生させる ・なお、上記は説明用に、無理矢理イベントを起こさせる構成になっている p.313 event01.cs //p.313 event01.cs using System; delegate void MyDelegate(); //イベントで用いるデリゲートを宣言 class MyEventClass { //イベントの発生を担うクラス public event MyDelegate eventname; //イベントフィールドを定義(デリゲートを利用) public void OnEventname() { //イベントを発生させるメソッド if (eventname != null) { //イベントフィールドが準備済ならば eventname(); //イベントを発生させる } } } class MyClass { //イベントで呼び出されるメソッド①を持つクラス public void show() { //イベントで呼び出されるメソッド① Console.WriteLine(“show”); } } class MyClass2 { //イベントで呼び出されるメソッド②を持つクラス public void show2(){ //イベントで呼び出されるメソッド② Console.WriteLine(“show2!!”); } } class event01 {…
ゲームソフト販売本数ランキング:今週1位も「マリオカート ワールド(Switch2)」 GO! ゲーム領域で停滞も…高収益体質を築いたSHIFTの戦略的人材強化【ゲーム企業の決算を読む】GO! AI時代のゲームインフラとセキュリティ―ゲーム開発者が知るべき最新テクノロジーをアカマイが解説【CEDEC 2025】GO! モノリスソフト東京オフィスが人材を積極募集中―「ゼノブレイド」シリーズ総監督の「新作RPG」に向けた動き? GO! トランプ政権で“デジタル遺産の危機”に直面…保管プロジェクトや教育ゲームも支援打ち切りで資金難に GO! スイッチ海賊版サイト「Nsw2u」をFBIが摘発。現在はアクセス不可に GO! 中古スイッチソフト使用でスイッチ2が遠隔BAN!?迅速対応で一安心も復旧にゲームのパッケージ写真等の証明必要に GO! PC全年齢向け人気タイトルがSteamではコンソール版相当の内容に、なぜ?―お詫び文掲載の事態に…国内メーカー悩ます、ユーザーとプラットフォームの板挟み GO!