ゲーム制作RTA(VS2017、DXライブラリ使用)
- VS2017を起動
- ファイル->新規作成->プロジェクト
- Windowsデスクトップウィザード、ソリューションのディレクトリは作成しない
- Windowsアプリケーション(.exe)、空のプロジェクト
- ソリューションエクスプローラーのソースファイルを右クリック->追加->新しい項目->c++ファイル
- プロジェクト->(プロジェクト名の)プロパティ(なんか出てこない時があるので、ソリューションエクスプローラー内でソリューションを選択してもう一度行ったり他の項目を選択したりする)
- すべての構成に変更->構成プロパティ->全般->文字セット、マルチバイト文字
- 構成プロパティ->c/c++->全般->追加のインクルードディレクトリ、プロジェクトに追加すべきファイル_VC用のパス
- 構成プロパティ->リンカー->全般->追加のライブラリディレクトリ、プロジェクトに追加すべきファイル_VC用のパス
- Releaseの変更
- 構成プロパティ->c/c++->ランタイムライブラリ->コード生成、/MT
- Debugに変更
- 構成プロパティ->c/c++->ランタイムライブラリ->コード生成、/MTd
- プロパティページをokを押して閉じる
構築終了!
はい、こちらはccsアドベントカレンダー12月3日の記事です
前日の記事貼る
ccsアドベントカレンダー2019
https://adventar.org/calendars/4451
いつもゲー制するときは下のような感じでやってるので、ここからリファレンスを開くのが若干きつい、いい加減に作業工程覚えましょう
DXライブラリ様にはいつも大変お世話になっております(URL:https://dxlib.xsrv.jp/index.html)
一番下にデバック用にサンプルコード置いときますね(実際に作成したゲームとは若干異なるソースコードになります)
音と画像は適当に用意してください
なお、このサンプルコードに音素材として書かれているものは、魔王魂(URL:https://maoudamashii.jokersounds.com/)様から引っ張って、実際のゲームに使いました
めんどいことは実装しない主義のコードです
あと、main関数以下で具体的な数字は使わないようにしています(後で変更しやすいように)
嘘つきました
ここでがっつり使ってますね
文字出力関数の実装を当分の目標にします
因みに今のゲー制進捗は、作ってないとかいう驚きの白さです
#include<Dxlib.h>
#include<stdio.h>
#include<math.h>
constexpr auto NAME = 128;
constexpr auto RANGE = 30;
constexpr auto POWER = 100;
constexpr auto KEY = 3;
int width = 640;
int hight = 480;
int gamestate = 0;
int gameflag = 0;
int flag = 0;
int bgm;
int enemysound;
char name[NAME];
int grade;
int keyword[KEY];
int key;
unsigned int fontcolor = GetColor(255,233,115);
unsigned int backcolor = GetColor(237,121,135);
int gameendflag = 0;
int sceneflag = 0;
//キー取得用の配列
char buf[256] = { 0 };
int keystate[256] = { 0 };
void gamemain_update();
void gamemain_draw();
void move_player();
void keyupdate();
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
SetOutApplicationLogValidFlag(FALSE);//Log.txtを生成しないように設定
ChangeWindowMode(TRUE);//非全画面にセット
SetGraphMode(width, hight, 32);//画面サイズ指定
SetMainWindowText("いくぜ!よろしくお願いします!");//ウインドウに表示される名前を設定
SetAlwaysRunFlag(TRUE);//最小化状態でも処理を続ける
if (DxLib_Init() == 1) { return -1; }//初期化に失敗時にエラーを吐かせて終了
SetDrawScreen(DX_SCREEN_BACK);//描画先を裏画面に
//画像と音を読み込む
bgm = LoadSoundMem("DATA/game_maoudamashii_8_orgel06.mp3");
keyword[0] = LoadGraph("DATA/key0.png");
keyword[1] = LoadGraph("DATA/key1.png");
keyword[2] = LoadGraph("DATA/key2.png");
PlaySoundMem(bgm, DX_PLAYTYPE_LOOP);
while (ProcessMessage() == 0)
{
ClearDrawScreen();//裏画面消す
keyupdate();//キー入力状態を更新
if (keystate[KEY_INPUT_ESCAPE] > 0) {
break;
}
DrawBox(0, 0, width, hight, backcolor, TRUE);
//gamestateの値で分岐
switch (gamestate) {
case 0:
DrawFormatString(100, 100, fontcolor, "いくぜ!よろしくお願いします!");
DrawFormatString(100, 200, fontcolor, "音楽:魔王魂");
DrawFormatString(100, 300, fontcolor, "プログラム:ハトミ");
DrawFormatString(100, 400, fontcolor, "スペースキーで開始!");
if (keystate[KEY_INPUT_SPACE] == 1) {
gamestate = 1;
}
break;
case 1:
DrawFormatString(100, 100, fontcolor, "メーリス全体返信、文字化け、元気いっぱい!");
DrawFormatString(100, 200, fontcolor, "このゲームは大学祭開始のおよそ六時間前に製作開始されました");
DrawFormatString(100, 300, fontcolor, "とりあえずスペースキーを押せば幸せになれると思う");
DrawFormatString(100, 400, fontcolor, "スペースキーで開始!");
if (keystate[KEY_INPUT_SPACE] == 1) {
gamestate = 2;
}
break;
case 2:
gamemain_update();
gamemain_draw();
break;
case 3:
DrawFormatString(0, 80, fontcolor, "1.B2 2.%s", name);
DrawGraph(0, 100, key, 0);
DrawFormatString(100, 400, fontcolor, "スペースキーで終了!");
if (keystate[KEY_INPUT_SPACE] == 1) {
gameendflag = 1;
}
}
//無限ループを抜けゲーム終了
if (gameendflag == 1) {
break;
}
ScreenFlip();//裏画面を表画面にコピー
}
DxLib_End();
return 0;
}
void keyupdate()
{
GetHitKeyStateAll(buf);
for (int i = 0; i < 256; i++)
{
if (buf[i] == 1) {
keystate[i]++;
}
else {
keystate[i] = 0;
}
}
}
void gamemain_update()
{
DrawFormatString(0, 40, fontcolor, "名前を入力してね\n");
KeyInputString(0, 60, NAME, name, 1);
flag = GetRand(KEY);
if (flag == 0) {
key = keyword[0];
}
else if(flag == 1) {
key = keyword[1];
}
else {
key = keyword[2];
}
WaitTimer(1000);
gamestate = 3;
}
void gamemain_draw()
{
DrawGraph(0, 100, key, 0);
}