エフェクトの処理

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

エフェクトの処理

#1

投稿記事 by 沙希 » 14年前

あけましておめでとうございます。
自作で円の波紋?のようなエフェクトを作ってみました。↓

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
        int White,Red,Blue,Green;
        int r=1;
        int L=255; 
        while( ScreenFlip()==0 &&ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
               
	       
               
                if( Key[ KEY_INPUT_RIGHT ] >= 1 ){ // 右キーが押されていたら
		White   = GetColor( 255 , 255 , 255 ) ;
		         for(r=1,L=255;r<300,L>0;r++,L--){ //半径が大きくなるにつれ線を暗くする
	                 if( ProcessMessage() != 0 ){	// メッセージ処理
	                        break;//ウィンドウの×ボタンが押されたらループを抜ける
	                }
			
			SetDrawBright  ( L , L , L ) ; //明度処理              
	                DrawCircle( 200, 300, r , White , FALSE) ; // 円を描画(塗りつぶし無し)
	                  Sleep(10);  //0.1秒待つ
	                  r = r + 1;  //rを1増やす
                               L = L - 3; // Lを3減らす
	                ScreenFlip(); //裏画面を表画面に反映
			ClearDrawScreen();   // 画面を消す
		             }
	             }
             }

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

(右キーを押す→円の描画→for文の条件から外れる→処理終了)
この一連の処理の間に再度右キーを押すと連続して円が描画されるようしたいです。(こんな感じで→◎
何かアドバイスお願いします><
コンパイラはbcc5.5です

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

Re: エフェクトの処理

#2

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

あけましておめでとうございます。
早速ですが、インデントが不正確なのでまずインデントの修正をお願いします。
「mixcpp/投稿前チェックリスト - PukiWiki」 (beatleさん作成)
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8

それとやってはいけないことに該当しているので、これも修正仮題です。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/h_11.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

沙希

Re: エフェクトの処理

#3

投稿記事 by 沙希 » 14年前

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){

	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
	int White,Red,Blue,Green;
	int r=1;
	int L=255;
	int Count=0; 
	while( ProcessMessage()==0  && gpUpdateKey()==0 ){
		if( Key[ KEY_INPUT_RIGHT ] >= 1 ){ // 右キーが押されていたら
				White   = GetColor( 255 , 255 , 255 ) ;
				for(r=1,L=255;r<300,L>0;r++,L--){ //半径が大きくなるにつれ線を暗くする	 
					if( ProcessMessage() != 0 ){	// メッセージ処理
					break;//ウィンドウの×ボタンが押されたらループを抜ける
					}
					
					SetDrawBright  ( L , L , L ) ; //明度処理              
					DrawCircle( 320, 250, r , White , FALSE) ; // 円を描画(塗りつぶし無し)
					r = r + 1;  //rを1増やす
					L = L - 3; // Lを3減らす
					ScreenFlip();
					ClearDrawScreen();// 画面を消す
				}
		}
	}
		DxLib_End(); // DXライブラリ終了処理
		return 0;
}
ご指摘ありがとうございます
自分なりに修正してみました

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

Re: エフェクトの処理

#4

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

基本的には龍神録などSTGなどの弾と同じで構造体配列で円の存在、大きさ、色、生存期間を管理して、キーが押されるたびに構造体配列から存在していない要素を初期化して円を生成すれば良いと思います。表示は構造体配列で存在しているものだけを計算・表示します。
こうすればProcessMessage()が2つ有るという非常に良くないプログラム構造を避けることも出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

沙希

Re: エフェクトの処理

#5

投稿記事 by 沙希 » 14年前

返信遅くなりました><

無事解決しました。ありがとうございます!

閉鎖

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