Micomprocedure Wiki
Inner/役職ソート/プログラミング/2013プログラミング講習会/第3回
をテンプレートにして作成
開始行:
#contents
*ゲームプログラミングとは何か? [#d15e289f]
今回より、いよいよゲームプログラミングに入ります。
ゲームとは、(今日においては)一言で言ってしまえば&sizex(+1){ユーザー参加型パラパラ漫画};です。
すなわち、
(1) 裏画面をクリアする
(2) 裏画面に必要な要素を描画する
(3) 表画面を上書きする
(4) (1)に戻る
というループによって高速で画面を切り替えることにより、パラパラ漫画やアニメと同じ原理によってあたかも画面が動いているように見えるのです。
* 実際に動かしてみよう [#if300dfc]
以下のサンプルコードを貼り付け、コンパイル&実行してみよう(クリックで展開、ちょっと長いです)
#code(cpp,collapse:true,toolbar:true){{
#include<DxLib.h>
#include<cmath>
//画面の縦横サイズ
static const int width = 640;
static const int height = 480;
//円の位置
int circleX = width / 2;
int circleY = height / 2;
int circleR = 20; //円の半径
int circleSpeed = 10; //円が動くスピード
//円の移動量
double circleVX = 0;
double circleVY = 0;
//円を動かす
void CircleMove(){
int tempX = circleX + static_cast<int>(circleVX);
int tempY = circleY + static_cast<int>(circleVY);
//X軸方向の画面外判定
if(tempX - circleR < 0 || tempX + circleR > width){
circleVX *= -1;
tempX += static_cast<int>(circleVX) * 2;
}
//Y軸方向の画面外判定
if(tempY - circleR < 0 || tempY + circleR > height){
circleVY *= -1;
tempY += static_cast<int>(circleVY) * 2;
}
circleX = tempX;
circleY = tempY;
}
//円を描画
void CircleDraw(){
DrawCircle(circleX,circleY,circleR,GetColor(255,0,0));
}
//最初に実行されるmain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE); //ウィンドウで起動するように設定
if( DxLib_Init() == -1 ){ //DxLibの初期化
return -1; // エラーが起きたら直ちに終了
}
//最初の角度。0度から359度までランダムに求め、ラジアンに変換
double angle = GetRand(359) * DX_PI / 180;
circleVX = std::cos(angle)*circleSpeed;
circleVY = std::sin(angle)*circleSpeed;
SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面に描画する
for(;;){ //メインループ
ClearDrawScreen(); //裏画面を消去
CircleMove();
CircleDraw();
ScreenFlip(); //裏画面と表画面を入れ替え
if(ProcessMessage()==-1){break;} //エラーが起こったら異常終了
//Escキーで終了
if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_START ) != 0 ){break;}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
}}
* このコードを読んでみよう [#j1e7b9c7]
実行し、赤い円が画面を跳ねまわるのを確認しましたか?
そうしたら、コメントを参考にコードを読んで、どこで何をやっているかを把握してみましょう。
コードを読む上で参考になりそうな補足:
- ところどころに現れる
#code(cpp){{
static_cast<型>(変数);
}}
という構文は「キャスト」と呼ばれ(厳密には静的キャスト)、「ある型の変数を別の型に変換する」という構文です。
Cでは、全く同じ構文が
(型)(変数);
のように書けたため(のようにしか書けなかったため)、今でもこの書き方で書く人が多いです。
しかし、多少面倒くさくてもstatic_cast と書く書き方を推奨します。
(見た時にキャストしていることが分かりやすいですし、もし後から大量に書き換える必要が出てきた場合に楽です。)
他にも色々なキャストの種類があるので、興味がある方は調べてみてもいいかもね!
- 動かす関数(上記コードではCircleMove)と描画する関数(CircleDraw)は分けましょう。コードが見やすくなりますし、ゲームをポーズする処理を書く時などに楽です。
- 移動量を計算するためにはcosとsinを使う必要があります(簡単な高校数学)が、三角関数などの数学関係の関数はデフォルトでは使えません。
使うには、
#code(cpp){{
#include<cmath>
}}
と書き、STL(C/C++に標準で用意されたライブラリ群)の中の数学関係のライブラリをインクルードする必要があります。
* このコードを改造してみよう [#m73e14fa]
誰かと話し合っても一人で考えてもいいので、下記の課題をクリアしてみよう!
判らない方は聞いて頂ければヒントを差し上げます。
- 円の動きに「重力」をつけてみよう
- Zキー(もしくはパッドのボタン1)を押してる間だけ重力が働くようにしてみよう
- 円を画像に変えてみよう(グラフィック講習会で球を描いてきた人はそれを使うといいかも)
* 次回の予定[#q39c8c5a]
ファイル分割、配列、列挙体、typedef、クラスあたりをやれたらやりたいなぁ…
終了行:
#contents
*ゲームプログラミングとは何か? [#d15e289f]
今回より、いよいよゲームプログラミングに入ります。
ゲームとは、(今日においては)一言で言ってしまえば&sizex(+1){ユーザー参加型パラパラ漫画};です。
すなわち、
(1) 裏画面をクリアする
(2) 裏画面に必要な要素を描画する
(3) 表画面を上書きする
(4) (1)に戻る
というループによって高速で画面を切り替えることにより、パラパラ漫画やアニメと同じ原理によってあたかも画面が動いているように見えるのです。
* 実際に動かしてみよう [#if300dfc]
以下のサンプルコードを貼り付け、コンパイル&実行してみよう(クリックで展開、ちょっと長いです)
#code(cpp,collapse:true,toolbar:true){{
#include<DxLib.h>
#include<cmath>
//画面の縦横サイズ
static const int width = 640;
static const int height = 480;
//円の位置
int circleX = width / 2;
int circleY = height / 2;
int circleR = 20; //円の半径
int circleSpeed = 10; //円が動くスピード
//円の移動量
double circleVX = 0;
double circleVY = 0;
//円を動かす
void CircleMove(){
int tempX = circleX + static_cast<int>(circleVX);
int tempY = circleY + static_cast<int>(circleVY);
//X軸方向の画面外判定
if(tempX - circleR < 0 || tempX + circleR > width){
circleVX *= -1;
tempX += static_cast<int>(circleVX) * 2;
}
//Y軸方向の画面外判定
if(tempY - circleR < 0 || tempY + circleR > height){
circleVY *= -1;
tempY += static_cast<int>(circleVY) * 2;
}
circleX = tempX;
circleY = tempY;
}
//円を描画
void CircleDraw(){
DrawCircle(circleX,circleY,circleR,GetColor(255,0,0));
}
//最初に実行されるmain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE); //ウィンドウで起動するように設定
if( DxLib_Init() == -1 ){ //DxLibの初期化
return -1; // エラーが起きたら直ちに終了
}
//最初の角度。0度から359度までランダムに求め、ラジアンに変換
double angle = GetRand(359) * DX_PI / 180;
circleVX = std::cos(angle)*circleSpeed;
circleVY = std::sin(angle)*circleSpeed;
SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面に描画する
for(;;){ //メインループ
ClearDrawScreen(); //裏画面を消去
CircleMove();
CircleDraw();
ScreenFlip(); //裏画面と表画面を入れ替え
if(ProcessMessage()==-1){break;} //エラーが起こったら異常終了
//Escキーで終了
if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_START ) != 0 ){break;}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
}}
* このコードを読んでみよう [#j1e7b9c7]
実行し、赤い円が画面を跳ねまわるのを確認しましたか?
そうしたら、コメントを参考にコードを読んで、どこで何をやっているかを把握してみましょう。
コードを読む上で参考になりそうな補足:
- ところどころに現れる
#code(cpp){{
static_cast<型>(変数);
}}
という構文は「キャスト」と呼ばれ(厳密には静的キャスト)、「ある型の変数を別の型に変換する」という構文です。
Cでは、全く同じ構文が
(型)(変数);
のように書けたため(のようにしか書けなかったため)、今でもこの書き方で書く人が多いです。
しかし、多少面倒くさくてもstatic_cast と書く書き方を推奨します。
(見た時にキャストしていることが分かりやすいですし、もし後から大量に書き換える必要が出てきた場合に楽です。)
他にも色々なキャストの種類があるので、興味がある方は調べてみてもいいかもね!
- 動かす関数(上記コードではCircleMove)と描画する関数(CircleDraw)は分けましょう。コードが見やすくなりますし、ゲームをポーズする処理を書く時などに楽です。
- 移動量を計算するためにはcosとsinを使う必要があります(簡単な高校数学)が、三角関数などの数学関係の関数はデフォルトでは使えません。
使うには、
#code(cpp){{
#include<cmath>
}}
と書き、STL(C/C++に標準で用意されたライブラリ群)の中の数学関係のライブラリをインクルードする必要があります。
* このコードを改造してみよう [#m73e14fa]
誰かと話し合っても一人で考えてもいいので、下記の課題をクリアしてみよう!
判らない方は聞いて頂ければヒントを差し上げます。
- 円の動きに「重力」をつけてみよう
- Zキー(もしくはパッドのボタン1)を押してる間だけ重力が働くようにしてみよう
- 円を画像に変えてみよう(グラフィック講習会で球を描いてきた人はそれを使うといいかも)
* 次回の予定[#q39c8c5a]
ファイル分割、配列、列挙体、typedef、クラスあたりをやれたらやりたいなぁ…
ページ名:
サイト内を検索
AND検索
OR検索
操作メニュー
サークル情報
†
名称
東北大学文化部登録団体
東北大学マイコンプロシージャ
部室
川内北キャンパス内
川内サークル部室棟 4階
416号室
設立
1979年4月1日
(44年前)
活動内容
ゲームの制作・発表等
(
詳細
)
連絡先
こちら
↑
Twitter
†
@micom_procedure からのツイート
このウェブページについて
ここを編集
コンテンツ
†
トップページ
マイコンプロシージャとは?
公開中の作品
その他の作品
資料室
情報室
リンク
部内向けページトップ
最新の20件
2023年05月25日
ContactUs
2022年11月03日
公開中の作品/2021年度新入生プロジェクト/Gravity-Lost
公開中の作品/2021年度新入生プロジェクト/はるさがし
2021年12月13日
公開中の作品/2021年度新入生プロジェクト/落単・タイム・アタック!
公開中の作品/2021年度新入生プロジェクト/神社からの脱出
RecentDeleted
公開中の作品/2021年度新入生プロジェクト/THE Unexpected Fighting Operation
公開中の作品/2021年度新入生プロジェクト
2021年12月03日
公開中の作品/2020年度新入生プロジェクト/城熊
公開中の作品/2020年度新入生プロジェクト
2021年07月18日
公開中の作品
ProcGameJam9
Inneer/C++_const
2021年04月18日
公開中の作品/2020年度新入生プロジェクト/CrossFade
2021年04月17日
2021年度新歓情報
公開中の作品/2020年度新入生プロジェクト/TeamC no game
2021年04月07日
ようこそ
公開中の作品/2020年度新入生プロジェクト/トキノカダイ
2021年04月04日
2020年度新歓情報
2020年09月15日
ProcGameJam10
ここを編集