2つの画像の座標が離れたら画像の倍率を下げる

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

2つの画像の座標が離れたら画像の倍率を下げる

#1

投稿記事 by chalaza » 14年前

よくある格闘ゲームのような、
2つの座標が一定より離れたら画像の倍率を下げ、一定より近づいたら倍率を上げる設定について質問です。
まず、画像の倍率を代入するBairitu変数を用意して、1.0以下にはならなく、2.0以上にはならないようにしました。
そして、2つの画像の位置座標と表示座標を用意して、
位置座標はPlayer1.XとPlayer2.Xで管理しており、-320以下にはならなく、960以上にはならないようにしました。(仮想フィールドの大きさです。2画面分。)
表示座標は、位置座標を代入した後に、64以下、576以上にはならないようにしました。(スクリーンの端から端-キャラ画像の半分です。)
ここまで設定したのですが、ここから倍率の計算につまずいています。

自分がやりたいのはまず、『プレイヤー2の座標-プレイヤー1の座標』を2人の距離として、(後から逆も作成)
最初は2人の距離が近く、倍率が2.0に設定してあり、
2人の距離が640(1画面分)以上になったら画像が小さくなっていき、
ぴったり1280(2画面分)になったところで倍率がちょうど1.0になるようにしたいのです。

そこで自分なりに考えた倍率の計算式なのですが…
2人の距離から640を引いた数値(1画面分以上の離れた距離)を作り、1.0からそれを割って、その数を2.0から引くという

2.0-(1.0/((Player2.X-Player1.X)-640))
を立てたのですが倍率はびくとも動いてくれません…ちなみにPlayer1.XもPlayer2.Xもdoubleで宣言しています。

スクロールの関数から貼らせていただきます…どう変えればよいでしょうか…

コード:

void Scroll(){
 //プレイヤー1のスクロール///////////////////////////////////////////////////////

	//位置座標はフィールドを超えない
	if(Player1.X < -320)Player1.X = -320;
	if(Player1.X > 960) Player1.X = 960;

	//表示座標に位置座標を代入
	PlayerViewX = Player1.X ;

	//表示座標は画面を超えない
	if(PlayerViewX < 64)PlayerViewX = 64;
	if(PlayerViewX > 576)PlayerViewX = 576;

	///////////////////////////////////////////////////////////////
	 //プレイヤー2のスクロール///////////////////////////////////////////////////////

	//位置座標はフィールドを超えない
	if(Player2.X < -320)Player2.X = -320;
	if(Player2.X > 960) Player2.X = 960;

	//表示座標に位置座標を代入
	PlayerViewX2 = Player2.X ;

	//表示座標は画面を超えない
	if(PlayerViewX2 < 64)PlayerViewX2 = 64;
	if(PlayerViewX2 > 576)PlayerViewX2 = 576;

	///////////////////////////////////////////////////////////////
}
void Zoom(){

	if((Player2.X-Player1.X)>640)
		2.0-(1.0/((Player2.X-Player1.X)-640));
	if(Bairitu>=2.0)
		Bairitu=2.0;
	if(Bairitu<=1.0)
		Bairitu=1.0;
}
void DrawGraph(){//画像描画

	DrawRotaGraph( 329, 240, Bairitu,  0.0, Haikei1, TRUE );
	DrawRotaGraph( PlayerViewX2, Player2.Y, Bairitu,  0.0, Player2.img, TRUE );//プレイヤー2の場所に画像
	DrawRotaGraph( PlayerViewX, Player1.Y, Bairitu,  0.0, Player1.img, TRUE );//プレイヤー1の場所に画像

}

box
記事: 2002
登録日時: 15年前

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#2

投稿記事 by box » 14年前

chalaza さんが書きました:

コード:

		2.0-(1.0/((Player2.X-Player1.X)-640));
この式では、結果をどこにも保存していません。
また、
Player1.X
Player2.X
を参照しているだけですので、実質的には
『何もしていません。』

コード:

    double x = 1, y = 2;

    x + y;
というのが、実質的に何もしていない、というのと同じことです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

chalaza

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#3

投稿記事 by chalaza » 14年前

これは失礼。何も起きないのは当たり前でした。

見返して直してみたのですが…

コード:

void Zoom(){

	if((Player2.X-Player1.X)>640)
		Bairitu = 1.0+(1.0/((Player2.X-Player1.X)-640));
	if(Bairitu>=2.0)
		Bairitu=2.0;
	if(Bairitu<=1.0)
		Bairitu=1.0;
}
こうしてみたところ、倍率が動いてくれたのは良いところ、綺麗に比例して拡小、拡大してくれません。
なんか加速するようにいきなり拡大したりしてとても不安定です。
doubleにはなっているので式だと思うんですが、式のどこがおかしいのしょうか…

box
記事: 2002
登録日時: 15年前

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#4

投稿記事 by box » 14年前

chalaza さんが書きました:

コード:

	if((Player2.X-Player1.X)>640)
		Bairitu = 1.0+(1.0/((Player2.X-Player1.X)-640));
これで、すべてのケースをカバーしているのでしょうか。
まあ、ゲームプログラミングのことを何も知らない私が言うことですので話半分以下で
聞いていただきたいのですが、

Player2.X-Player1.X<=639

のケースは考えなくていいのでしょうか。そんなケースは決して起きない、ということならいいんですが。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#5

投稿記事 by h2so5 » 14年前

倍率の計算式をグラフにしてみました。
なめらかな変化にはならないようです。
添付ファイル
graph.jpg
graph.jpg (57.1 KiB) 閲覧数: 3059 回

chalaza

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#6

投稿記事 by chalaza » 14年前

Player2.X-Player1.X<=639のケースは考えないというか、距離が640以上の時以外は何も起こらない前提だったので書かなくてもいいものでした。
余計なこと書いてましたね。


では、640pix離れるときっちり倍率が1.0変化するようにするにはどうすればいいでしょうかね・・・・
式ではなく、距離が増加している間だけ倍率を増やし続ける。とかでしょうか?

box
記事: 2002
登録日時: 15年前

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#7

投稿記事 by box » 14年前

chalaza さんが書きました:Player2.X-Player1.X<=639のケースは考えないというか、距離が640以上の時以外は何も起こらない前提だったので書かなくてもいいものでした。
おっしゃっている意味がつかみきれませんでした。
結局、くだんの関数のコードはどうなるのでしょうか。

コード:

    if(Bairitu>=2.0)
        Bairitu=2.0;
    if(Bairitu<=1.0)
        Bairitu=1.0;
}
こういうコードがあるからには、Bairituの初期値を何らかの方法で求めておく必要があると思うのですが…。
初期値があるからこそ、2.0以上とか1.0以下とかの判断ができるわけで。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#8

投稿記事 by h2so5 » 14年前

Bairitu = 2.0 - (abs(Player2.X-Player1.X) - 640) / 640;
この式だと距離に対応してなめらかに倍率が変化します
添付ファイル
graph.jpg
graph.jpg (57.7 KiB) 閲覧数: 3045 回

chalaza

Re: 2つの画像の座標が離れたら画像の倍率を下げる

#9

投稿記事 by chalaza » 14年前

Bairitu = 2.0 - (abs(Player2.X-Player1.X) - 640) / 640;
を使わせてもらったらなめらかになりました。
絶対値のようなので逆側も使えるので距離指定しなくてよさそうです。
ありがとうございました。解決です

閉鎖

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