C言語 入門 STGの作り方

二日目 最低限のプログラム

初心者向けSTG作成入門

HOME/STGの作り方 目次/二日目 最低限のプログラム/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

最低限のプログラム

まずはDXライブラリを使う上での最低限のプログラムを見てみましょう!

#include "DxLib.h"

int my_get_key(void);

int key[256];
int gamecount;

int Color_White;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	/*ここは最初の一度だけ実行されるので*/
	/*変数の初期化などを書く*/
	gamecount = 0;
	Color_White = GetColor(255,255,255);

	while (ScreenFlip()==0 && ProcessMessage()==0
		 && ClearDrawScreen()==0 && my_get_key()==0){

		/*ここにメインプログラムを書く*/
		
		DrawFormatString(0,0,Color_White, "%d",gamecount);
		gamecount++;
		
	}
	DxLib_End();
	return 0;
}
	
int my_get_key(){
	char keys[256];
	GetHitKeyStateAll(keys);
	for (int i = 0; i < 256; i++){
		if (keys[i] != 0){
			key[i]++;
		}
		else{
			key[i] = 0;
		}
	}
	return 0;
}

■実行結果■

画像(s-2-1)

左上に勢いよくカウントアップされる数字が表示されれば成功です。

DXライブラリは簡単だと聞いていたのに話が違うじゃないか!

と思われた方はご安心ください。

この「最低限のプログラム」以外はほぼ入門時に習ったであろうC言語のお作法で大丈夫です。

コメントの場所にプログラムを書いていく感じになります。

※メインプログラムという部分が高速で繰り返されるので、初期化などは必ずその前のコメントの部分で行うようにしてください。もしわかりずらかったら中間ソースと見比べながら進めてください。

C言語を初めた時に意味もわからず

#include <stdio.h>

int main(){
	
	printf(""hello world!");
	
	return 0;
}

「hello world」していた時のように難しい事は置いといてまずはカタチから入りましょう。

DXライブラリ初体験の方へ

少し説明します。

まずプログラムの種類が今までの「コンソール画面」に文字だけ表示する「コンソールアプリケーション」から「ウィンドウ画面」にグラフィックも表示できる「Win32アプリケーション」に変わります。

そのため昔の

int main()

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

になります。

そして本来この「Win32アプリケーションプログラム」を作るのは「DirectX」という大変難しい技術を使いこなさなければいけないのですが、そこにこの「DXライブラリ」が登場した事によって誰でも簡単に「Win32アプリケーションプログラム」を作れるようになったというワケです。

DXライブラリの関数

さきほどのプログラムで使われているDXライブラリの関数を軽く紹介したいと思います。

初期化関係

DxLib_Init();
DxLib_End();

DXライブラリの初期化と終了を行います。

ウィンドウ

ChangeWindowMode(TRUE);

(640×480)のウィンドウを作ります。

画面表示関係

SetDrawScreen(DX_SCREEN_BACK);
ScreenFlip();
ClearDrawScreen();

アニメーションの際の画面の「ちらつき」を抑える裏画面処理というものです。「SetDrawScreen(DX_SCREEN_BACK);」で画面の後ろに完全に描き切った画像を「ScreenFlip();」で表へ表示します。「ClearDrawScreen();」で前の画面を消去します。

実は画面は目に見えないすごい早さで画面を書き換えているのですが、この書き換えのタイミングを無視してアニメーションを入れるとアニメーション自体の画像を描くタイミングとこの画面の書き換えのタイミングが合わなくなって非常に「ちらつく」のです。

その他

ProcessMessage();

いろいろなアプリケーションが同時に動くいわゆる「マルチタスク」環境において他のアプリケーションと適切に連携をとるための処理をしております。

これ以上は少し小難しい話になるのでそういうものだと軽く受け流しましょう。

入力関係

GetHitKeyStateAll();

これはキーが押された時に押されたキーも含め全てのキーの入力情報を取得するものです。

今はとりあえずグローバル変数「key」に保存して後ほど処理を加えていきます。

そしてこれらを「while」ループで回してその中にプログラムを書いていくような感じになります。それぞれの「==0」というのはエラー処理になります。「0」以外はエラーになります。

少し話が長くなりましたが「最低限のプログラム」の内容はざっとこんな感じです。STG作成以外でも使えるのでコピペして使いまわしましょう。

ゲーム内の時間

それではDXライブラリの関数を説明しながら少しずつ本題に入っていきます。

DrawFormatString(x座標,y座標,色の指定, "本文",変数);

まずこちらは見た感じわかりそうですが文字を表示する関数です。座標は初期状態では左上が(0,0)右下が(639,479)になるので

画像(s-2-2)

さきほどのプログラムでは左上に表示されます。色の指定というのは

GetColor(赤,緑,青);

こちらの関数を使います。赤・緑・青の色の度合いを「0〜255」で指定します。出来上がった色をint型の変数に保存します。

あとは「printf()」同じく変数を「%d」などで表示する事ができます。

複数表示したい場合も「,」カンマで分けて追加していけば大丈夫です。

そして上のプログラムでは「gamecount」という変数を表示しているワケですが、こちらの変数は画面表示処理の「while」ループ内で

gamecount++;

インクリメントしてますよね。これは画面の書き換えの早さに合わせてインクリメントしているという事になります。

そしてこの早さは決まっているので(ディスプレイによって違います。ほとんどのディスプレイは1秒間に60回です)これをゲーム内での仮の時間としてしまおうというワケです。

例えば「gamecount」が「300」になったらイベントを起こすとか「1000」になったら次のステージとかそんな感じです。

そしてこれはキャラクターの移動速度などにも関わってきます。

文字移動プログラム

このへんはやってみた方が早いと思いますので次のプログラムを実行してみてください。

#include "DxLib.h"

int my_get_key(void);

int key[256];
int gamecount;

int x;

int Color_White;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);

	/*ここは最初の一度だけ実行されるので*/
	/*変数の初期化などを書く*/
	gamecount = 0;
	x = 0;
	Color_White = GetColor(255,255,255);

	while (ScreenFlip()==0 && ProcessMessage()==0
		 && ClearDrawScreen()==0 && my_get_key()==0){

		/*ここにメインプログラムを書く*/
		
		DrawFormatString(x,240,Color_White, "(^o^)");

		x++;
		if(x == 639)x = 0;
		
		gamecount++;
		
	}
	DxLib_End();
	return 0;
}
	
int my_get_key(){
	char keys[256];
	GetHitKeyStateAll(keys);
	for (int i = 0; i < 256; i++){
		if (keys[i] != 0){
			key[i]++;
		}
		else{
			key[i] = 0;
		}
	}
	return 0;
}

■実行結果■

画像(s-2-3)

左から右へ移動する文字を確認できたと思います。

「gamecount」の早さを座標に置き換えるとこんな感じになります。

要はこの画面切り替えの速度を基準として他の早さも決まるという事です。

ここまでの中間ソースになります。

中間ソース1

では「最低限のプログラム」の準備ができたところで次回は簡単な背景を書いてみましょう。

次回

三日目 簡単な背景

□ページの先頭へ□

□HOME□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本

□ページの先頭へ□

□HOME□