C言語でゲームを作ってみた(DXライブラリ)

この記事は [SLP KBIT Advent Calendar 2017](https://adventar.org/calendars/2492) の7日目の記事です。  


C言語に触れ始めてはや２年。
なんかゲーム作りたいな、なんてことを思っちゃった変な人です。  

# はじめに(嘘)

今回はタイトルにもあるようにC言語でゲームを作ってみた、というテーマでお送りします。  

C言語と戯れ始めてからはや２年、さもすればC言語の可能性に気づいてくるわけです(大嘘)。  
さて、冗談はこのくらいにしておいて本題に入りましょう。  

C言語でゲームと言われると皆さん何を想像しますか？ 

* ユーザーの入力の度に新しく出力された画面が出る
* 入力できる●、×等で全てを表現する
* あたまおかしい

このようなゲームをイメージすると思います。 少なくとも私はそうでした(最後以外は)。  
ですが、私たちが遊んでいるゲームはこのような仕様でしょうか？ どうぶつの森はキャラが動くたびにスマートフォンの画面をスクロールしなければならないでしょうか？ 答えは **否** です！

でもC言語でいい感じのゲームって作れるの？  
**実は作れるんです!!**

## 結果

先に結果だけを完結にお届けします。  
  
おまえ、実際ゲームを作れたのかよ……作れませんでした。なので申し訳ありませんが、作るための環境構築とおまけ、という形で行きます。

# はじめに(**真**)

はい、これが本当のはじまりです。
今回使うのは、DXライブラリという無料のパソコンゲーム開発用ライブラリです。このライブラリを用いれば Windows だけでなくAndroidアプリまでも作ることが可能になっています(派生でPSPもあったような)。

## 必要なもの

* [Visual Studio Community 2015](https://www.visualstudio.com/ja/vs/older-downloads/)
* [DXライブラリ Windows版 VisualStudio( C++ )用](http://dxlib.o.oo7.jp/dxdload.html)

上記の二つだけです。  
Visual Studio Visual Studio 2015 およびその他の製品、と書かれた項目から無償でダウンロードできます。  

DXライブラリ Windows版と書かれた項目のDXライブラリ Windows版 Visual Studio( C++ )用~ から無償でダウンロードできます。  
Visual Studio 2015 をできるだけ使用してください、2017の場合機能ごとにプログラムを分けた際、実行できませんでした。  
DXライブラリのダウンロードが終了したらダウンロードファイルの中にある、**プロジェクトに追加すべきファイル_VC用**というファイルを名前をDxlib等に変更し、ローカルファイルに移動しておきましょう。チーム開発をする際の面倒がなくなります。

## 環境構築

基本的な環境構築、お約束は[このページ](http://dxlib.o.oo7.jp/use/dxuse_vscom2015.html)を参考にしました。  
公式ページが日本語だとかなりやりやすいな、と思ったり。
~~ただチーム開発を行うときにパスが違い苦労したとかしなかったとか~~  

## 基本コード

環境構築の後はプログラミングのお時間です。  
基本的なコードを書いていきます。いわゆるお約束ですね。C言語で言うところのmain文です。DXライブラリを扱う際、main文ではなく、以下のように書きます。  

```C:main
#include "DxLib.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	if( DxLib_Init() == -1 )		// ＤＸライブラリ初期化処理
	{
		return -1 ;			// エラーが起きたら直ちに終了
	}

	DrawPixel( 320 , 240 , GetColor( 255,255,255 ) ) ;	// 点を打つ

	WaitKey() ;				// キー入力待ち

	DxLib_End() ;				// ＤＸライブラリ使用の終了処理

	return 0 ;				// ソフトの終了 
}
```
上記のコードはウインドウを生成し、点を描写するというプログラムです。  
すごい！これだけでなんかC言語っぽくない！(語彙力)

## 関数

C言語には様々な関数が存在しています。代表的なものがprintf関数などですね。しかし、これらの関数は使用しません。if文等はもちろん使用できますが、Dxライブラリ独自の関数を使っていきます。  
あぁ、またググっていろいろ探さないといけないのかぁ、と思った人！朗報です！  
なんと！ある程度の関数の説明は[このページ](http://dxlib.o.oo7.jp/dxfunc.html)に設けられています。しかも日本語！ **日本語！** すごく使いやすいです。  
でも使っているともっと便利な関数を使いたい！ なんて思うかもしれません。  
そんなときは、DxLib.h を直接覗いてみましょう。プロジェクトは作っているでしょうから、Solution Explorer の中の External Dependencies の中から DxLib.h を探しましょう。見つけたらそれを開き、Ctrl + F を押すと検索機能が出てくると思います。そしてしたい機能を入力してみましょう。  
コメントが日本語のため、欲しい機能があれば簡単に探すことができます。いやぁ、すごく便利です。英語から日本語に翻訳する手間が省けるのはすごくポイント高いですね。  
## Dxライブラリの動作

ここで簡単にDxライブラリの動作について言及していきます。Dxライブラリは言うなれば高速で紙芝居をしているようなものです。1秒間に60回紙芝居のページをめくり、1秒間に60回ページを作っているイメージです。大変そうですね、ですが、これをまず理解しておかないとwhile文の外に描画してしまい、点が消えなくなることがあります。  

## おまけ

![Baidu IME_2017-12-3_0-7-16.jpg](https://qiita-image-store.s3.amazonaws.com/0/219366/efd2c72b-b3c5-8b40-b2ae-00754381aaa1.jpeg)

プログラムC言語で書いたつもりなのになんでこんなにC++率高いのぉ。  
拡張子の問題ですね、こればかりはどうしようもない、妥協せざるを得ないところですね。  

# おわりに

C言語を学んできて基本的なことは押さえているつもりでしたが、ゲームを作るとなると勝手が違い、かなり戸惑いもありました。  
ですが、やはり自分でいろいろ作ることは楽しいです。これからもいろいろな言語にもふれていきたいですね。  
今回のプロジェクトですが、一応モックは作っているため、ちゃんとゲームとして成り立つように調整、改良が必要です。  
今後の課題  
* 当たり判定の追加
* プレイヤーの弾導入
* コードの簡略化  

などなど上げればきりがないのでこのあたりでやめておきます。  
個人的にはDXライブラリはとてもオススメなので触ってみてはいかがでしょう。
github 載せておきます。commitの数がえげつないのは失敗したから、ということで目をつぶってください
[https://github.com/kaede-1008/barrage-game](https://github.com/kaede-1008/barrage-game)