【SDL2】ヘッダファイルのインクルード文をまとめる【ファイル分割】

SDLで使うライブラリ(補助ライブラリも含めて)は多いので、いちいちインクルード文を書くのがめんどくさいし、長くなってしまいます。

そこで、1つのファイルにまとめたいと思います。自作ヘッダファイルと呼ばれるもので、ゲーム制作は通常、メインのプログラムのファイルだけでなく複数のファイルからできています。

ということで今回はファイル分割のやり方を書いていきます。

ファイル分割とは?

通常、ゲーム制作などのプログラムのコードが長くなる場合は以下の2つにファイルを分割します。

  • 自作ヘッダファイル…メインプログラムの説明書
  • ソースファイル…メインのプログラム

ヘッダファイルには、インクルードするファイルやメインプログラムで使用する変数や関数をextern宣言(他のファイルにも使える形で宣言だけ行う)をします。ソースファイルの方は、メインの動作するプログラムを書いていきます。

なのでファイル分割は、コンピュータネットワークにおけるプロトコルみたいなところです。(わかりにくい例ですいません笑)

要は各ファイに役割を分担させます。

extern宣言とは、異なるソースファイルで変数や関数を共有できるようにヘッダファイルで宣言することです。(ただし、定義はしない)
本来は、ゲーム内で使用する変数や関数をextern宣言するが今はまだ初期段階なので後に回します。まだ知らない人も今はほっといても大丈夫です。

ファイル分割するメリット

ファイル分割する理由lは以下です。

  • ソースファイルの記述量を減らすことができる
  • プログラムの構成が分かりやすくなる
  • 違うファイル間でも変数や関数は共有される

記述させる内容を分けれるので、とても便利です。他の人にも分かりやすくなります。

ファイル間での変数と関数が共有できるのは強力です。何なら、ソースファイルも分割することができてしまいます。通常はソースファイル1つにつき、ヘッダファイル1つ書きます。

ファイル分割はチームでの開発などにも役に立つので知っておいて損はないです。というか、必須です!

ヘッダファイルの重要性

ヘッダファイルに関しては上のようなメリットがありますが、プロジェクトやゲーム制作を効率よく進めることができます。

個人的には次の2つが重要かなと思います。

  • 全体像が見える
  • エラーの対処がしやすくなる

普通はヘッダファイルで使う変数や関数をある程度書いてから、ソースファイルにプログラムを書いていきます。

あらかじめ自分で必要な関数を把握することができ、全体像をイメージしやすくなります。

また、エラーが起こった場合に原因の該当箇所が分かりやすくなります。このように問題を分割して対処できるのでやりやすいです。

ファイル分割の手順

ヘッダファイルのうんちくはここまでにして、ファイル分割をしていきます。

今回設定するヘッダファイルの手順の大まかな内容はこちらです。

  1. ヘッダファイルの作成(Xcode)
  2. SDLの補助ライブラリのヘッダファイルをまとめておく
  3. ヘッダファイルの書き方
  4. フレームワーク内のファイル名を変更

順番に説明していきます。

ヘッダファイルの作成(Xcode)

ヘッダファイルはXcode内で簡単に作成することができます。

 

まず、横のプロジェクト内のフォルダをクリックして、「Header File」選択します。そして、「Next」で次に進みます。

 

ファイル名とファイルの保存先を決めます。

ファイル名は自分が分かりやすいものでOKです。僕はSDLの補助ライブラリのヘッダファイルをまとめたかったので「SDL_all.h」というファイル名にしました。僕と同じファイル名にすると、後のコードをそのままコピペするとこができます。

なので、特にこだわりがない人は僕と同じにしておくといいです。

ファイルの保存先はそのままゲーム作成用のフォルダでいいと思います。

 

設定が完了すると、ヘッダファイル「SDL_all.h」が追加されていると思います。

SDLの補助ライブラリのヘッダファイルをまとめておく

最初にSDLの補助ライブラリのヘッダファイルを1つのフォルダにまとめて、「/usr/local/include」の直下にそのフォルダを置くことにします。

と言うのも、SDLの補助ライブラリは別のところからインストールしているので、「/usr/local/include」以下にヘッダファイルは保存されていないからです。

各補助ライブラリのヘッダファイルはバラバラに保存されていて、いちいちパスを調べるのがめんどくさいので、ヘッダファイルは全て同じ箇所に置いておくことにします。

Homebrew以外で補助ライブラリをインストールした方は、「/usr/local/include/SDL2」に補助ライブラリのヘッダファイルがあるかもしれません。その場合はこのステップは必要ないです。
「/usr/local/include」は前々回に設定した「Header Search Paths」のことです。ヘッダファイルは「/usr/local/include」の直下から指定するようにしていました。

この2つの補足に関しては自分に合わせて調節してください。特に、「Header Search Paths」が僕と違う場合は注意が必要です。

 

まず、「/usr/local/include/SDL2」に「SDLaux」というフォルダを作成しておきます。フォルダ名は何でもいいですが、僕と同じにしておくとやりやすいです。

この「SDLaux」に補助ライブラリのヘッダファイルをコピペしていきます。

 

Homebrewでインストールした人は、補助ライブラリのヘッダファイルは「/usr/local/Cellar/」にあります。

 

別にコピペじゃなくて移動させてもいいのですが、自分が作ったファイルでもないのでダウンロードしたものは残しておきます。

何か不具合が生じた場合はSDLauxのフォルダまたはヘッダファイルを消してまたコピペできますから。

auxというのは、「補助」という意味があることからファイル名に採用しました。

使用するヘッダファイルのパスが変わったので、このままではダメなのですがそれは後で対処します。

ヘッダファイルの書き方

ヘッダファイルが作成できたので、ヘッダファイルにSDLの各補助ライブラリのヘッダファイルをインクルードさせます。

#ifndef〜#endif擬似命令というものを使います。これは簡単です。

#ifndef SDL_all_H:SDL_all_Hが定義されているか確認して、定義されていない時だけその後のプログラムをコンパイルする。

#define SDL_all_H:SDL_all_Hが未定義なら定義する。

#endif SDL_all_H:定義する範囲の終わりを示す。

これら(#がつく文)は、プリプロセッサ指令と呼ばれC言語のプログラム自体には関係しませんが、コンパイラに指令を与えます。

 

#ifndefと#endifの間にインクルードするヘッダファイルを全て記述します。

前回のコメントを非表示にするコードも書いておきます。詳しくは前回の記事を参考に→【Xcode】外部ライブラリのコメント不備の警告(Warning)を非表示にする

 

インクルードに関しては、「Header Search Paths」で指定していしたパスの続きから書きます。

↓コードははこちら。

//  SDL_all.h

#ifndef SDL_all_h
#define SDL_all_h

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"

#include 
#include <SDL2/SDL.h>
#include <SDL2/SDLaux/SDL2_framerate.h>
#include <SDL2/SDLaux/SDL2_gfxPrimitives.h>
#include <SDL2/SDLaux/SDL2_imageFilter.h>
#include <SDL2/SDLaux/SDL2_rotozoom.h>
#include <SDL2/SDLaux/SDL_image.h>
#include <SDL2/SDLaux/SDL_mixer.h>
#include <SDL2/SDLaux/SDL_net.h>
#include <SDL2/SDLaux/SDL_ttf.h>
#pragma clang pop

#endif /* SDL_all_h */

 

ソースファイルの方は、SDL_all.hをインクルードしますが、自作ヘッダファイルなので""で括ります。

前々回同様に、ウィンドウを表示させて確認してみます。

↓プログラムはこちら。

#include "SDL_all.h"

int main(int argc,char *argv[]){
    int close=0;
    SDL_Init(SDL_INIT_VIDEO);
    
    SDL_Window *window = SDL_CreateWindow("WindowTest",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,640,480,0);
    
    while(close==0){
        SDL_Event event;
        while(SDL_PollEvent(&event)){
        }
        if(event.type==SDL_QUIT)
            close++;
    }
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

これで1度ビルドして見ます。

 

エラーが出てしまいました。う〜ん残念…

フレームワーク内のファイル名を変更

このままでは進まないので、対処していきます。

 

エラーの詳細を見て見ると、SDL.hというファイルが見つからないと書いています。これも「Header Search Paths」の設定です。

SDL.hのパスは「/usr/local/include/SDL2/SDL.h 」なので、エラー箇所の#include "SDL.h"を#include "SDL2/SDL.h"にすればいいことがわかります。

gfxの4ファイルは1箇所ずつ、imageは4箇所、mixerは7箇所、netは5箇所、ttfは3箇所修正します。直してビルドし直すと次のエラー箇所が出てきます。

 

全て修正するとビルドが成功して、ウィンドウが表示されます。

長くなりましたが今回はこれで終わりです。

これでゲーム制作の下準備完了!

これで、ようやくちゃんとゲーム制作を始めることができます。まずはチュートリアルレベルのことをやっていきたいと思います。

SDLの情報はネットにそこまで散らばっている訳ではありませんが、調べつつも自分でも考えながら挑戦していきます。進捗状況はTwitterとこのブログに載せていきます。

こうやって記事にまとめるのは意外と時間がかかったりと大変ですが、ちゃんと全部載せます!

それでは次回もお楽しみに!

コメント

タイトルとURLをコピーしました