点滅のさせる計算式

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

点滅のさせる計算式

#1

投稿記事 by kai » 15年前

こんにちは。
また龍神録を改造して遊んでいて、
今度は文字をブレンドを使って点滅(cnt%6==0みたいに一瞬の点滅ではない方)
させてみたいと思ってやってみたのですが、
点滅を何度も繰り返す方法がわからなくて困ってます。
たぶん%を使って何回も繰り返してるんだと思うのですが、
どういった計算式で繰り返してるんでしょうか?
点滅の例は、こちらの動画の感じです。(最初のほうのPRESS ANY BUTTON)
http://www.youtube.com/watch?v=hDy6tm2J ... 28&index=1
本家龍神録でも、四角■を点滅させたりしてます。
どなたか教えてください><

Dixq (管理人)

Re:点滅のさせる計算式

#2

投稿記事 by Dixq (管理人) » 15年前

>kaiさん

こんにちは^^
点滅さえすればいいのですか?
それとも動画のようにスーッと消えるように点滅させたいのですか?

単に点滅すればいいのなら、カウンタを割った物をさらに%で計算すればいいと思います。
例えば

cnt%2==0

これだと2/60秒周期で点滅しますよね?

(cnt/2)%2==0

これだと4/60秒周期で点滅しますよね?

(cnt/3)%2==0

これだと6/60秒周期で点滅しますよね?

ということで、こうやれば周期は簡単に変更できます。
また

if((cnt/3)%2!=0)

こんな感じにすれば、1:1点滅じゃなく、どちらかに偏った点滅も出来ると思います。

kai

Re:点滅のさせる計算式

#3

投稿記事 by kai » 15年前

すみません。
点滅と言った私の言い方が悪かったんだと思います。
点滅ではなく、
フェードアウトと、フェードインの繰り返しのことです。

>それとも動画のようにスーッと消えるように点滅させたいのですか?
そうです。
これが出来たら結構、応用が出来そうなので悪戦苦闘してるのですが、
分からなくて困ってます・・

Dixq (管理人)

Re:点滅のさせる計算式

#4

投稿記事 by Dixq (管理人) » 15年前

百聞は一見に如かず ということで実際にコードを見た方が早いですね。
2通り作ってみました。

1の方は輝度が255→0,255→0,を繰り返すので、
突然明るくなるような点滅です。
フェードインが無い、フェードアウトの連続ということです。

それに対して2の方は、フェードイン、フェードアウトの繰り返しです。
0→255,255→0,0→255,一次関数的なエフェクトでは安っぽくなってしまいますが
sin波を使うことで滑らかな表現が可能です。
龍神録をご覧になっているということはcosやsinはバリバリに使っていらっしゃると思いますので、
詳しい説明は省略します。
もし何かわからなければお聞きください。

変化する値を変えたり振幅を変えることでどのようなエフェクトにもなりえますね。
#include <math.h>
#include "DxLib.h"

#define PI 3.141592654f //円周率
#define PI2 (PI*2)      //円周率

#define T1 60 //周期
#define T2 40 //周期

int Count;

void Tenmetsu1(){
	SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255 - 255*(Count%T1)/T1 );
	DrawString(0,0,"Hello world!!",0xFFFFFFFF);
	SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0 );
}
void Tenmetsu2(){
	SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128 + sin( PI2/T2*Count ) * 128 );
	DrawString(0,100,"Hello world!!",0xFFFFFFFF);
	SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0 );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	if(ChangeWindowMode(TRUE)==-1 || DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;
 
	while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)){
		Tenmetsu1();
		Tenmetsu2();
		Count++;
	}
 
	DxLib_End();
	return 0;
}

kazuoni

Re:点滅のさせる計算式

#5

投稿記事 by kazuoni » 15年前

結局、フェードイン・アウトが分からないということでしょうか?
簡単に書けばこんな感じですかね。(要DXライブラリ)
int para=255;
// ...
// paraの規則的加減算
// ...
SetDrawBlendMode(DX_BLENDMODE_ALPHA,para);
DrawString(x,y,str,color);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
// ...
ScreenFlip();

kazuoni

Re:点滅のさせる計算式

#6

投稿記事 by kazuoni » 15年前

モロかぶりすいません・・・。

kai

Re:点滅のさせる計算式

#7

投稿記事 by kai » 15年前

Dixqさん、kazuoniさん、ありがとうございます。

なるほど、sin波を使えばよかったんですね。
その発想が全く出てこなかったので、
ちょっと表現方法に感動して涙出ました。
本当にありがとうございます!

Dixq (管理人)

Re:点滅のさせる計算式

#8

投稿記事 by Dixq (管理人) » 15年前

> kazuoniさん

いえいえ^^;

> kaiさん

sin波って手軽に使えて、それでいてsin波を使っただけで動きが安っぽくならなくなるので、結構使えるんですよね。
私も至る所で使っています。
例えばエアロビートのメニュー画面、ロゴとかスッと動き始めてスッと止まるモーションとか、
曲選択メニュー画面の背景のオブジェクトの最初の回転とか。

sinは角度だけじゃなく、移動量であったり、輝度であったり、何にでも使えるので便利ですね。
しかも見ただけで(90°の倍数なら)角度いくつで値がどうなっているのか一目瞭然ですし。

閉鎖

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