龍神録22章

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Rittai_3D
記事: 525
登録日時: 11年前

龍神録22章

#1

投稿記事 by Rittai_3D » 11年前

再びお世話になります。3Dです。

今回は、前回のインベーダーゲームが完成したので、龍神録を参考にシューティングを作ってみようと思い、作っています。22章のボムを撃ってみようで躓いたので質問をしにきました。

effect.cpp

コード:

#include "DxLib.h"
#include <math.h>
#include "effect.h"
#include "define.h"
#include "struct.h"
#include "common.h"

static int img_deth_eff[5];
static int img_eff_bomb[5];
static int se_bomb;

void effect_load_and_ini(){
	LoadDivGraph("dat/hit_effect.png",5,5,1,140,140,img_deth_eff);
	img_eff_bomb[0] = LoadGraph("dat/bom0.png");		//ボムeff1
	img_eff_bomb[1] = LoadGraph("dat/bom1.png");		//ボムeff2
	img_eff_bomb[2] = LoadGraph("dat/bom_title0.png");	//the shot of power
	img_eff_bomb[3] = LoadGraph("dat/face_mr00_0.png");	//カットイン
	se_bomb			= LoadSoundMem("dat/se/bomb.wav");	//ボム

	memset(effect,0,sizeof(effect_t)*EFFECT_MAX);
	memset(deth_eff,0,sizeof(del_effect_t)*DETH_EFFECT_MAX);

	memset(&dn,0,sizeof(dn_t));
	memset(&bright_set,0,sizeof(bright_set_t));
	memset(&bomb,0,sizeof(bomb_t));

	}
int effect_search(){
	for(int i=0;i<EFFECT_MAX;i++){
		if(deth_eff[i].flag>0)
			return i;
		}
	return -1;
	}
void effect_calc(){
	for(int i=0;i<EFFECT_MAX;i++){
		if(effect[i].flag>0){
			switch(effect[i].knd){
				case 0:
					effect[i].cnt++;
					effect[i].r+=0.08;
					if(effect[i].cnt>10)//10カウント以上になったら
						effect[i].brt-=25;//明るさを低くする
					if(effect[i].cnt>20)//20カウント以上になったら
						effect[i].flag=0;//消す
					break;
				case 1:
					//座標計算
					effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
					effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
					//スピード計算
					if(effect[i].cnt<60)
						effect[i].spd-=(0.2+effect[i].cnt*effect[i].cnt/3000.0);
					if(effect[i].cnt==60){
						effect[i].spd=0;
						dn.flag=1;
						dn.cnt=0;
						dn.size=11;
						dn.time=20;
						}
					//明るさと大きさ計算
					effect[i].r+=0.015;
					if(effect[i].cnt<51)
						effect[i].brt+=5;
					if(effect[i].cnt>=60){
						effect[i].r+=0.04;
						effect[i].brt-=255/30.0;
						}
					//カウントアップと消去計算
					effect[i].cnt++;
					if(effect[i].cnt>=90)
						effect[i].flag=0;
					break;
				case 2:
					//座標計算
					effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
					effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
					//明るさ計算
					if(effect[i].cnt<51)
						effect[i].brt+=4;
					if(effect[i].cnt>130-51)
						effect[i].brt-=4;
					//カウントアップと消去計算
					effect[i].cnt++;
					if(effect[i].cnt>=130)
						effect[i].flag=0;
					break;
				case 3:
					//座標計算
					effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
					effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
					//明るさ計算
					if(effect[i].cnt<51)
						effect[i].brt+=2;
					if(effect[i].cnt>130-51)
						effect[i].brt-=2;
					//カウントアップと消去計算
					effect[i].cnt++;
					if(effect[i].cnt>=130)
						effect[i].flag=0;
					break;
				default:
					printfDx("effect設定エラー^q^\n");
					break;
				}
			}
		}
	}
int effect_deth_search(){
	for(int i=0;i<DETH_EFFECT_MAX;i++){
		if(deth_eff[i].flag==0)
			return i;
		}
	return -1;
	}

void effect_enter_deth(int s){
	int k=effect_deth_search();
	if(k != -1){
		deth_eff[k].flag=1;
		deth_eff[k].cnt =0;
		deth_eff[k].col=Enemy[s].back_col;
		deth_eff[k].x=Enemy[s].x;
		deth_eff[k].y=Enemy[s].y;
		}
	}

void effect_deth_calc(){
	int k;
	for(int i=0;i<DETH_EFFECT_MAX;i++){
		if(deth_eff[i].flag>0){
			if(deth_eff[i].cnt%2==0){
				if((k=effect_search())!=-1){
					effect[k].flag=1;
					effect[k].brt=255;
					effect[k].ang=rang(PI);
					effect[k].col=deth_eff[i].col;
					effect[k].eff=1;//光エフェクト
					effect[k].img=img_deth_eff[i];
					effect[k].knd=0;//消滅effect
					effect[k].x=deth_eff[i].x;
					effect[k].y=deth_eff[i].y;
					}
				}
			if(deth_eff[i].cnt>8){//8カウント以上なら
				deth_eff[i].flag=0;
				}
			deth_eff[i].cnt++;
			}
		}
	}

void effect_graph(int knd){
	for(int i=0;i<EFFECT_MAX;i++){
		if(effect[i].flag>0 && effect[i].knd==knd){
			if(effect[i].eff==1)
				SetDrawBlendMode(DX_BLENDMODE_ADD,effect[i].brt);//光エフェクト
			if(effect[i].eff==2)
				SetDrawBlendMode(DX_BLENDMODE_ALPHA,effect[i].brt);
			DrawRotaGraph(effect[i].x+FIELD_X+dn.x,effect[i].y+FIELD_Y+dn.y,effect[i].r,effect[i].ang,effect[i].img,TRUE);
			if(effect[i].eff==1 || effect[i].eff==2)
				SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
			}
		}
	}
void effect_enter_bomb(){
	int k;
	bomb.flag=1;
	bomb.cnt=0;
	bomb.knd=0;
	Player.mutekicnt=1;//無敵
	PlaySoundMem(se_bomb,DX_PLAYTYPE_BACK);
	if((k=effect_search())!=-1){
		effect[k].flag =1;
		effect[k].cnt  =0;
		effect[k].brt  =0;
		effect[k].knd  =3;
		effect[k].ang  =-PI/2;
		effect[k].mvang=-PI/2;
		effect[k].spd  =1;
		effect[k].r    =1;
		effect[k].eff  =2;
		effect[k].img  =img_eff_bomb[2];
		effect[k].x    =70;
		effect[k].y    =300;
		}
	if((k=effect_search())!=-1){
		effect[k].flag =1;
		effect[k].cnt  =0;
		effect[k].knd  =3;//ボムの線のエフェクト
		effect[k].brt  =0;
		effect[k].ang  =0;
		effect[k].mvang=0;
		effect[k].spd  =1;
		effect[k].r    =1;
		effect[k].eff  =2;
		effect[k].img  =img_eff_bomb[2];
		effect[k].x    =100;
		effect[k].y    =350;
		}
	if((k=effect_search())!=-1){
		effect[k].flag =1;
		effect[k].cnt  =0;
		effect[k].knd  =2;//立ち絵
		effect[k].brt  =0;
		effect[k].ang  =0;
		effect[k].mvang=-PI/2;
		effect[k].spd  =0.7;
		effect[k].r    =1;
		effect[k].eff  =2;
		effect[k].img  =img_eff_bomb[3];
		effect[k].x    =260;
		effect[k].y    =300;
		}
	}
void effect_bomb_calc(){
	int n,k,shot_angle[4]={0,PI,PI/2,PI*1.5};//4発エフェクトが飛ぶ角度
	if(Player.flag==0 && bomb.flag==0){//キャラが通常状態で、ボムがオフなら
		if(CheckStatePad(configpad.bomb)==1 || CheckHitKey(KEY_INPUT_X)==1){//ボムボタンが押されたら
			effect_enter_bomb();
			}
		}
	if(bomb.flag==1){//ボムが登録されていたら
		if(bomb.cnt%10==0){//1/6秒に1回
			n=(bomb.cnt/10);
			if(n<4 && (k=effect_search())!=-1){
				effect[k].flag=1;
				effect[k].cnt=0;
				effect[k].knd=1;//エフェクト番号1:ボムのエフェクト
				effect[k].brt=0;
				effect[k].ang=rang(PI);//画像の向きはランダム
				effect[k].mvang=shot_angle[n]-PI/4;//飛ぶ方向
				effect[k].spd=13+rang(2);//スピード
				effect[k].r=0.5;//大きさ
				effect[k].eff=2;//αブレンド
				effect[k].img=img_eff_bomb[(bomb.cnt/10)/3];//画像
				effect[k].x=Player.x;//座標
				effect[k].y=Player.y;
				}
			}
		bomb.cnt++;
		if(bomb.cnt<40){
			bright_set.brt=255-bomb.cnt*5;//画面の明るさ設定(暗く)
			}
		if(bomb.cnt>90){
			bright_set.brt=255-40*5+(bomb.cnt-90)*5;//画面の明るさ設定(明るく)
			}
		if(bomb.cnt>300){
			bomb.flag=0;
			bright_set.brt=255;
			}
		}
	}
void dn_calc(){
	if(dn.flag==1){
		dn.x=(int)rang(dn.size);
		dn.y=(int)rang(dn.size);
		dn.cnt++;
		if(dn.cnt>dn.time){
			dn.flag=0;
			dn.x=0;
			dn.y=0;
			}
		}
	}

void effect_main(){
	dn_calc();
	effect_deth_calc();
	effect_calc();
	effect_bomb_calc();
	}
void effect_main(){
	dn_calc();
	effect_deth_calc();
	effect_calc();
	effect_bomb_calc();
	}
void effect_main(){
	dn_calc();
	effect_deth_calc();
	effect_calc();
	effect_bomb_calc();
	}
graph.cpp

コード:

#include "DxLib.h"
#include "graph.h"
#include "struct.h"
#include "player.h"
#include "effect.h"
#include "Enemy.h"
#include "common.h"

static int img_board[4];//ボード
static int img_back[5]; //背景。stage5まで
static int i=0;

void graph_load(){
	img_board[0] = LoadGraph("dat/board/front_00.png");
	img_board[1] = LoadGraph("dat/board/front_01.png");
	img_board[2] = LoadGraph("dat/board/front_02.png");
	img_board[3] = LoadGraph("dat/board/front_03.png");

	img_back[0]  = LoadGraph("dat/board/back0.png");
	/*---------------------------------------
	img_back[1]  = LoadGraph("dat/board/");
	img_back[2]  = LoadGraph("dat/board/");
	img_back[3]  = LoadGraph("dat/board/");
	img_back[4]  = LoadGraph("dat/board/");
	---------------------------------------*/
             bright_set.brt=255;
	}
void graph_and_effect_load_main(){
	graph_load();
	effect_load_and_ini();
	}
void graph_draw_board(){
	DrawGraph(	0,	0,img_board[2],FALSE);
	DrawGraph(	0, 16,img_board[1],FALSE);
	DrawGraph(	0,464,img_board[2],FALSE);
	DrawGraph(416,	0,img_board[3],FALSE);
	}
void graph_draw_back(){
	SetDrawArea( 32 , 16 , 416 , 464 ) ;//描画可能エリアを設定
	DrawGraph(32,i%700-700,img_back[0],false);
	DrawGraph(32,i%700,img_back[0],false);
	SetDrawArea( 0, 0, 640, 480);//エリアを戻す
	i++;
	}

void graph_main(){
	if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

	graph_back_main();//背景描画メイン
	effect_graph(0);//敵が死ぬエフェクト
	Enemy_Draw();//敵の描画
	player_shot_draw();//自機ショットの描画

	if(bright_set.brt!=255)SetDrawBright(255,255,255);

	player_draw();//自機の描画

	if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);
	//此処に弾の画像の関数を入れる

	if(bright_set.brt!=255)SetDrawBright(255,255,255);

	effect_graph(1);	//ボムのエフェクト
	effect_graph(2);	//ボム線のエフェクト
	effect_graph(3);	//ボムキャラのエフェクト
	graph_draw_board();	//ボードの描画
	player_board();		//スコアとかの文字表示
	}
ここで、ボムを撃つと背景の輝度が下がるはずなのですが、なぜか下がりません。

新・C言語 ~ゲームプログラミングの館~ で、グローバル変数は使わない方が良い、と知ったので、使わないように
しました。そちらの方も何か問題が有りましたら教えて頂けるとありがたいです。

ソースコードは相変わらず汚いですが、ご教授の方宜しくお願いします。

ちなみに、エラーは出ませんでした。
初心者です

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

Re: 龍神録22章

#2

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

インデントがずれていて読みづらいです。
「mixcpp/投稿前チェックリスト - PukiWiki」 ここのチェック3を読んでみてください。
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8

>ここで、ボムを撃つと背景の輝度が下がるはずなのですが、なぜか下がりません。

龍神録に詳しくないので、どこを改造したか教えて下さいね。
それとデバッガで動作は確認されていますか?

あとグローバル変数を止めたの件ですがbright_setの事だとしたら、私にはグローバルな構造体変数に見えるんですが。
これだとグローバル変数を止めた事にはなりません。グローバル変数を止める意図を理解しないと意味が無いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
qwea
記事: 14
登録日時: 13年前

Re: 龍神録22章

#3

投稿記事 by qwea » 11年前

graph.cppの61行目ですが

コード:

if(bright_set.brt!=255)SetDrawBright(255,255,255);
ではなく

コード:

if(bright_set.brt==255)SetDrawBright(255,255,255);
が意図していた動作ではないでしょうか?

#すみません、間違えていました。上の馬鹿な回答は無視してくださいw
最後に編集したユーザー qwea on 2013年3月20日(水) 11:29 [ 編集 1 回目 ]

Rittai_3D
記事: 525
登録日時: 11年前

Re: 龍神録22章

#4

投稿記事 by Rittai_3D » 11年前

>>softya様

返信ありがとうございます。

インデントは修正しておきます。vc++2008の自動インデント?を使用して、そのまま貼り付けてしまいました。

一応、デバッガで確認しましたが、問題は無かったです。

龍神録の22章のSE以外、そのままコピペしています。

また、structhというヘッダに

コード:

typedef struct{
        unsigned char brt;
}bright_set_t;
static bright_set_t brght_set;
としています。
初心者です

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

Re: 龍神録22章

#5

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

ヘッダにstaticと書くとファイルスコープとなりますので、effect.cppとgraph.cppで見ているbrght_set構造体変数は同じ名前でメモリは別のものと言う事になります。
「記憶寿命とスコープ」
http://www2.ee.knct.ac.jp/el/E3/E305/lifeandscope.html

それと元々mainとDrawが折角分かれていたのを台無しにしているので、それも考えたほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 525
登録日時: 11年前

Re: 龍神録22章

#6

投稿記事 by Rittai_3D » 11年前

>>qweaさま

返信ありがとうございます。

先ほど確認しましたが、ボムを撃っても背景は暗くなりませんでした。

また、このパソコンではプログラミングをしていないので、申し訳ありませんが、確認までに時間がかかります。

この後部活が入っていますので、返信がかなり遅れる可能性がありますがご了承ください。
初心者です

Rittai_3D
記事: 525
登録日時: 11年前

Re: 龍神録22章

#7

投稿記事 by Rittai_3D » 11年前

>>softya様。
返信ありがとうございます。

そうなんですか!?

知りませんでした...

あと、どこのDrawとmainですか?
初心者です

Rittai_3D
記事: 525
登録日時: 11年前

Re: 龍神録22章

#8

投稿記事 by Rittai_3D » 11年前

申し訳ありません

effect.cppの267行目からのeffect_mainはコピペに失敗してしまいました。本当は1つだけです。

すいません
初心者です

アバター
qwea
記事: 14
登録日時: 13年前

Re: 龍神録22章

#9

投稿記事 by qwea » 11年前

先ほどは変な回答をすみませんorz

static でそれぞれ別の実体だったのですね
この仕様ならグローバル変数にしたほうがいいのかな?

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

Re: 龍神録22章

#10

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

3D_3D さんが書きました:あと、どこのDrawとmainですか?
こちらは、龍神録の関数名を勘違いしてましたので問題ないです。

もっと問題なstaticの修正に注力してください。
私はstaticのままeffect.cpp側に定義する形に変更して、参照するために値を返す関数を作るべきだと思います。
あるいは、effect.cppでbright_set.brtの値に合わせてSetDrawBrightする関数を作ったほうが良いかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 525
登録日時: 11年前

Re: 龍神録22章

#11

投稿記事 by Rittai_3D » 11年前

>>qweaさま

返信ありがとうございます。

そうですね。今はスマホからなので、帰ったらやります。


>>softyaさま

こんな感じでしょうか?

コード:

int rtight unsigned char brt)
    return brt;
また、先ほど書いたように、スマホからですので、家に帰ってからやります。
初心者です

Rittai_3D
記事: 525
登録日時: 11年前

Re: 龍神録22章

#12

投稿記事 by Rittai_3D » 11年前

とりあえず、インデント一つひとつ治すのは大変なので、新しいプロジェクトを作り、新しく作って行こうと思います。

とても勉強になりました。

ありがとう御座いました

またお世話になるかもしれないので、その時も、教えて頂ければ幸いです。
初心者です

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

Re: 龍神録22章

#13

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

3D_3D さんが書きました:とりあえず、インデント一つひとつ治すのは大変なので、新しいプロジェクトを作り、新しく作って行こうと思います。

とても勉強になりました。

ありがとう御座いました

またお世話になるかもしれないので、その時も、教えて頂ければ幸いです。
全体をCTRL+Aで選択して、編集→詳細→選択範囲のフォーマットで一発でインデントが直りますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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