6 スピードメーターのサンプル




アナログメーターってどうやって作るの?

という質問があった時に回答用に作ったサンプルです。

オートマの隼(GSX-1300R)があったらこんな感じかなと思って作りました。

一応300キロ規制がされているような演出してあります。

操作方法:
Zキーを押しっぱなしにするとアクセルをひねったことになります。



#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;
}



- Remical Soft -