とても久しぶりに DXライブラリ を覗いてみたら、とても現役で利用されているようなので、VisualC# 用パッケージをダウンロードして、シューティング部分を実装してみました。 C++ で作成したのは、2006年なので、もう11年経ってますが、更新履歴を見たらずっと途切れなくあったので、凄いなぁと感心するばかりです。 ダウンロードしたサンプルは VisualStudio2015 とありますが、手元の VisualStudio2013 で動作しています。まあ、DLL 読んで使ってるだけだから、動くはずですけれど。 以下は Program.cs の中そのままです。
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using DxLibDLL; namespace VisualStudio2015 { static class Program { const int SHOT_STRAIGHT = 0; const int SHOT_LEFT = 1; /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { // ウインドウモードで起動( コメントにするとフルスクリーン ) DX.ChangeWindowMode(DX.TRUE); // DXライブラリの初期化 if (DX.DxLib_Init() < 0) { return; } // 描画先を裏画面に変更 DX.SetDrawScreen(DX.DX_SCREEN_BACK); // 画像の読み込み int GraphHandle = DX.LoadGraph("play.bmp"); // 画像の縦横サイズ int gsize = 64; // 弾の存在フラグ等の属性を持つクラス Shot[] shot = { new Shot(), new Shot() }; // 初期位置 int x = 300, y = 400; // メインループ while (DX.ProcessMessage() != -1) { // ESC で終了 if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) == 1) { break; } // 右矢印キー if (DX.CheckHitKey(DX.KEY_INPUT_RIGHT) == 1) { x += 3; if (x + gsize > 640) { x = 640 - gsize; } } // 左矢印キー if (DX.CheckHitKey(DX.KEY_INPUT_LEFT) == 1) { x -= 3; if (x < 0) { x = 0; } } // スペースキー if (shot[SHOT_STRAIGHT].exist == 0) { if (DX.CheckHitKey(DX.KEY_INPUT_SPACE) == 1) { shot[SHOT_STRAIGHT].exist = 1; shot[SHOT_STRAIGHT].x = x; shot[SHOT_STRAIGHT].y = y; } } // Zキー if (shot[SHOT_LEFT].exist == 0) { if (DX.CheckHitKey(DX.KEY_INPUT_Z) == 1) { shot[SHOT_LEFT].exist = 1; shot[SHOT_LEFT].x = x; shot[SHOT_LEFT].y = y; } } // 画面をクリア DX.ClearDrawScreen(); // プレイヤーを描画 DX.DrawGraph(x, y, GraphHandle, DX.TRUE); // 弾1を描画 if (shot[SHOT_STRAIGHT].exist == 1) { shot[SHOT_STRAIGHT].y -= 8; if (shot[SHOT_STRAIGHT].y < 0 - gsize) { shot[SHOT_STRAIGHT].exist = 0; } } if (shot[SHOT_STRAIGHT].exist == 1) { DX.DrawGraph(shot[SHOT_STRAIGHT].x, shot[SHOT_STRAIGHT].y, GraphHandle, DX.TRUE); } // 弾2を描画 if (shot[SHOT_LEFT].exist == 1) { shot[SHOT_LEFT].y -= 8; if (shot[SHOT_LEFT].y < 0 - gsize) { shot[SHOT_LEFT].exist = 0; // 方向を左へリセット shot[SHOT_LEFT].direction = 0; } else { if (shot[SHOT_LEFT].direction == 0) { shot[SHOT_LEFT].x -= 8; } if (shot[SHOT_LEFT].direction == 1) { shot[SHOT_LEFT].x += 8; } if (shot[SHOT_LEFT].x < 0) { shot[SHOT_LEFT].direction = 1; } if (shot[SHOT_LEFT].x > 640 - gsize) { shot[SHOT_LEFT].direction = 0; } } } if (shot[SHOT_LEFT].exist == 1) { DX.DrawGraph(shot[SHOT_LEFT].x, shot[SHOT_LEFT].y, GraphHandle, DX.TRUE); } // 裏画面の内容を表画面に反映する DX.ScreenFlip(); } // DXライブラリの後始末 DX.DxLib_End(); } private class Shot { public Shot() { this.exist = 0; this.direction = 0; } public int exist { get; set; } public int x { get; set; } public int y { get; set; } public int direction { get; set; } } } }
play.bmp は適当に背景透過で 64x64 のサイズのものを使って下さい。元々のサンプルの実行フォルダに Src1.bmp という画像があります。それと同じ場所に置いて下さい。 ※ 自分が使っているのは、11年前に作ったドット絵 ※ 弾の時に、回転させたりしてたので、いびつな輪郭です。 仕様としては、以下のようなものです。 1) ESC で終了 2) 左右矢印キーで、プレイヤーキャラクタ(画像)を移動できる 3) SPACE キーで直線の弾 4) Zキーで、左斜めへの弾(跳ね返ると右へ) 5) プレイヤーキャラクタと弾の画像は同じ ※ 弾は二種類で、それぞれキーに依存。 ※ 弾が画面内に一つある場合、二つ目は打てない ※ 違うキーの弾は同一画面に存在できる なので、キーを増やして弾の種類を増やすのは比較的容易なはずです。ただ、ソースコードが長くなるので、それぞれはメソッドやクラスに変えるべきですけれど。 画像は弾毎に変えればいいし、左から右へ移動するだけの敵を作成して、あたり判定して爆破するのもそう難しくは無いと思います。 仕上げとしては、爆発アニメーションを組み込んで、背景を組み込んで左右のキーで背景を反対方向に移動させるとそれなりに見えると思います。
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート