ブログ

勉強に役立つかもしれないゲームプログラミングPart2

 

こんにちは!武田塾垂水校の講師Iです。
前回は不完全なものかもしれませんがプログラミングソフトの導入までやりました。
あと宿題としてScratchは触ってみましたか?やってきてるなら良し!やってなくてもまあ良し!(?)
因みに触った方はプログラミングが大体どんなものか分かりましたか?
まあ「Scratchでも難しいわボケェ!」って人がいたらそのうちScratchの解説も軽くするかもしれません。
あとScratchはC言語と比べたら簡単ですが自由度はあまりないので物足りなく感じた人もいるかもしれません。自分も初めてScratchを触った時にそう感じました。
物足りないと思った方は安心してください!C言語ではもっといろんなことができますから!
という訳で今回から!やっと!C言語を教えます!
…とはいえどこから始めるかとか悩みどころがたくさんありますがね…。
因みに今回はいきなり理論から始めるのもどうかと思ったので一番目に見えて分かりやすいウィンドウの作成についてまとめたいと思います。

前回忘れていた環境設定

やっとC言語を教えますとか言っておきながらすっかり忘れていた環境設定をここで書いておきます(笑)
前回の記事に追記しようかと考えましたがvisual studioを扱う人全員が同じ設定でやるとは限らないのでこの記事で自分がプログラミングを教える人全員に前もって伝えようかなと思った次第です。
まず前回作ったプロジェクトをvisual studioで開いて右側にあるソリューションエクスプローラーにあるプロジェクト名を右クリックして「プロパティ」をクリックしてください

TakedaBlogPart3_01

TakedaBlogPart3_02

プロパティは一番下にあるので注意してください。
そしてプロパティを開いたらこんな感じのウィンドウが出てくると思います。

TakedaBlogPart3_03

そもそもプロパティ(property)というのは英語で「所有物・特性」と言った意味がありますが(この場合は特性の方が近いですね)
ここではいわゆるこのプロジェクト内における設定といった感じのものです。
因みにプロパティは画像とかいろんなものにあるので気になったらプロパティって項目を探して見てみるのもいいですね。
このプロパティで2つの項目をいじります。1つ目は「詳細」の項目にある「詳細プロパティ」の「文字セット」ってとこです。
クリックしたら右に下矢印マークが出るのでそこをクリックして「マルチバイト文字を使用する」に変更します

TakedaBlogPart3_04

そしてもう1つの項目ですが「リンカー」って項目をダブルクリックするか左にある三角形をクリックすると追加項目が下に出てきます。
その追加項目にある「システム」の「サブシステム」を変更します
これも例の如くクリックしたら右に下矢印マークが出るのでそこをクリックして「Windows(/SUBSYSTEM:WINDOWS)」(こうだったはず…)を選択しましょう。

TakedaBlogPart3_05

最後に右下にある「OK」をクリックしてこの作業は完了です
因みに自分は「適用」を押せと習いましたが「OK」を押しても問題ないと思います。
「適用」と「OK」の違いはウィンドウが閉じるかどうかの違いしか分かりませんし何故2つの項目を用意したのかは自分も知りません。気になった方は調べてみてください。
さて、環境設定の変更も終わったのでこれからウィンドウを作りたいと思います。

ウィンドウを出現させる

プログラミングをやってる人と言えば黒いコンソールにタカタカと文字を打ち込んでいき、Enterキーを押した瞬間に英語の文字列がズラーッと出てくる、みたいな印象を持ってる方が多いかもしれません。実際そんなやつが割とオーソドックスなのですが、これから教えるのはゲームプログラミングなのでそんなことはしません!(教える側からしたら結構な縛りプレイですけどね…?)
そんな訳でゲームの画面となるウィンドウをまずは表示させてみたいと思います。
といっても中身で何をやっているのかを細かく理解するのは難しいのでほんとに大事なところだけかなりざっくりと教えます。コードはとりあえずコピペで結構です。
とか言いつつコピペ出来なかったらすみません。コピペ出来ない場合はお手数ですが全て一文字の狂いもなく打ち込んでください。括弧1つでも間違えていると動かないと思うので頑張ってください。
(ここからwindowsAPIのコード)

#include <Windows.h>

#define CLIENT_W (640) //画面の横幅
#define CLIENT_H (480) //画面の縦幅

LRESULT CALLBACK WindowsProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{

//ここにソースコードを書く

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCMdShow
)
{

WNDCLASS wc;
HWND hWnd;
MSG msg;

//
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowsProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName = NULL;
wc.lpszClassName = "WindowsApp";

if (RegisterClass(&wc) == false) {
MessageBox(NULL, "ウィンドウの作成に失敗しました", "エラーメッセージ", MB_OK);
return 0;
}

hWnd = CreateWindow(
"WindowsApp",
"ウィンドウアプリケーション",
WS_OVERLAPPEDWINDOW,
100, 100,
CLIENT_W, CLIENT_H,
NULL,
NULL,
hInstance,
NULL
);

if (hWnd == NULL) {
MessageBox(NULL, "ウィンドウの作成に失敗しました", "エラーメッセージ", MB_OK);
return 0;
}

RECT rw, rc;
::GetWindowRect(hWnd, &rw);
::GetClientRect(hWnd, &rc);

int new_width = (rw.right - rw.left) - (rc.right - rc.left) + CLIENT_W;
int new_height = (rw.bottom - rw.top) - (rc.bottom - rc.top) + CLIENT_H;

::SetWindowPos(hWnd, nullptr, 0, 0, new_width, new_height, SWP_NOMOVE | SWP_NOZORDER);

if (hWnd != NULL) ShowWindow(hWnd, SW_SHOW);

while (GetMessage(&msg, NULL, 0, 0) > 0) {
DispatchMessage(&msg);
}

return 0;
}

これはwindowsAPIというシステムを用いてウィンドウを作り出すコードです。
このコードをコピペしたらショートカットキーとかで保存してとりあえず動かしてみましょう。打ち込んだコードを動かすには上にある緑の三角ボタンで書いたコードを実行できます。

TakedaBlogPart3_07

↓実行するとこんな感じのウィンドウが出てくると思います

TakedaBlogPart3_06

今はただのウィンドウが出てくるだけですが、「ここにソースコードを書く」と書いてるところにいろんな処理を書くと作り出したウィンドウの中で好き放題出来るという代物です。
因みに今はまだ中身を書いていない都合上ウィンドウを閉じただけではvisual studioは止まってくれません。なので上の方にある赤い四角のボタンを押して停止させましょう。

TakedaBlogPart3_08

ここで注意ですが経験者とかでもない限り基本的にこのウィンドウを表示させるコードは弄らないでください。windowsAPIをより深く理解したいとか思わない限りは弄らなくてもいいはずなので。
と…かなり長くなりましたが大事なところを解説していきます。

ざっくり解説!プログラミングにおける超基礎事項

さて、こんなくそ長いコードなのですが…大事なところは最初の3行だけです。
逆にこの3行はとても重要なことなので暗記パンを貪り食らってでも覚えましょう。

#include <Windows.h>

#define CLIENT_W (640) //画面の横幅
#define CLIENT_H (480) //画面の縦幅

この3行以降は今回は分からなくて結構です。指定したところに中身のコードを書くってこととそれ以外は基本いじらないってことだけ覚えてくれたらそれでいいです。
では最初の1行目ですが、これはライブラリというものを使用しますよ、という宣言をしています
学生の方々に分かりやすいように頑張って説明しますと授業の一番最初に先生が「教科書○○ページを開いてください」って言いますよね?あれと同じです。
今教科書の何処をやっているのか分かってない状態で授業を受けても何も分からないのと同様にコンピューターもどのデータを使えばいいのか分からない状態では何も出来ません。
なので一番最初に教えてあげる訳ですね。その教え方が

#include <「使いたいライブラリ」>

というコマンドです。今回はWindows.hというライブラリを使いますよ~と教えてあげてるわけですね。
因みにさっきから言ってるライブラリというものは関連しているコマンドをまとめたものです。教科書というよりかは公式集の方が意味は近いでしょうか。
まあそのコマンドにも(公式集なだけに)別の呼び方があるのですがそれはまた別の機会に…。
それはともかくwindowsAPIのコマンドはWindow.hというライブラリに入っているので今回このWindows.hを使用している訳です。
このライブラリにもいろいろあるのですがそれは他のものを扱う際に解説しようと思います。

次に2行目と3行目ですがこれは定義をしているだけです。
定義と言えば皆さん散々数学でやっていると思いますが(まだやってなかったらすみません)「曲線G:y=(x-2)²-4と直線L:y=x+2の交点のx座標をそれぞれs, tとする」みたいなかんじのことです。
書き方はなんとなく見て分かると思いますが一応詳しく書きます。

#define 「定義する定数の名前」 「その定数が持つ数値」

ここではそれぞれCLIENT_Wを640、CLIENT_Hを480と定義しています。因みに数字を囲ってる()はなくても問題なく動きます。
ここで定義をしておくと、この後でCLIENT_WやCLIENT_Hを使用した計算や処理を行おうとした際にコンピューターが勝手に数値に置き換えてくれます。便利ですね。
なんならwindowsAPIのコードの中でCLIENT_WとCLIENT_Hを使った処理がちゃんと書かれています。余裕のある人は探して見てください。でも絶対に書き換えないでくださいね?
因みに何故こんなことをしているのかというとマジックナンバーを消すためです。
マジックナンバーというのは傍から見て何を表している数字なのか分からない数字のことです。ここで定義をしておけば他の人がプログラムコードを見た際に「あ、CLIENT_Wは画面の横幅を表していて、640あるんだなあ」と分かってくれるのですが、定義をしなかった際は処理に直接640と数値を書き込むことになります。それでも別に動くのですが他の人が見た時に何の数値なのかがパッと見て分からないし人によっては書いた本人も分からなくなります。
なので分かりやすくまとめてる訳です。いやぁゴミカスコンピューターに配慮した上で人間どもにも気を配らないといけないとは…プログラマーって大変ですね…。

あと定義している横に「//画面の横幅」と書いていますがこれはコメントアウトといって、「//」と入力した右に何かメッセージを残すことが出来るという機能です。これをうまく活用するととても見やすいプログラムを書くことが出来ます。
そしてコンピューターは「//」の横に書いた文字を全て無視してくれます。なので安心してコンピューターのわr…もとい一個人としての意見を書き込めますね。
ついでにコメントアウトには他に「/**/」で囲うものがあるのですがこれは両端に書かないといけない反面途中で改行しても問題ないという利点があります。逆に「//」の場合は左側だけでいいのですが改行した場合は一行一行「//」を打たないといけません。
まあ範囲指定したら自動でコメントアウトしてくれるショートカットキーがあるんですけどね?(windowsはコントロールキーを押しながらKキー→Cキー、範囲内のコメントアウトを解除したいときはコントロールキーを押しながらKキー→Uキー)
今回大事なのはこの3点です。今後使うので絶対覚えましょう。

最後に

長々と解説していきましたが、今回はwindowsAPIを使ってウィンドウを表示させました。
ソースコードの中で大事な部分にも触れましたが結構英単語だったり数学の知識だったりいろんなことを使っていたと思います。
初投稿の記事でも言った通り割と学校の勉強で培った知識を使っています。
それを活用しながらプログラミングを学んでいくうえで今までやってきたことは無駄ではなかったと思ってもらったり、これを機に学習意欲を高めていってもらえたらなと思います。
それでは!

垂水校では無料受験相談を実施中


勉強でお悩みの受験生の方に向け

無料受験相談を実施しております。

「勉強方法が分からない」

「志望校の決め方が分からない」

「志望校合格に必要な勉強時間が知りたい」

など、お気軽にご相談下さい。

 

無料受験相談

あなたに合った勉強法を教えます!

無料受験相談に行ってみる