グレイズを実装!

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

グレイズを実装!

#1

投稿記事 by 素人 » 16年前

ボムの件ではありがとうございました。
グレイズも実装して見ようと思うのですが
グレイズを作るにはどういった「流れ(順序)」で作ればいいのでしょうか?
ボムとはちょっと難しい感じがするんですが
アドバイスをお願いします。

あ~る

Re:グレイズを実装!

#2

投稿記事 by あ~る » 16年前

まずグレイズの当たり判定を、今まで作った自機の当たり判定とかのコードを参考にして作ります
あとはグレイズ数を表す変数を作り、↑で作った当たり判定を満たしていたら、その変数に+1すればOKだと思います

あ、あと前のボムの数にしても今回のグレイズ数にしても、ちゃんとゲーム開始な時に初期化するのを忘れないようにして下さいね(^^)

ひよこ

Re:グレイズを実装!

#3

投稿記事 by ひよこ » 16年前

龍神録の改造ならある範囲を用意して
out_judge(弾のX座標,弾のY座標,ある範囲のX,ある範囲のY,
弾の当たり判定の大きさ,当たり判定の大きさ,弾のスピード,弾の角度)
として、out_judge_enemyshotを(参考に)
で1がかえってきたらch.graze+=1;をすればいいと思います。

Dixq (管理人)

Re:グレイズを実装!

#4

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

確かに当たり判定範囲にあった時、+1すればいいのでしょうが、グレイズは当たり判定範囲にあっただけで+1しないようにするのがポイントです。
もし当たり判定範囲に入っているだけで+1してしまうと、遅い弾などの近くにいると、すごい勢いでグレイズが上がってしまいます。
(マイフレームカウントしてしまう)

グレイズに関する変数は弾にも持たせる必要があり、その弾は発射してから当たり判定範囲が満たされたことがあるかどうかも調べる必要があります。

ですので、bullet_t構造体にグレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにするなどの工夫が必要だと思います。

あ~る

Re:グレイズを実装!

#5

投稿記事 by あ~る » 16年前

あ、そっか
申し訳無いです…
あと横から質問で申し訳無いんですが、レーザーの場合はどうすればいいんでしょうか?
レーザーにグレイズしてから何カウントかしたら、グレイズフラグみたいなのを元に戻してもう一度グレイズ出来るようにすれば大丈夫でしょうか?

Dixq (管理人)

Re:グレイズを実装!

#6

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

私はレーザー一本にグレイズ1カウントしかカウントしないようにしていますが、東方ってどうでしたっけ?
東方と同じシステムにしたければ、そちらを調べてみて、同じになるように計算されてみてはいかがでしょう?

私としてはもし何カウントかしたらフラグを戻すのではなく、
一度当たり判定範囲を離れ、再度当たり判定範囲に近づいたらまたカウントする方がいいような気がします。

あ~る

Re:グレイズを実装!

#7

投稿記事 by あ~る » 16年前

なるほど…
東方では何回もグレイズ出来ます
まぁレーザーについては色々やって好みを実装する事にします
ありがとうございました

ねこ

Re:グレイズを実装!

#8

投稿記事 by ねこ » 16年前

東方は連続弾の合成で表示してるんじゃなかったかな。
死んだ時にレーザーに突っ込むと中だけ削れたりするので分かりやすいかなと。
なので構成数だけグレイズします。

僕はレーザーの場合一つの弾に対して複数の判定領域を持たせてそれぞれで判定してます。
なので長いレーザー程グレイズ数が多いですね。
東方と同じく中が削れるので1個の当たり判定だと都合が悪くなってしまいました。

yu

Re:グレイズを実装!

#9

投稿記事 by yu » 16年前

>>ねこ様

東方のレーザーは米弾か鱗弾(表現が難しいです...)の一つを
引き伸ばしているように見えます

鱗弾を引き伸ばしたレーザー(先の尖ったレーザー)は連続弾で作るのは難しいと思います
あくまで推測ですが^^;

削ることができるのはレーザーを短くするか
2つに別れた場合は新しくレーザーを登録しているのではないでしょうか

Dixq (管理人)

Re:グレイズを実装!

#10

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

私もどうやって表現しようか随分悩みました・・。
いきついた答えが龍神録のような実装の仕方なんですが、どうでしょうかね?
反魂蝶のような切れる事のないレーザーは一つの弾として計算されており、
途切れるレーザーは細かいレーザーの連続じゃないかなと思ったりしました。
その辺はグレイズで確認したり、細かい確認はしてないのでわかりませんが・・。

ねこ

Re:グレイズを実装!

#11

投稿記事 by ねこ » 16年前

>yu様
すいません、合成で表示というのは連続で存在する弾を一つの描画処理で管理するという意味です。
と書いても分かりにくいですね(汗)
8個連なっていたら8個を例えば加算で描いていって表現するのではなく
8個分の長さに沿って調整するような感じです。
その連続の途中で切れたり、バウンドして方向が変わって居たらそこまでのを描き、続きから調べるような。
うん、なんか自分でもよくわかんないけどそんな感じです。

バウンドするレーザーとかあるので連続弾型かな~とずっと思ってました。

>Dixq様
レーザーでグレイズがガリガリ回るのが好きです!
グレイズ自体がスコア絡みだけだったり地霊殿みたいにアイテム回収効果があってプレイに影響あったりシステムによって違うので、どれが正しいってわけでもないんだと思います。

あ~る

Re:グレイズを実装!

#12

投稿記事 by あ~る » 16年前

あ~~、やっぱりレーザーでグレイズいっぱいするの好きですか!?
あれ結構気持ち良いですよねぇ、やっぱり頑張って何グレイズもするようにしてみようか…
レーザーを拡大して描画するのも多分プログラム的にはそんなに難しく無いですよね?というか昔これの質問あった気がしますし

yu

Re:グレイズを実装!

#13

投稿記事 by yu » 16年前

>>ねこ様

描画処理のことではなかったのですね orz
すみません;

確かにレーザーが壁で跳ね返る弾幕がありますね
どうやってるのかな~と思っていましたが
ねこ様の仰る方法ならできそうですね

後、妖々夢にグニャグニャ曲がるレーザーもあったり...w

ねこ

Re:グレイズを実装!

#14

投稿記事 by ねこ » 16年前

>yu様
いえいえあの描き方ではそう捉える方が普通ですごめんなさい。

僕は逆に常に連続で作っていたのでDixqさんの極太レーザーの説明を見て
「あぁ・・・そういえば別にこれでいいのか」と気付いた程です(笑)

<グニャグニャ
別スレでも書いたのですが、本来これをするために連続型にしたような記憶がありますねぇ。

素人

Re:グレイズを実装!

#15

投稿記事 by 素人 » 16年前

アドバイスありがとうございます。一つの弾でグレイズが二回以上増えないようにすること以外はできました。
二回以上グレイズが増えないようにしたいのですが
管理人さんの言ってる
グレイズ変数を用意し、弾を発射した時に1とでも代入しておき、グレイズの判定を満たしたら、これを0にしておき、再度判定されないようにする というのがいまいち分かりません。
もっと具体的にいうとどういうことでしょうか?
特に弾を発射した時に1とでも『代入』するということがよく分かりません。
何に対して代入するのでしょうか?またそのやり方はどうしたらいいですか?

MNS

Re:グレイズを実装!

#16

投稿記事 by MNS » 16年前

敵の弾にグレイズ変数を用意して、
最初はそのグレイズ変数には1を代入しておき、
(ここで、グレイズの判定で、
 判定しようとしている弾のグレイズ変数が1かどうか比較し、
 満たしていたら判定を行う)
グレイズの判定を終えたら、その弾のグレイズ変数に0を代入する。

こういうことではないでしょうか?

素人

Re:グレイズを実装!

#17

投稿記事 by 素人 » 16年前

まず、敵の弾にグレイズ変数を用意というのが分からないです。
次にグレイズ変数には1を代入する場所。

//敵ショットと自機との処理
void enemyshot_and_ch(){
int s,n;
if(ch.flag==0 && ch.mutekicnt==0 && out_lazer()==1){
ch.cnt=0;
ch.flag=1;
se_flag[3]=1;
}
//雑魚敵のショット
for(s=0;s<SHOT_MAX;s++){//敵ショット総数
if(shot.flag>0){//そのショットが登録されていたら
for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
if(shot.bullet[n].flag==1){//弾が登録されていたら
if(bom.flag!=0){
shot.bullet[n].flag=0;
continue;
}
if(out_judge_enemyshot(s,n)==1){//自機にその弾が接触していたら
shot.bullet[n].flag=0;//弾をオフ
if(ch.flag==0 && ch.mutekicnt==0){
ch.cnt=0;
ch.flag=1;
se_flag[3]=1;
}
}

ここのどこかというのは分かるんですけど

素人

Re:グレイズを実装!

#18

投稿記事 by 素人 » 16年前

グレイズの処理については自己解決しました。
ありがとうございます。
あとはグレイズのエフェクトなんですが、
どうやればグレイズした瞬間に白い物体が飛ぶような処理にできるのでしょうか?
アドバイスください


ねこ

Re:グレイズを実装!

#20

投稿記事 by ねこ » 16年前

グレイズした時に白い物体描画用の情報をエフェクト配列に追加するとか・・・。
エフェクト配列でいけるのか、別途配列用意するのかが分かんないですが。

DVDM

Re:グレイズを実装!

#21

投稿記事 by DVDM » 16年前

>>素人さん
グレイズ領域に入った時、自機や敵が弾を撃つような感じで
適当にグレイズエフェクトを飛ばせばいいのではないでしょうか。
飛ばす角度はランダムな値やあらかじめ用意した方向テーブルを用意するといいと思います。

ある角度に飛ばした後は、Xフレーム経ったら消すか、一定の距離進んだ後に
グレイズエフェクトを消去する処理を入れてやるとそれらしい動きになるのではないかと思います。

素人

Re:グレイズを実装!

#22

投稿記事 by 素人 » 16年前

なるほど!
その処理をやってみたいと思います。
ところでimgファイル内のどれがグレイズエフェクトの画像なのかが
分からないのですが、hit.pngで合ってますか?

DVDM

Re:グレイズを実装!

#23

投稿記事 by DVDM » 16年前

>>素人さん
グレイズエフェクトにしたい画像を読み込めばいいと思います。
一応PhotoShopで hit.png を開いてみましたが良く解らなかったです。
その画像でないと動かない訳ではないので imag/char/ball.png を小さくして表示するのもいいかもしれません。

素人

Re:グレイズを実装!

#24

投稿記事 by 素人 » 16年前

分かりました。そうさせてもらいます。
あと、処理を書いてる途中に気づいたことで、
同じ弾の場合、グレイズが一回しか判定しないようにしたのですが、
ボスの弾幕って何回も同じ弾を繰り返しリサイクルする処理のようなので、
ボスの繰り返された弾幕を放ってきた場合、2回目以降グレイズしたとき
グレイズしなくなります。リサイクルされた弾幕も同じようにグレイズ
するようにしたいのですが、どうしたらいいですか?
アドバイスお願いします。

あ~る

Re:グレイズを実装!

#25

投稿記事 by あ~る » 16年前

弾のフラグが0になったら、そのグレイズするかどうかの変数をまた、グレイズできるように戻せばいいんじゃないでしょうか?

素人

Re:グレイズを実装!

#26

投稿記事 by 素人 » 16年前

リサイクルされた弾幕も同じようにグレイズ
するようにするのはこれでいいと思うのですが、
ボスの弾幕をBOSS_BULLET_MAX分自機にヒット(自機が無敵状態のとき)させると
なぜかボスが弾を放たなくなりました。
放つようにするのはどうしたら改善するか教えてください。

yu

Re:グレイズを実装!

#27

投稿記事 by yu » 16年前

.graze が 1 の場合にグレイズできるのですよね?
かすったら 0 になると考えて

弾が出なくなるのは全ての弾の .graze が 1 だから弾が登録できなくなるのではないでしょうか
 (つまり、かすらないと新規に弾を登録できなくなりますね)
変えるべき場所はそこではないと思います。
 (そこでもできますが・・・)

boss_shotH.cpp 内の弾幕を作っている関数内で
弾登録時に
.graze = 1;
を追加すればよいと思います。


実際、自分もプログラミングし始めたころに
龍神録でグレイズを実装しようとしましたが、
自分も少し詰まりました。 ( 静的変数というものを知らなかったので... )

やり始めは大変ですが慣れると楽しくなると思いますので
頑張ってください ^^

素人

Re:グレイズを実装!

#28

投稿記事 by 素人 » 16年前

弾幕を作っている一つ一つ関数全部に
.graze = 1;
を追加ということですか・・?
凄く面倒なことになってしまうので
boss_shot.cpp内で出来る方法を選びたいのですが
どうすればいいのでしょうか?

yu

Re:グレイズを実装!

#29

投稿記事 by yu » 16年前

これでもできますが...
int search_boss_shot(){//空き番号を返す
	for(int i=0;i<BOSS_BULLET_MAX;i++){
		if(boss_shot.bullet.flag==0){
		        boss_shot.bullet.graze = 1;
                   	return i;
                }
	}
	return -1;
}


自分の場合は弾を発射する関数を用意しておいて
値を入れるだけで弾を登録するようにしてあったので
一行だけの変更で大丈夫でした

詳しくは
龍神録プログラミングの支館様のこちらのほうで
http://sinkai.net/rp/0.php

#追記(0:41) 一部記事を編集しました

素人

Re:グレイズを実装!

#30

投稿記事 by 素人 » 16年前

え~とですね、それも前に試したのですけど
そうするとなぜか、ボスはgrazeの当たり判定範囲の部分だけ
ボスが弾幕を放つようになり、その範囲以降は弾は消えてしまうというバグが起こってしまいました。

yu

Re:グレイズを実装!

#31

投稿記事 by yu » 16年前

上の記事で確認したつもりでしたが・・・

>> .graze が 1 の場合にグレイズできるのですよね?
>> かすったら 0 になると考えて

つまり 1 と 0 が逆になっています
if(out_judge_bossshot_graze(n) == 1 && boss_shot.bullet[n].graze == 1){//グレイズ範囲にその弾が接触していたら
	ch.graze += 1;
	boss_shot.bullet[n].graze = 0;
}
に変更してみてください

素人

Re:グレイズを実装!

#32

投稿記事 by 素人 » 16年前

かすったら1になる仕様だったので一応yuさんの言ってることは理解してたのですが
念のため逆に値を変えてみましたけど、同じように
ボスはgrazeの当たり判定範囲の部分だけボスが弾幕を放つバグが出ました。う~ん・・

DVDM

Re:グレイズを実装!

#33

投稿記事 by DVDM » 16年前

>>素人さん
>ボスはgrazeの当たり判定範囲の部分だけボスが弾幕を放つバグが出ました。
まさかとは思いますが、弾の描画処理を「グレイズ当たり判定内にある間実行」という処理に変更したりしていませんか?


私がプログラム内で不具合が出た時は、一端うまく動いている状態へと戻してみます。
うまく動いていたソースから、不具合が出た時までに追加した部分をコメントアウトしていくやり方です。
まず怪しい部分をコメントアウトして、その結果で更にコメントアウトをして・・・と繰り返して範囲を絞っていきます。
段々範囲を絞っていくと自ずと不具合が出ている場所に辿り着くと思います。


今回の件に当てはめると、一端グレイズ処理をコメントアウト等してグレイズ機能をOFFにして実行してみてみます。
もしこれでうまく描画出来ているならばグレイズ処理の追加が原因で不具合が起こったことになり、
うまく描画出来ていないのならばグレイズ機能以外の部分で不具合が起こっています。

Dixq (管理人)

Re:グレイズを実装!

#34

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

>分からないのですが、hit.pngで合ってますか?

いや、hit.pngは敵に弾がヒットした時に出るエフェクト画像です。
龍神録では、例えばボスに弾が当たっている時、被弾点から何かモワモワ出ますよね。あれです。

画像

仰るように、弾幕登録関数を作った方が後々作業が楽ですね。
もし面倒なら置換するって手もあります。
例えば
boss_shot.bullet[k].cnt   = 1;

を

boss_shot.bullet[k].cnt   = 1;
boss_shot.bullet[k].graze = 1;

に置換するとかですね。
 

yu

Re:グレイズを実装!

#35

投稿記事 by yu » 16年前

>> かすったら1になる仕様だったので一応yuさんの言ってることは理解してたのですが

そうでしたか....すみません orz

>> ボスはgrazeの当たり判定範囲の部分だけボスが弾幕を放つバグが出ました。

う~ん・・・私では今提示してあるコードだけではバグの原因が分かりません;
DVDM様が仰るようにどこが不具合の原因かを大体目星を付けて
バグを修正したほうがいいですね。

どうしても分かりませんでしたら、変更した箇所のコードを全て提示して頂ければ
どこで不具合が起きているか見つけられるかもしれません

素人

Re:グレイズを実装!

#36

投稿記事 by 素人 » 16年前

5時間悩んだあげくに
boss_shot.cpp内で
//ボスの弾幕を計算する
void boss_shot_calc(){
	int i;
	boss.endtime--;
	if(boss.endtime<0)
		boss.hp=0;
	for(i=0;i<BOSS_BULLET_MAX;i++){
		if(boss_shot.bullet.flag>0){
			boss_shot.bullet.x+=cos(boss_shot.bullet.angle)*boss_shot.bullet.spd;
			boss_shot.bullet.y+=sin(boss_shot.bullet.angle)*boss_shot.bullet.spd;
			boss_shot.bullet.cnt++;
			if(boss_shot.bullet.cnt>boss_shot.bullet.till){
				if(boss_shot.bullet[i].x<-50 || boss_shot.bullet[i].x>FMX+50 ||
					boss_shot.bullet[i].y<-50 || boss_shot.bullet[i].y>FMY+50)
					boss_shot.bullet[i].flag=0;
			}
		}
		if(boss_shot.bullet[i].flag==0){//←ここから
			boss_shot.bullet[i].graze=0;//リサイクルされた弾幕をグレイズさせるため
		}//←ここまで
	}
	boss_shot.cnt++;
}


を追加することによって無事になんとかバグなどが解消され
グレイズを実装することに成功しました。
一緒に考えてくれた皆さま方、アドバイスなどありがとうございました。

閉鎖

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