スピードメータのプログラムがよくかわりません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ゆみ

スピードメータのプログラムがよくかわりません。

#1

投稿記事 by ゆみ » 14年前

コード:

#include "DxLib.h"
#include <math.h>

#define PI 3.141592 
#define MIN_ANGLE (PI/3*2)  //ここです。
#define MAX_ANGLE (PI/3*7) //ここです。
#define ADD_SPEED (PI/220) //ここです。
#define SUB_SPEED (PI/180) //ここです。
double angle;
char Key[256];

void calc_angle(){
        if(Key[KEY_INPUT_Z]!=0){ //ここです。
                if(angle<MAX_ANGLE){ //ここです。
                        angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE)); //ここです。
                        if(angle>=MAX_ANGLE) //ここです。
                                angle-=ADD_SPEED*3; //ここです。
                }
        }
        else{
                if(angle>MIN_ANGLE){ //ここです。
                        angle-=SUB_SPEED; //ここです。
                        if(angle<MIN_ANGLE) //ここです。
                                angle=MIN_ANGLE; //ここです。
                }
        }
}

#define BUNKATU 30 //ここです。
void meter_graph(){
        int i;
        double ang=MIN_ANGLE; //ここです。
        for(i=0;i<=BUNKATU;i++){ //ここです。
                DrawLine(320+210*cos(ang),280+210*sin(ang),320+180*cos(ang),280+180*sin(ang),GetColor(255,0,0)); //ここです。
                ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU; //ここです。
        }
}

void graph(){
        DrawLine(320,280,320+200*cos(angle),280+200*sin(angle),GetColor(255,255,255)); //ここです。
        DrawFormatString(300-70,380,GetColor(0,255,255),"%5.1fkm/h",(angle-MIN_ANGLE)*57.6); //ここです。
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    angle=MIN_ANGLE;
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
    SetDrawScreen( DX_SCREEN_BACK );
    SetFontSize(36);
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){
            calc_angle();
            meter_graph();
            graph();
            ScreenFlip();
    }
    DxLib_End();
    return 0;
}
こういうプログラムがわかんない場合の質問はここでいいのかなぁ。

私は、高校2年生で現在DXライブラリに興味を持っている女子です。
学校では、C言語を軽く教わった程度なので、DXライブラリの簡単なプログラムなら理解することがわかるのですが
何か短くて簡単なプログラムで動いているゲームがないかと思い、
見つけたのがこのスピードメーターです。

これはサンプルプログラムの館で見つけました。
このプログラムなら短くて教えてもらえばわかるんじゃないかな?と思って、ここで質問させてもらいました。

私がわからないのは、 「//ここです。」と書いてある部分です。
特にわからないのが針の計算とメーターの表示の仕方の計算です。
自分で理解しようと本家にいって調べてましたが計算が全然理解できませんでした。

なのでこれを私にわかりやすく解説してもらえませんか?
できるなら、「//ここです。」と書いてあるところを詳しくお願いします。><

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#2

投稿記事 by softya(ソフト屋) » 14年前

マルチポストに当たりますので相互リンクをお願いします。
「このスピードメータのプログラムの意味がわかりません。」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2528

詳しくはフォーラムルールを御覧ください。 → http://dixq.net/board/board.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#3

投稿記事 by ゆみ » 14年前

そふとやさんすみませんでした。
そこを読んでいませんでした。

同じ質問リンク→ http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2528

こんな感じで大丈夫ですか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#4

投稿記事 by beatle » 14年前

コード:

#define A B
とかくと,この行以降に出てきたAをBで置き換えるという意味になります.

コード:

#define PI 3.141592
#define MIN_ANGLE (PI/3*2)
となっているため,ソースコード中のMIN_ANGLEが(3.141592/3*2)に置き換わります.

配列Keyは現在のキーボードの状態が格納されています.

コード:

if(Key[KEY_INPUT_Z]!=0)
と書くと,Zキーが押されているかどうかを調べられます.

320,280,320+200*cos(angle),280+200*sin(angle)とありますが,これは線分の両端の点を表しています.
点(320, 280)と点(320+200*cos(angle), 280+200*sin(angle))を結ぶ線分を描くということです.
cos()という関数は何なのか,200とcos(angle)を掛け算しているのはどうしてか,というのは,数学の「三角関数」を勉強すれば分かります.

マルチポストを例えると,複数の教授に同じ質問をするということです.
教授たちは皆,「自分にだけ質問しているのだろう」と思って一生懸命回答を考えますが,実は他の教授が既に答えているかもしれないのです.
質問した人は複数の回答を貰えて嬉しいですが,質問された方は無駄なことをしたことに気がつかないかもしれません.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#5

投稿記事 by softya(ソフト屋) » 14年前

相互リンクOKです。理解できたら両方の掲示板で解決チェックをお願いしますね。

とりあえず三角関数の理解と弧度法(ラジアン角)と度数法の違いを理解しないといけません。
コンピュータの世界では度数法ではなく弧度法が一般的ですので、この機会に覚えましょう。
「ラジアン - Wikipedia」
http://ja.wikipedia.org/wiki/%E3%83%A9% ... 2%E3%83%B3
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#6

投稿記事 by ゆみ » 14年前

こういうところに書き込むのは初めてだったのでよくわかりませんでした。
今度から気をつけます。
ほんとうにすみません。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#7

投稿記事 by ゆみ » 14年前

丁寧に教えてくださってありがとうございます。
ラジアンは半径と弧の長さが等しくなる角度で、度数法で測ると約57.29578 °に相当する。
ということをわかれば大丈夫ですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#8

投稿記事 by softya(ソフト屋) » 14年前

ゆみ さんが書きました:丁寧に教えてくださってありがとうございます。
ラジアンは半径と弧の長さが等しくなる角度で、度数法で測ると約57.29578 °に相当する。
ということをわかれば大丈夫ですか?
その理解で度数法から弧度法に変換できるのなら良いですが出来ますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#9

投稿記事 by ゆみ » 14年前

もうちょっと調べてきて
360度=2πラジアン
より、
180度=πラジアン
これなら理解でしました。

わざわざありがとうございます!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#10

投稿記事 by softya(ソフト屋) » 14年前

それが分かればbeatleさんの書き込みと合わせて

#define PI 3.141592 
#define MIN_ANGLE (PI/3*2)  //ここです。
#define MAX_ANGLE (PI/3*7) //ここです。
#define ADD_SPEED (PI/220) //ここです。
#define SUB_SPEED (PI/180) //ここです。

は理解できると思います。

[補足]
あとは、C言語の理解度の問題とsin/cosの三角関数などの数学の理解度の問題です。
わからない部分何処が分からないか、それぞれ切り分けてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#11

投稿記事 by ゆみ » 14年前

#define PI 3.141592 
#define MIN_ANGLE (PI/3*2)  //ここです。
#define MAX_ANGLE (PI/3*7) //ここです。
#define ADD_SPEED (PI/220) //ここです。
#define SUB_SPEED (PI/180) //ここです。

さっきのサイトを見て
上から
120
420
0.8181
1
さっき自分で調べたサイトをみて
電卓で計算したのですが
これであってますか・・・?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#12

投稿記事 by softya(ソフト屋) » 14年前

ゆみ さんが書きました:#define PI 3.141592 
#define MIN_ANGLE (PI/3*2)  //ここです。
#define MAX_ANGLE (PI/3*7) //ここです。
#define ADD_SPEED (PI/220) //ここです。
#define SUB_SPEED (PI/180) //ここです。

さっきのサイトを見て
上から
120
420
0.8181
1
さっき自分で調べたサイトをみて
電卓で計算したのですが
これであってますか・・・?
書いてないですが、度数法で言えばその値ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#13

投稿記事 by softya(ソフト屋) » 14年前

とりあえず、三角関数が分からなかれば教科書を調べること。C言語も教科書。

DXライブラリはリファレンスを調べてみましょう。
「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

で自分なりに今分かる範囲で一行一行コメントを書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#14

投稿記事 by ゆみ » 14年前

なら変換は大丈夫です。

こんなことまで教えてくれてありがとうございます!

ここで質問なんですがなぜこの
120
420
0.8181
1
が必要になるんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#15

投稿記事 by softya(ソフト屋) » 14年前

ゆみ さんが書きました:なら変換は大丈夫です。

こんなことまで教えてくれてありがとうございます!

ここで質問なんですがなぜこの
120
420
0.8181
1
が必要になるんですか?
それこそ後半が分かれば意味がわかります。
最初に決めておくのは調整しやすくするためと直接数値を書いても意味が分からないので数値の意味を分かりやす名前にする為です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#16

投稿記事 by ゆみ » 14年前

返信遅れました。すみません。

コード:

void calc_angle(){
        if(Key[KEY_INPUT_Z]!=0){ //Zキーが押されたら
                if(angle<MAX_ANGLE){ //angleより420より小さいなら
                        angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE)); //0.81-0.81*(0.97*(angle-120)/(420-120))をangle足して→angleに代入
                        if(angle>=MAX_ANGLE) //angleが420以上でしたら
                                angle-=ADD_SPEED*3; //angleから0.81*3引いて→angleに代入
                }
        }
        else{
                if(angle>MIN_ANGLE){ //angleが120より大きいなら
                        angle-=SUB_SPEED; //angleから0.81引いて→angleに代入
                        if(angle<MIN_ANGLE) //angleが120より小さいなら
                                angle=MIN_ANGLE; //angleは120
                }
        }
}
こんな感じに計算していれてみたのですがあっていますか?
もし違うなら教えて下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#17

投稿記事 by softya(ソフト屋) » 14年前

慌てなくて良いですよ。自分のペースで理解しましょう。

概ねOKですが、個々の行はOKだとして全体としてどういう動作をしているか分かりますか?
ただ、
angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE)); //0.81-0.81*(0.97*(angle-120)/(420-120))をangle足して→angleに代入
ここの計算の意味は難しいのでプログラムを何行かに分解して書いたほうが良いかも知れませんね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#18

投稿記事 by ゆみ » 14年前

ほんとですか!(゚∀゚)
お気遣いありがとうございます!

それで全体の構造はまだ理解していませんが

void calc_angle()←これがメーターの針の計算?かな。
void meter_graph()←これがメーターの線?かな。
void graph()←これがメーターの針?かな。

私の中ではこんな感じかな?って思っていますけど
次にこのプログラムです。

コード:

#define BUNKATU 30
void meter_graph(){
        int i;
        double ang=MIN_ANGLE;
        for(i=0;i<=BUNKATU;i++){
                DrawLine(320+210*cos(ang),280+210*sin(ang),320+180*cos(ang),280+180*sin(ang),GetColor(255,0,0));//ここです!
                ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU;
        }
「ここです!」と書いてあるところの計算がよくわかりません。
ここの計算をわかりやすく教えてくれませんか?

non
記事: 1097
登録日時: 15年前

Re: スピードメータのプログラムがよくかわりません。

#19

投稿記事 by non » 14年前

画像のメータ周辺部の赤い線を描いてます。
120°のところが、MIN_ANGLEでここから、420°のMAX_ANGLEまで30分割してます。
メーターの中心座標は(320,280)
三角関数のcosとsinでx,yの長さを求められることは既に習ってますよね。
添付ファイル
メーター.png
メーター.png (10.87 KiB) 閲覧数: 10834 回
最後に編集したユーザー non on 2012年1月22日(日) 08:55 [ 編集 1 回目 ]
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#20

投稿記事 by softya(ソフト屋) » 14年前

すでにnonさんが回答されているとおりですが、分からない時は試しにコメントアウトしてみるとか、元のを残して数値をいじってみるとか、数値をprintfやDrawFormatStringしてみるとか自分なりの工夫で何を意味するのか探る方法があります。試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#21

投稿記事 by ゆみ » 14年前

わざわざ画像まで作ってくれて本当にありがとうございます!

この画像の説明のおかげで頭の中では、メーターの線のグラフを表しているとわかったのですが
やはりこの計算がわからないんです。

私、三角関数があんまり得意じゃないもので計算が全然わかりません。
サイトで検索して調べてきましたけどまったくわかりません。

申し訳ないんですが、

コード:

DrawLine(320+210*cos(ang),280+210*sin(ang),320+180*cos(ang),280+180*sin(ang),GetColor(255,0,0));


1、なぜ210にcosをかけているのか。
2、なぜ210にsinをかけているのか。
3、210*cos(ang)←この(ang)はなぜ付いているのか。

出来ればこの上記の計算を説明してもらえませんか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#22

投稿記事 by softya(ソフト屋) » 14年前

sin/cosが角度を必要とするのは分かると思います。
sinθとかcosθとかのθですね。
このθを表すのにC言語では関数の引数という形をとっています。
これがsin(ang)やcos(ang)のangです。angはラジアン角のθということになります。

なぜ210を掛けるかというと
「三角関数と円周上の点の座標」
http://sgs.gozaru.jp/cdr/sutanbai/ensyuunoTen.html
に出てくる次の公式を変形しているだけです。
sinθ=y/r
cosθ=x/r
の式を変形して
sinθ*r=y
cosθ*r=x
と半径とsin/cosで角度を指定すれば円周上の座標を求めることができます。
つまり、210は半径のことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#23

投稿記事 by ゆみ » 14年前

わかりやすく説明ありがとうございます!
その説明のおかげで今こんな感じに全体のプログラムを理解しているのですが
大丈夫ですか?


コード:

#include "DxLib.h"
#include <math.h>

#define PI 3.141592
#define MIN_ANGLE (PI/3*2)	//120
#define MAX_ANGLE (PI/3*7)	//420
#define ADD_SPEED (PI/220)	//0.8181
#define SUB_SPEED (PI/180)	//1

double angle;
char Key[256];
void calc_angle(){	//メーターの針の計算
        if(Key[KEY_INPUT_Z]!=0){	//Zキーが押されたら
                if(angle<MAX_ANGLE){	//angleより420より小さいなら
				angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE));	
		//0.81-0.81*(0.97*(angle-120)/(420-120))をangleに足して→angleに代入
                        if(angle>=MAX_ANGLE)	//angleが420以上でしたら
                                angle-=ADD_SPEED*3;	//angleから0.81*3引いて→angleに代入
                }
        }
        else{
                if(angle>MIN_ANGLE){	//angleが120より大きいなら
                        angle-=SUB_SPEED;	//angleから0.81引いて→angleに代入
                        if(angle<MIN_ANGLE)	//angleが120より小さいなら
                                angle=MIN_ANGLE;	//angleは120
				}
        }
}

#define BUNKATU 30	//BUNKATUに30という値を代入。
void meter_graph(){	//メーターの線のグラフ
        int i;	//	iという箱を用意
        double ang=MIN_ANGLE;	//120をangに代入
        for(i=0;i<=BUNKATU;i++){	//iが30以上になるまで1ずつ足す。
                DrawLine(320+210*cos(ang),280+210*sin(ang),320+180*cos(ang),280+180*sin(ang),GetColor(255,0,0));
		//(320,280)=針の中心から半径210を起点座標,(320,280)=針の中心から180を終点座標	つまり210-180=30という長さになる。
                ang+=(MAX_ANGLE-MIN_ANGLE)/BUNKATU;	//420-120/30=10の値をang=120に足してangに代入ang=130
		
        }
}

void graph(){	//メーターの針と針のkmの数字
        DrawLine(320,280,320+200*cos(angle),280+200*sin(angle),GetColor(255,255,255));
		//(320,280)=針の中心から200まで赤い線を引く
        DrawFormatString(300-70,380,GetColor(0,255,255),"%5.1fkm/h",(angle-MIN_ANGLE)*57.6);
	//((300-70),380)→起点座標 カラーは水色? 
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	//
    angle=MIN_ANGLE;
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
	//ウィンドウモード
    SetDrawScreen( DX_SCREEN_BACK );
    SetFontSize(36);//フォントのサイズが36
    
	while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){
            calc_angle();
            meter_graph();
            graph();
            ScreenFlip();
    }
    DxLib_End();
    return 0;
}
それでまたわからない所がありますので、箇条書きで書きます。

①angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE));
//0.81-0.81*(0.97*(angle-120)/(420-120))をangleに足して→angleに代入

という計算はわかったのですがこれは車のアクセルの公式?それとも何かの公式でしょうか?

② DrawFormatString(300-70,380,GetColor(0,255,255),"%5.1fkm/h",(angle-MIN_ANGLE)*57.6);

((300-70),380)→起点座標なのはわかりますが、なぜ300-70をわざわざしているのかわかりません。 
カラーと%5.1fkmはなんとか理解できますが、この次の(angle-MIN_ANGLE)をしているのか理解できません。そして最後の数字は作者の気まぐれと聞きましたが、なぜ必要なのかもわかりません。

③while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key
[KEY_INPUT_ESCAPE]==0){
calc_angle();
meter_graph();
graph();
ScreenFlip();
}

これは頭の中では、今までやってきた「針の計算」と「針の図」と「メータの図」がESCAPEが押されるまで
永久ループしているのかな?という感じなのですが
違くても合ってても正しい解説をお願いします。

最後に、この全体の構造のコメント文が大丈夫か見てもらいたいです。
お願いします!><

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: スピードメータのプログラムがよくかわりません。

#24

投稿記事 by softya(ソフト屋) » 14年前

#define BUNKATU 30 //BUNKATUに30という値を代入。
と言うのは悪い理解の仕方なので、素直にBUNKATUという名前の物 は30と置き換えられると理解したほうが良いと思います。
①angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE));
//0.81-0.81*(0.97*(angle-120)/(420-120))をangleに足して→angleに代入

という計算はわかったのですがこれは車のアクセルの公式?それとも何かの公式でしょうか?
公式と言うかアクセルっぽく見せるために工夫されている式ですね。
ゲームというのは、こういうそれっぽく見せる事を自分で考えるのが最大の楽しみでもあります。

理解するために、この式は分解してみる必要があると思います。
まず(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE)がどんな意味を持つかです。
宿題としますので考えてみてください。

② DrawFormatString(300-70,380,GetColor(0,255,255),"%5.1fkm/h",(angle-MIN_ANGLE)*57.6);

((300-70),380)→起点座標なのはわかりますが、なぜ300-70をわざわざしているのかわかりません。 
カラーと%5.1fkmはなんとか理解できますが、この次の(angle-MIN_ANGLE)をしているのか理解できません。そして最後の数字は作者の気まぐれと聞きましたが、なぜ必要なのかもわかりません。
(300-70)は位置が合うように調整した結果かなぁと思います。300を起点に調整したら-70が丁度良かったみたいな。
(angle-MIN_ANGLE)は0相対の角度にしてから57.6と言うマジックナンバーを掛けて速度に変換しているだけだと思います。
特に取り決めがあるわけではないので作者のさじ加減といった所でしょうか。

気になるなら式の値をいじってみればどう変わるか分かると思います。
③while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key
[KEY_INPUT_ESCAPE]==0){
calc_angle();
meter_graph();
graph();
ScreenFlip();
}

これは頭の中では、今までやってきた「針の計算」と「針の図」と「メータの図」がESCAPEが押されるまで
永久ループしているのかな?という感じなのですが
違くても合ってても正しい解説をお願いします。
ゲームプログラムは基本的にこのループの形を取ります。
ProcessMessage()  ← システムのお約束。
ClearDrawScreen() ← 画面をクリア。
 ここにゲーム処理が入る
ScreenFlip(); ← 画面を更新。
最初は意味がわからなくても良いので、この形を必ず守るようにして下さい。

>最後に、この全体の構造のコメント文が大丈夫か見てもらいたいです。
>お願いします!><

細かいコメントとしては大丈夫ですが概要説明になっていないので要約コメントを書いてみてください。
例えば、下記のコード全体でコメント書くとしたらどう書きますか?

コード:

                if(angle<MAX_ANGLE){    //angleより420より小さいなら
                angle+=ADD_SPEED-ADD_SPEED*(0.97*(angle-MIN_ANGLE)/(MAX_ANGLE-MIN_ANGLE));  
        //0.81-0.81*(0.97*(angle-120)/(420-120))をangleに足して→angleに代入
                        if(angle>=MAX_ANGLE)    //angleが420以上でしたら
                                angle-=ADD_SPEED*3; //angleから0.81*3引いて→angleに代入
                }
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆみ

Re: スピードメータのプログラムがよくかわりません。

#25

投稿記事 by ゆみ » 14年前

返信が遅れました。
その問で
自分でプログラムを編集しているうちにだんだんわかってきました。
無事理解することができました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る