回答編集履歴
4
誤字
answer
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
もう解決されたことかとは思いますが,蛇足的に回答させていただきます.
|
2
2
|
暇つぶしにでも読んでください,私もterataill復帰がてらの回答です.
|
3
3
|
|
4
|
-
まずゲームつくりおよび,タグのC++からみて,C++での開発も視野に入れて質問されているのだと予想します.今の流行は前述の回答者の通り,C#ですが性能を求める,iosやandroidなどのwindows製品以外でゲーム開発をおこなう,このような用途ではC++も現役と言えるでしょう.UEもblueprintだとかいう機能があったと思いますが,基本的にはC++での開発になるはずですし.
|
4
|
+
まずゲームつくりおよび,タグのC++からみて,C++での開発も視野に入れて質問されているのだと予想します.今の流行は前述の回答者の通り,C#ですが,性能を求める,iosやandroidなどのwindows製品以外でゲーム開発をおこなう,このような用途ではC++も現役と言えるでしょう.UEもblueprintだとかいう機能があったと思いますが,基本的にはC++での開発になるはずですし.
|
5
5
|
というわけで自分は低水準よりであるC++を例として回答させていただきます.IDEを使わずに開発したいという話にもかかわってくるでしょうし.
|
6
6
|
|
7
7
|
さて,皆様のおっしゃる通り,基本的にはあるプログラミング言語に最初から備わっているもの,俗にいう標準ライブラリだけでは絵のあるゲームを作ることは困難だと思います(というかC/C++のような言語ではたぶん無理だと思います).javaようなインタプリタ言語は例外ですが.こいつらは自前の仮想マシンを持っているので描画機能も自前で用意することができます.javaなら,ほかにもあるでしょうが,ライブラリの中のawtがそうであるはずです.
|
@@ -44,8 +44,8 @@
|
|
44
44
|
. previous_time = current_time;
|
45
45
|
. current_time = time();
|
46
46
|
.
|
47
|
-
. // 1 / 60 = 0.
|
47
|
+
. // 1 / 60 = 0.01666・・・.unsigned intで計算したいので整数に
|
48
|
-
. if( (current_time - previous_time) > (
|
48
|
+
. if( (current_time - previous_time) > (1000 / 60) )
|
49
49
|
. {
|
50
50
|
. sleep(); // 60fps以上で暇なら寝る
|
51
51
|
. }
|
3
訂正
answer
CHANGED
@@ -43,7 +43,9 @@
|
|
43
43
|
.{
|
44
44
|
. previous_time = current_time;
|
45
45
|
. current_time = time();
|
46
|
+
.
|
47
|
+
. // 1 / 60 = 0.1666・・・.unsigned intで計算したいので整数に
|
46
|
-
. if( (current_time - previous_time) > 60 )
|
48
|
+
. if( (current_time - previous_time) > (100 / 60) )
|
47
49
|
. {
|
48
50
|
. sleep(); // 60fps以上で暇なら寝る
|
49
51
|
. }
|
2
誤字
answer
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
OpenGLはmacでもwindowsでも同じコードでプログラミングできる,DirectXはwindows製品だけだがより強い機能を持っていてそれを利用したプログラミングができる,ということです.
|
21
21
|
そして絵を表示するには極論,この二つのAPIのどちらかに頼る必要があります.
|
22
22
|
|
23
|
-
ただしウィンドウを表示する部分だけは,残念ながらOS依存です.この部分はappleやmicosoftがあらかじめ用意してあるAPIを通じて処理させる必要があります.windowsを解説しますが,こちらではWindowsAPIの,有名なスケルトンコードを用いる必要があります.関数名を列挙すると,CreateWindow,
|
23
|
+
ただしウィンドウを表示する部分だけは,残念ながらOS依存です.この部分はappleやmicosoftがあらかじめ用意してあるAPIを通じて処理させる必要があります.windowsを解説しますが,こちらではWindowsAPIの,有名なスケルトンコードを用いる必要があります.関数名を列挙すると,CreateWindow,RegisterClass,ShowWindow,UpdateWindowなどを利用しないといけません.
|
24
24
|
|
25
25
|
まとめると,絵のあるゲームを作るには以下が必要になります.
|
26
26
|
・OpenGLかDirextXか,はたまたハード独自のAPIか
|
@@ -31,7 +31,7 @@
|
|
31
31
|
まあDirextXにはDirectShowという機能があったと思いますが,基本的はある方法を利用します.これは方法なので完全にプログラミングテクニックであり,べつにAPIが必要とかそういう話ではありません.
|
32
32
|
それはメインループと呼ばれる,ループによる方式です.動画の基本原理もそうですが,人は一秒間に30回以上の静止画を立て続けに見せられると,その絵が動いて見えます.パラパラ漫画です.この単位を30fpsといいます.fpsはframe per secondの略で,frameとはメインループが何回ループしたかという単位です.
|
33
33
|
つまり30fpsとは一秒間に30回,メインループを回すことになります.これで動画を作成できます.
|
34
|
-
ちなみに人間が
|
34
|
+
ちなみに人間が動画のちょうどよい早さを認識するのは60fpsまでといわれています.これ以上のfpsは無駄ですのでそれだけPC・ハード機の性能が有り余っているということです.というか早すぎると処理が一瞬で終わってしまいます.
|
35
35
|
コードで書けば以下のような感じです.
|
36
36
|
※わかりやすいように書いてます.しかもクラスの機能使ってないので実質C言語です.
|
37
37
|
.
|
@@ -46,7 +46,7 @@
|
|
46
46
|
. if( (current_time - previous_time) > 60 )
|
47
47
|
. {
|
48
48
|
. sleep(); // 60fps以上で暇なら寝る
|
49
|
-
.
|
49
|
+
. }
|
50
50
|
.
|
51
51
|
. draw();
|
52
52
|
. input = getUserInput(); // Data構造体(クラス)で状態を受け取る
|
1
誤字
answer
CHANGED
@@ -28,28 +28,38 @@
|
|
28
28
|
逆にいえばこれがあれば絵を出すことができます.コンソール画面に文字を表示するだけ,アスキーアートで絵を表現するだけ,といったプログラミングからは卒業です.
|
29
29
|
|
30
30
|
ちょっとまってください.じゃあ絵を出したはいいが動画とするにはどうしたらいいでしょうか.
|
31
|
-
まあDirextXには
|
31
|
+
まあDirextXにはDirectShowという機能があったと思いますが,基本的はある方法を利用します.これは方法なので完全にプログラミングテクニックであり,べつにAPIが必要とかそういう話ではありません.
|
32
|
-
それはメインループと呼ばれる,ループによ
|
32
|
+
それはメインループと呼ばれる,ループによる方式です.動画の基本原理もそうですが,人は一秒間に30回以上の静止画を立て続けに見せられると,その絵が動いて見えます.パラパラ漫画です.この単位を30fpsといいます.fpsはframe per secondの略で,frameとはメインループが何回ループしたかという単位です.
|
33
33
|
つまり30fpsとは一秒間に30回,メインループを回すことになります.これで動画を作成できます.
|
34
|
+
ちなみに人間がループの速さから,動画のちょうどよい早さは60fpsまでといわれています.これ以上のfpsは無駄ですのでそれだけPC・ハード機の性能が有り余っているということです.というか早すぎると処理が一瞬で終わってしまいます.
|
34
35
|
コードで書けば以下のような感じです.
|
35
36
|
※わかりやすいように書いてます.しかもクラスの機能使ってないので実質C言語です.
|
37
|
+
.
|
38
|
+
.Data input;
|
39
|
+
.unsigned int current_time = 0;
|
40
|
+
.unsigned int previous_time = 0;
|
41
|
+
.
|
42
|
+
.while(true) // 永遠に回る
|
43
|
+
.{
|
44
|
+
. previous_time = current_time;
|
45
|
+
. current_time = time();
|
46
|
+
. if( (current_time - previous_time) > 60 )
|
47
|
+
. {
|
48
|
+
. sleep(); // 60fps以上で暇なら寝る
|
49
|
+
. }
|
50
|
+
.
|
51
|
+
. draw();
|
52
|
+
. input = getUserInput(); // Data構造体(クラス)で状態を受け取る
|
53
|
+
. update( input ); // ここでキャラの状態やらステージを更新
|
54
|
+
.
|
55
|
+
. if( input.clear_flag || input.exit )
|
56
|
+
. {
|
57
|
+
. releaseResouce();
|
58
|
+
. closeWindow();
|
59
|
+
. break; // 終了
|
60
|
+
. }
|
61
|
+
.}
|
36
62
|
|
37
|
-
Data input();
|
38
|
-
|
39
|
-
while(true) // 永遠に回る
|
40
|
-
{
|
41
|
-
draw();
|
42
|
-
input = getUserInput(); // Data構造体(クラス)で状態を受け取る
|
43
|
-
update( input ); // ここでキャラの状態やらステージを更新
|
44
|
-
|
45
|
-
if( input.clear_flag || input.exit )
|
46
|
-
{
|
47
|
-
releaseResouce();
|
48
|
-
closeWindow();
|
49
|
-
break; // 終了
|
50
|
-
}
|
51
|
-
}
|
52
|
-
|
53
63
|
これは超単純なゲーム例ですが,突き詰めればゲームはこのような構造になっています.そしてdraw()の部分でAPIが必要になるわけです.
|
54
64
|
APIの入手についてですが,windowsならvisual studioを入れればDirectXおよびOpenGLが無料でついてきます.
|
55
65
|
あくまでもIDEに頼りたくない!というのであれば,Cygwinを導入するとインストール時に選択することでついてきます.
|