クリックしたら一定加速度で加速し離したら減速していくプログラム

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

クリックしたら一定加速度で加速し離したら減速していくプログラム

#1

投稿記事 by kazuki » 14年前

先日、「マウスの方向を向くプログラム」 http://dixq.net/forum/viewtopic.php?f=3&t=8347
を投稿したものです。
あれから、マウスを追いかけるところまでのプログラムが書けました。
そのあと、マウスをクリックしている間は一定加速度で加速していき、ある速度以上は加速せず一定速度で移動し、クリックを離すと、一定加速度で減速するプログラムを作ったのですが、一回目クリックすると加速しながら移動するのですが、減速ができません。
ソース載せておきます。
main.ccp

コード:

define GLOBAL_INSTANCE
#include "GV.h"



//ループで必ず行う三大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す。
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessLoop()==0){//メインループ
		switch(func_state){
		    case 0:
				load(); //データロード
				first_ini();//初回の初期化
				func_state=100;
				break;
			case 100:
				ch_speed();
				move();
				graph_main();//描画メイン
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}

		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク

        ScreenFlip(); //裏画面反映
    }

    DxLib_End();
    return 0;
}
char.ccp

コード:

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

float ms_angle=0;

//角度のラジアンを求める関数
float angle(){
	
	GetMousePoint(&ms_x,&ms_y);
	if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
	ms_angle = (float)atan2(ms_y-ch.y,ms_x-ch.x);
	}
	return ms_angle;
}

//移動方向
void move(){
	
	if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
	ch.x += cos(ms_angle) * ch.speed;
	ch.y += sin(ms_angle) * ch.speed;
	}
	
}
ch_speed.ccp

コード:

#include "GV.h"

void ch_speed(){
	if(ch.speed >= 0 && ch.speed < 7 ){
		ch.speed += 0.01;
	}
	if((GetMouseInput() & MOUSE_INPUT_LEFT) == 0){
		if(ch.speed >= 0){
		ch.speed -= 0.01;
		}
		
	}
	
}
graph.ccp

コード:

#include "GV.h"


void graph_ch(){
	DrawRotaGraphF(ch.x,ch.y,1.0f,angle(),img_ch,TRUE);
}

void graph_main(){
	graph_ch();
	DrawFormatString(0,0, GetColor(225,225,225),"変数ch.speedの値は%dです\n",ch.speed);
}
これらのコードに書かれている変数はすべてグローバル変数です。独自関数もグローバル宣言しています。
すべてのソースファイルは載せていませんが、描画系はこれらのソースファイルに書かれています。
たぶん、ch_speed()が悪いんだと思いますが、どう直したらいいかわかりません。
残りのソースファイルも必要であれば載せます。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: クリックしたら一定加速度で加速し離したら減速していくプログラム

#2

投稿記事 by h2so5 » 14年前

kazuki さんが書きました: ch_speed.cpp

コード:

#include "GV.h"

void ch_speed(){
	if(ch.speed >= 0 && ch.speed < 7 ){
		ch.speed += 0.01;
	}
	if((GetMouseInput() & MOUSE_INPUT_LEFT) == 0){
		if(ch.speed >= 0){
		ch.speed -= 0.01;
		}
		
	}
	
}
マウスボタンを離している場合、
5行目で0.01だけ加速し、9行目で0.01減速しているので結果的に速度が変化しません。

kazuki

Re: クリックしたら一定加速度で加速し離したら減速していくプログラム

#3

投稿記事 by kazuki » 14年前

変更してみたのですがまだうまくいきません。
数値の変化はあるのですが、緩やかに減速してとまることはできませんでした。
また、しばらく放っておくと、今度はあまり動かなくなってしまいました。

コード:

#include "GV.h"

void ch_speed(){
	if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
	if(ch.speed >= 0 && ch.speed < 7 ){
		ch.speed += 0.01;
	}
	}else{
		if(ch.speed >= 0){
		ch.speed -= 0.01;
		}
		
	}
	
}


kazuki

Re: クリックしたら一定加速度で加速し離したら減速していくプログラム

#4

投稿記事 by kazuki » 14年前

ch_speed.ccpを消して、char.ccpの move()関数に統合して、変更しました。
思い通りに動いたのですが、プログラム開始時にキャラが少し動いてしまいます。
きっとどこかでch.speedを初期化しないといけないと思うですが、どこですればいいでしょうか?

char.ccp

コード:

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

float ms_angle=0;

//角度のラジアンを求める関数
float angle(){
	
	GetMousePoint(&ms_x,&ms_y);
	if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
	ms_angle = (float)atan2(ms_y-ch.y,ms_x-ch.x);
	}
	return ms_angle;
}

//移動方向
void move(){
	if((GetMouseInput() & MOUSE_INPUT_LEFT) == 0){
		if(ch.speed >= 0){
			ch.speed -= 0.1;
			ch.x += cos(ms_angle) * ch.speed;
	        ch.y += sin(ms_angle) * ch.speed;
		}
	}
	if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0 ){
		if(ch.speed <7 ){
		ch.speed += 0.1;
		}
	    ch.x += cos(ms_angle) * ch.speed;
	    ch.y += sin(ms_angle) * ch.speed;
	}
	
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: クリックしたら一定加速度で加速し離したら減速していくプログラム

#5

投稿記事 by h2so5 » 14年前

kazuki さんが書きました:

コード:

	if((GetMouseInput() & MOUSE_INPUT_LEFT) == 0){
		if(ch.speed >= 0){
			ch.speed -= 0.1;
			ch.x += cos(ms_angle) * ch.speed;
	        ch.y += sin(ms_angle) * ch.speed;
		}
	}
ここの条件に問題があります。
ch.speed==0 の時、つまりキャラクタが全く動いていない時も
ch.speed -= 0.1 が実行されてしまうため、キャラが反対方向に動いてしまいます。

閉鎖

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