C言語使ってゲーム作る、というのを見ながらそのままコピぺした
・アフォBlog C言語勉強したけどゲーム作れないぞコラって人向けに
http://afoafodayo.blog84.fc2.com/blog-entry-549.html
こんなのがあったので、
ほぼコピペだけどやってみた。
#include "DxLib.h" #include <stdio.h> #include <stdlib.h> // rand,srand #include <time.h> // time /*-------------------------------------------------------+/ + マクロ(定数) /+-------------------------------------------------------*/ // 画像ファイル枚数 #define IMAGE_MAX 11 // 音声ファイル数 #define VOICE_MAX 5 // 音楽ファイル数 #define MUSIC_MAX 5 // エフェクト音ファイル数 #define EFFECT_MAX 5 // 画像ファイル保存ディレクトリ #define IMAGE_DIR "Image" // 音声ファイル保存ディレクトリ #define VOICE_DIR "Voice" // 音楽ファイル保存ディレクトリ #define MUSIC_DIR "Music" // 効果音ファイル保存ディレクトリ #define EFFECT_DIR "Effect" // 画面状態系 // * 種まき #define TANEMAKI 1 // * 成長 #define SUKUSUKU 2 // * やったね #define YATTANE 3 // かいわれの数 // * 暫定的にマクロにしておく #define KAIWARE_BRINGED 4 /*-------------------------------------------------------+/ + グローバル変数定義 /+-------------------------------------------------------*/ // リスト系 // * 画像のリスト int ImageList[IMAGE_MAX]; // * 音声のリスト int VoiceList[VOICE_MAX]; // * 音楽のリスト int MusicList[MUSIC_MAX]; // * 効果音のリスト int EffectList[EFFECT_MAX]; // * ない画像 int NoImage; // 画面サイズ系 // * X座標 int WindowWidth = 640; // * Y座標 int WindowHeight = 480; // 特殊 // * 右クリックで終了確認中のイベントストッパ int rightClickBlocker = 0; /*-------------------------------------------------------+/ + グローバル変数定義(セーブするもの) /+-------------------------------------------------------*/ // かいわれ設定系 // * 各かいわれの成長度 // * 0〜150 int KaiwareGrowPoint[KAIWARE_BRINGED]; // * 収穫数 int HavestCount = 0; // 現在のパート // * 処理の分岐に使う int part = TANEMAKI; // 何章か // * スタート時は1 int term = 1; // 日付 // * まぁこれは適当でもいいんだけど int date; /*-------------------------------------------------------+/ + 使用する関数達 /+-------------------------------------------------------*/ int LoadData(); void InitializeDisplay(); bool GameLogic(); bool ConfirmGameFinished(); void DrawBackGround(); void PlayMusic(char *filePath); void DrawImage(); void tanemaki(); void sukusuku(); void yattane(); // 初期処理 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 乱数の初期値のセット srand((unsigned) time(NULL)); // Windowモード指定 ChangeWindowMode(TRUE); // ウィンドウのサイズを変更 // * DxLib_Initの後に呼ぶと一瞬大きな画面が出てからリサイズされるらしい // * カッコ悪いので先に呼びましょう // * 解像度も指定しなければならないのですが32bitだと重いので16bitにします SetGraphMode(WindowWidth, WindowHeight, 16); // DxLib使えないとダメですよ、と if(DxLib_Init() == -1) { return -1; } // 裏画面を利用する SetDrawScreen(DX_SCREEN_BACK); // データのロード if (LoadData() == -1) { MessageBox(NULL, "データが破損しています", "読み込みエラー", MB_OK); return -1; } // 初期画面 InitializeDisplay(); // セーブデータがある場合ロード int loadFile; if ((loadFile = FileRead_open("Save\\data.txt")) != 0) { char buf[1024]; // 1行目は設定系 FileRead_gets(buf, 1023, loadFile); sscanf_s(buf, "%d,%d,%d,%d", &part, &term, &date, &HavestCount); // 2行目はかいわれの成長度リスト FileRead_gets(buf, 1023, loadFile); sscanf_s(buf,"%d,%d,%d,%d", &KaiwareGrowPoint[0], &KaiwareGrowPoint[1], &KaiwareGrowPoint[2], &KaiwareGrowPoint[3]); // ファイルハンドルをクローズ FileRead_close(loadFile); // セーブデータがあるって教える DrawString(100, 200, " --- セーブデータをロードします --- ", 0xFFFFFF); } // 裏画面を表に ScreenFlip(); // スクリーンをクリアする ClsDrawScreen(); // BGM PlayMusic("Music\\Beder.mp3"); // メイン処理のループ while (ProcessMessage() == 0) { // キー操作待ち // * イベントハンドラなどはパートで埋め込んでおく WaitKey(); // ゲーム終了確認画面 // * 右クリック時にイベント発生 if (ConfirmGameFinished() == true) { break; } // 左クリックで続行 if ((GetMouseInput() & MOUSE_INPUT_LEFT)) { int MouseClickX, MouseClickY; GetMousePoint(&MouseClickX, &MouseClickY); if((MouseClickX >= 0 && MouseClickX <= WindowWidth) && (MouseClickY >= 0 && MouseClickY <= WindowHeight) && rightClickBlocker != 1) { // ゲームの処理 if (GameLogic() == true) { break; } // 裏画面を表に ScreenFlip(); // スクリーンをクリアする ClsDrawScreen(); } } } // セーブデータ保存 // * サブルーチンにしたほうがいいよね { FILE *saveFile; saveFile = fopen("Save\\data.txt", "w"); // 1行目は設定系 fprintf_s(saveFile, "%d,%d,%d,%d\n", part, term, date, HavestCount); // 2行目はかいわれの成長度リスト fprintf_s(saveFile, "%d,%d,%d,%d", KaiwareGrowPoint[0], KaiwareGrowPoint[1], KaiwareGrowPoint[2], KaiwareGrowPoint[3]); fclose(saveFile); } // DxLibを終了する DxLib_End(); return 0; } // 初期データの読み込み int LoadData() { // かいわれデータの初期化 for (int i=0;i<KAIWARE_BRINGED;i++) { KaiwareGrowPoint[i] = 0; } // 画像を読み込む for (int i=0;i<IMAGE_MAX;i++) { // 画像のパス設定 char ImagePath[256]; sprintf_s(ImagePath, "%s\\%03d.jpg", IMAGE_DIR, i); // 画像読み込みに失敗した場合 if ((ImageList[i] = LoadGraph(ImagePath)) == -1) { return -1; } } // 特殊画像 if ((NoImage = LoadGraph("Image\\NoImage.jpg")) == -1) { return -1; } return 0; } // 初期画面 void InitializeDisplay() { // ゲームタイトル DrawString(100, 100, "かいわれげーーーーーむ!!!", 0xFFFFFF); // 説明がき DrawString(100, 300, "クリックするとはじまる!", 0xFFFFFF); } // ゲーム終了確認画面 bool ConfirmGameFinished() { int MouseClickX, MouseClickY; if ((GetMouseInput() & MOUSE_INPUT_RIGHT)) { rightClickBlocker = 1; GetMousePoint(&MouseClickX, &MouseClickY); if((MouseClickX >= 0 && MouseClickX <= WindowWidth) && (MouseClickY >= 0 && MouseClickY <= WindowHeight)) { if (MessageBox(NULL, "終了確認", "終了しますか?", MB_YESNO) == IDYES) { return true; } rightClickBlocker = 0; } } return false; } // ゲームのメイン処理 bool GameLogic() { // パート判別 switch (part) { case TANEMAKI: tanemaki(); break; case SUKUSUKU: sukusuku(); break; case YATTANE: yattane(); break; default: break; } return false; } // 背景描画 void DrawBackGround() { } // 音声再生 void PlayMusic(char *filePath) { int music = LoadSoundMem(filePath); PlaySoundMem(music, DX_PLAYTYPE_BACK); } // 画像描画 void DrawImage() { } /*-------------------------------------------------------+/ + ゲームの実際のパート + 後でクラス作る /+-------------------------------------------------------*/ // 最初の画面 // * 種まきです! void tanemaki() { // 背景描画 // DrawBackGround(); // テキスト表示 if (term == 1) { // 説明表示 DrawString(50, 10, "左クリックで種を蒔く", 0xFFFFFF); DrawString(50, 40, "右クリックで終了", 0xFFFFFF); } else { // 収穫数 DrawFormatString(50, 10, 0xFFFF00, "現在%3d個", HavestCount); } // 画像描画 for (int i=0;i<KAIWARE_BRINGED;i++) { // 各かいわれを表示 DrawGraph(i * 70 + 50, 100, ImageList[KaiwareGrowPoint[i]], FALSE); } // 開始メッセージ if (term == 1) { MessageBox(NULL , "ゲーム開始", "ゲームを開始します" , MB_OK); } // partをSUKUSUKUへ part = SUKUSUKU; } // お水をあげてスクスク育てます // * ふふん! void sukusuku() { // 背景描画 // DrawBackGround(); // 説明のテキスト DrawString(50, 10, "おみずをあげて すくすくそだてよう!", 0xFFFFFF); // 日付をプラス date++; // 画像描画 int maxCount = 0; for (int i=0;i<KAIWARE_BRINGED;i++) { // 0-10で, 5以下の場合成長 if (KaiwareGrowPoint[i] < 10 && rand() % 30 < 5) { KaiwareGrowPoint[i]++; // 効果音! PlayMusic("Effect\\NewType.wav"); // 10になったら収穫 if (KaiwareGrowPoint[i] == 10) { // 収穫数カウント HavestCount++; } } // MAXフラグのカウント if (KaiwareGrowPoint[i] == 10) { maxCount++; } // 各かいわれを表示 DrawGraph(i * 70 + 50, 100, ImageList[KaiwareGrowPoint[i]], FALSE); } // 日付 DrawFormatString(400, 0, 0xFFFF00, "%2d日 %2d/%2d", date, maxCount, KAIWARE_BRINGED); // MAXフラグが全部たってたらYATTANEへ if (maxCount == KAIWARE_BRINGED) { part = YATTANE; } } // void yattane() { // 背景描画 // DrawBackGround(); // 説明のテキスト DrawString(50, 10, "おめでとう!これで もくひょうは たっせいされたぞ!", 0xFFFFFF); // 戻るよってテキスト DrawString(50, 100, "クリックすると最初に戻ります!", 0xFFFFFF); // かいわれデータの初期化 for (int i=0;i<KAIWARE_BRINGED;i++) { KaiwareGrowPoint[i] = 0; } // 次の章へ term++; // 日付をリセット date = 1; // 初期画面へ part = TANEMAKI; }
というかC++勉強しなきゃ。