Re: 画像が元に戻るまで時間がかかる。 ( No.1 ) |
- 名前:管理人 日時:2019/10/02 00:11
if (Gtime >= 5) {
↑こちらの if の中で Gtime = 0; を実行されていますが、それとは別に
if (Key[KEY_INPUT_G] == 1 && Gcount <= 15) {
↑こちらの if は Gcount が 15 以下のあいだは何度でも成り立ちます
Gtime が 5 以上になり、 if (Gtime >= 5) { の中で 0 になった直後に
if (Key[KEY_INPUT_G] == 1 && Gcount <= 15) { の中で Gtime が 1 になっているのではないでしょうか?
|
Re: 画像が元に戻るまで時間がかかる。 ( No.2 ) |
- 名前:マーク42 日時:2019/10/02 01:50
管理人様、いつもどうもありがとうございます!
説明してい頂きありがとうございます。ですが私の理解力が低いため原因を提示して頂けましたが、理解ができていません。
以下はマルチポストです。
dixq.net/forum/viewtopic.php?f=3&t=20789
|
Re: 画像が元に戻るまで時間がかかる。 ( No.3 ) |
- 名前:五月花 日時:2019/10/02 15:02
C++を触ったことがないので色々間違ってるかもですが、
if (Gcount == 0) { Gcount = 15; }よりGcount <= 15は常に成り立ち、Gキーを押している間は
常に@が成り立つように見えます。
if (Key[KEY_INPUT_G] == 1 && Gcount <= 15) { …@
Gtime = 1;
Gcount = Gcount - 1;
...
}
if (Gtime >= 1) { …A
++Gtime;
if (Gtime >= 5) { …A'
...
}
}
とした場合、これらはwhile (ProcessMessage() == 0) { 内のコードなので@A@A@A…と
繰り返し処理されます。
@がTrueのときGtimeは1となり、AはTrueになりますが、A'はGtime = 2 < 5のためFalseになり、
A'内の処理は行われません。
次に行われる処理は@で、Gキーを押している間はTrueになるので@内の処理が行われ、
ATrue、A'False…とループしているようです。
Gキーを離せば程なくA'もTrueになってplayerの向きが変わる感じだと思います。
|
Re: 画像が元に戻るまで時間がかかる。 ( No.4 ) |
- 名前:マーク42 日時:2019/10/02 19:19
五月花さんありがとうございます。
デバックして確認したところ、++Gtime;により、ちゃんと繰り上がっているので、A´でもTrueになっていました。
ですが、playerImage = playerGHandle[2];となる時間が長いため、疑似的に早く終了させるために以下のようにしました。
if (Gtime >= 1) {
playerImage = playerGHandle[9];
++Gtime;
if (Gtime >= 5) {//Gtimeが変わった際に、次のifも成立するように以前のifが成立するように作る必要がある。Gtimeが5以上になるまでplayerGHandle[9]を描画する。
playerImage = playerGHandle[2];
}
if (Gtime >= 10) {
playerImage = playerGHandle[4];
Gtime = 0;
}
}
ただ問題があり、銃弾が0発になったら、一定時間使え無くし、時間が経ったら満タンにするように書いたのですが、
なぜか撃っても‐1されなかったり、0になっていないのに15に戻ったりします。書いた通りに動いてくれません。
if (Gtime >= 1) {
playerImage = playerGHandle[9];
++Gtime;
if (Gtime >= 5) {//Gtimeが変わった際に、次のifも成立するように以前のifが成立するように作る必要がある。Gtimeが5以上になるまでplayerGHandle[9]を描画する。
playerImage = playerGHandle[2];
}
if (Gtime >= 10) {
playerImage = playerGHandle[4];
Gtime = 0;
}
}
if (Gcount == 0) ++frames;
if (frames % 10 == 0) {
++Gcount; if (Gcount > 15) { Gcount = 15; }
}
|
Re: 画像が元に戻るまで時間がかかる。 ( No.5 ) |
- 名前:管理人 日時:2019/10/02 23:21
if (frames % 10 == 0) {
++Gcount; if (Gcount > 15) { Gcount = 15; }
}
↑こちらのプログラムですと、frames は初期値が 0 なので必ず frames % 10 == 0 が成り立ち if の中に入り、
Gcount が +1 されるので、Gキーを押して Gcount が -1 されても直後に +1 され、『撃っても-1されない』状態になります
> 銃弾が0発になったら、一定時間使え無くし、時間が経ったら満タンにするように書いたのですが、
一定時間が経ったら 0 から 15 に一気に増えるのですか?
それとも 0, 1, 2, 3 ... と徐々に増えるのですか?
|
Re: 画像が元に戻るまで時間がかかる。 ( No.6 ) |
- 名前:マーク42 日時:2019/10/03 04:03
管理人様、返信ありがとうございます。
15発撃った後、30秒ほどたったら15発一気に増えるようにしたいです。
|
Re: 画像が元に戻るまで時間がかかる。 ( No.7 ) |
- 名前:マーク42 日時:2019/10/03 17:00
管理人様、五月花様、銃の攻撃とは別に
プレイヤーの動きが背中を向けた状態から(ゆっくりではなく)右横を向く状態になるようにするにはどのように書き直せばいいでしょうか。
以下は私が書いたコードです。
if (Gtime >= 1) {
playerImage = playerGHandle[9];
++Gtime;
if (Gtime >= 5) {//Gtimeが変わった際に、次のifも成立するように以前のifが成立するように作る必要がある。Gtimeが5以上になるまでplayerGHandle[9]を描画する。
playerImage = playerGHandle[2];
}
if (Gtime >= 10) {
playerImage = playerGHandle[4];
Gtime = 0;
}
}
|
Re: 画像が元に戻るまで時間がかかる。 ( No.8 ) |
- 名前:管理人 日時:2019/10/04 00:00
> 15発撃った後、30秒ほどたったら15発一気に増えるようにしたいです。
分かりました
実現するには変数の追加が必要ですので、現在の最新のプログラムをアップしていただけないでしょうか?
> プレイヤーの動きが背中を向けた状態から(ゆっくりではなく)右横を向く状態になるようにするにはどのように書き直せばいいでしょうか。
ただちに右を向かせたいのでしたら単純に
if (Gtime >=1 ){
playerImage = playerGHandle[4];
Gtime = 0;
}
で良いのではないでしょうか?
もしそうではないのだとしますと、マーク42さんの意図としてはどのようにアニメーションさせたいのでしょうか?
現在は
キーGを押す
↓
左向く( playerGHandle[ 9 ] )
↓
↓ 4フレーム後
↓
上向く( playerGHandle[ 2 ] )
↓
↓ 5フレーム後
↓
右向く( playerGHandle[ 4 ] )
となっていますが…
|
Re: 画像が元に戻るまで時間がかかる。 ( No.9 ) |
- 名前:マーク42 日時:2019/10/04 01:30
管理人様、いつもいつもありがとうございます。
こんな私のような出来損ないを相手にしてくださりありがとうございます。
こちらが全体のコードです。
pastebin.com/66tVR2y4
今現在使っている画像はあくまで確認のための画像なので、画像が切り替わってくれれば良いと考えています。
最初は右横を向いているので、そのあと真正面を向いて、次に左横を向いて元の状態に戻るように作りたいです。
>>実現するには変数の追加が必要ですので、現在の最新のプログラムをアップしていただけないでしょうか?
今までと同じように作ったつもりなのですが、何かがダメだったようで、新しい変数を追加するとはわかりませんでした。
出来れば、今後の勉強のために何がいけなかったのか詳しく教えてく頂けると大変ありがたいです。
あの後、以下のようにコードを書きました。
if (Key[KEY_INPUT_G] == 1 && Gcount <= 15) {//前のifが成り立っても攻撃が当たらなければ相手のHPは減らない、しかし、前のif文が成立して次のif文も成立すれば相手のHPが減る。
Gtime = 1;
++Gtime;
Gcount = Gcount - 1;
if (playerY == enemyY) {
enemyHP = enemyHP - 10;
enemyImage = enemyGHandle[5];
}
}
if (Gtime >= 5) {//ifの中にifを書くときは前のifが成り立っていいないとならないため、そうでない場合は新しいif文として書いた
//10以上になるまで+1していく、if (++Gtime >= 10)だと10以上になったら元に戻るので、其のあとも進むように
//if (Gtime >= 1&& Gtime <= 5)とすると playerGHandle[9]が無視されちゃうので繰り替えのように見えない。なので分けた。
//if (Gtime >= 1 && Gtime >= 5)とするとplayerGHandle[2]に切り替えるif文がないのでplayerGHandle[9]の後ろ向きにしかならない。
playerImage = playerGHandle[8];
}
if (Gtime >= 7) {
playerImage = playerGHandle[9];
Gtime = 0;
}
//if (Gcount <= 0) { Gcount = 0; }//こいつによってGcountが負の値に進まずにいる。
if (Gcount == 0) ++frames;
if (frames % 50 == 0) {
++Gcount; if (Gcount > 15) { Gcount = 15; }
}
 |
Re: 画像が元に戻るまで時間がかかる。 ( No.10 ) |
- 名前:マーク42 日時:2019/10/04 01:45
今現在以下のように書きましたが、やはり、元の右横向きになるまでに一瞬でなるときもあれば、数秒かかるときもあります。
if (Key[KEY_INPUT_G] == 1 && Gcount <= 15) {//前のifが成り立っても攻撃が当たらなければ相手のHPは減らない、しかし、前のif文が成立して次のif文も成立すれば相手のHPが減る。
Gtime = 1;//if文によりGが押された瞬間にしか++Gtime;されないのでこれでは意味がない。
Gcount = Gcount - 1;
if (playerY == enemyY) {
enemyHP = enemyHP - 10;
enemyImage = enemyGHandle[5];
}
}
if (Gtime >= 1) {
Gtime++;
//if (Gtime >= 5) {//ifの中にifを書くときは前のifが成り立っていいないとならないため、そうでない場合は新しいif文として書いた
//10以上になるまで+1していく、if (++Gtime >= 10)だと10以上になったら元に戻るので、其のあとも進むように
//if (Gtime >= 1&& Gtime <= 5)とすると playerGHandle[9]が無視されちゃうので繰り替えのように見えない。なので分けた。
//if (Gtime >= 1 && Gtime >= 5)とするとplayerGHandle[2]に切り替えるif文がないのでplayerGHandle[9]の後ろ向きにしかならない。
//Gtime++;
if (Gtime >= 3) { playerImage = playerGHandle[8]; }
if (Gtime >= 7) {
playerImage = playerGHandle[9];
Gtime = 0;
}
}
|
Re: 画像が元に戻るまで時間がかかる。 ( No.11 ) |
- 名前:管理人 日時:2019/10/05 15:15
プログラムのアップありがとうございます
『15発撃った後、30秒ほどたったら15発一気に増える』ようにする方法ですが、
まず『銃の弾が0になってから経過したフレーム数』をカウントするための変数 GcountZeroCounter を追加します。
int Gtime = 0; の次の行辺りに int GcountZeroCounter = 0; を追加してください
次に、
if (Gcount == 0) ++frames;
if (frames % 50 == 0) {
++Gcount; if (Gcount > 15) { Gcount = 15; }
}
こちらの代わりに
if (Gcount <= 0) { //銃の弾の数が0以下だったら
++GcountZeroCounter; //『銃の弾が0になってから経過したフレーム数をカウントする変数』を+1する
if (GcountZeroCounter >= 900) { //銃の弾が0になってから経過したフレーム数が15秒( 60 × 15 )経過したら
Gcount = 15; //銃の弾の数を15に増やす
GcountZeroCounter = 0; //次回のカウント処理のために『銃の弾が0になってから経過したフレーム数をカウントする変数』を0にする
}
}
を書いてください
各行の解説は注釈の通りです
単純に Gcount が 0 以下になってから 15秒経過したら Gcount に 15 を代入する、という処理です
( そして15秒経過をカウントするために使った GcountZeroCounter を 0 に戻す )
> 最初は右横を向いているので、そのあと真正面を向いて、次に左横を向いて元の状態に戻るように作りたいです。
すみません、マーク42さんがされたいことについて詳しい情報を得たいので、以下のご質問にお答えいただけないでしょうか
1. 『最初』とは銃を撃った直後、ということでしょうか?
2. 『元の状態』とは『左横を向いている状態』のことでしょうか?
3. 『右横』『真正面』『左横』がそれぞれ playerGHandle の要素番号が何番になるのか教えてください( 4, 7, 10 で合っていますでしょうか? )
4. マーク42さんが意図する『右を向いている時間』『真正面を向いている時間』『左横を向いている時間』を教えてください( それぞれ 0.1秒くらい、など )
 |
Re: 画像が元に戻るまで時間がかかる。 ( No.12 ) |
- 名前:マーク42 日時:2019/10/06 19:30
いつもありがとうございます!
ご親切にコードをありがとうございます。
また、返信が遅くなりすいません。
1. 『最初』とは銃を撃った直後、ということでしょうか?
銃を撃つ瞬間です。
2. 『元の状態』とは『左横を向いている状態』のことでしょうか?
元の状態は右を向いている時の状態です。移動している最中と同じ右向きの状態です。
3. 『右横』『真正面』『左横』がそれぞれ playerGHandle の要素番号が何番になるのか教えてください( 4, 7, 10 で合っていますでしょうか? )
はい!合っています!
4. マーク42さんが意図する『右を向いている時間』『真正面を向いている時間』『左横を向いている時間』を教えてください( それぞれ 0.1秒くらい、など )
詳しく書かなくてすいません。
すべて1sほどで考えています。
|
Re: 画像が元に戻るまで時間がかかる。 ( No.13 ) |
- 名前:管理人 日時:2019/10/07 01:32
ご質問のご返答ありがとうございます
> すべて1sほどで考えています。
1s とは 1秒 ということで良いでしょうか?( s = second = 日本語で『秒』 )
1秒という前提で行きます
こちらの部分を、
if (Key[KEY_INPUT_G] == 1 && Gcount <= 15) {//前のifが成り立っても攻撃が当たらなければ相手のHPは減らない、しかし、前のif文が成立して次のif文も成立すれば相手のHPが減る。
Gtime = 1;
++Gtime;
Gcount = Gcount - 1;
if (playerY == enemyY) {
enemyHP = enemyHP - 10;
enemyImage = enemyGHandle[5];
}
}
if (Gtime >= 5) {//ifの中にifを書くときは前のifが成り立っていいないとならないため、そうでない場合は新しいif文として書いた
//10以上になるまで+1していく、if (++Gtime >= 10)だと10以上になったら元に戻るので、其のあとも進むように
//if (Gtime >= 1&& Gtime <= 5)とすると playerGHandle[9]が無視されちゃうので繰り替えのように見えない。なので分けた。
//if (Gtime >= 1 && Gtime >= 5)とするとplayerGHandle[2]に切り替えるif文がないのでplayerGHandle[9]の後ろ向きにしかならない。
playerImage = playerGHandle[8];
}
if (Gtime >= 7) {
playerImage = playerGHandle[9];
Gtime = 0;
}
以下のようにすることで
if (Key[KEY_INPUT_G] == 1 && Gcount >= 1 && Gtime == 0) { //キーGを押していて且つ残り弾数( Gcount )が1発以上あって銃を撃ってからの経過時間( Gtime )が0の場合のみ銃を撃てる
Gtime = 1; //銃を撃ってからの経過時間を1にする
Gcount = Gcount - 1; //残弾数を-1する
playerImage = playerGHandle[7]; //真正面の状態にする
if (playerY == enemyY) {
enemyHP = enemyHP - 10;
enemyImage = enemyGHandle[5];
}
}
if (Gtime > 0) { //銃を撃ってからの経過時間が0より大きい場合のみ
++Gtime; //銃を撃ってからの経過時間を+1する
}
if (Gtime == 60) { //銃を撃ってから1秒( 60 )経過したら
playerImage = playerGHandle[10]; //左横向きの状態にする
}
if (Gtime == 120) { //銃を撃ってから2秒( 120 )経過したら
playerImage = playerGHandle[4]; //右横向きの状態に戻す
Gtime = 0; //銃を撃ってからの経過時間を0に戻す
}
『最初は右横を向いていて、銃を撃った後真正面を向いて1秒、次に左横を向いて1秒、そのあと元の右横の向きに戻る』
となります( 1秒 = 60フレーム の換算なので、それぞれ Gtime が 60 の時と 120 の時に playerImage を変更しています )
説明は注釈の通りですが、前回の No.11 の書き込みの分も含めて不明な点がありましたらお訊ねください
 |
Re: 画像が元に戻るまで時間がかかる。 ( No.14 ) |
- 名前:マーク42 日時:2019/10/08 18:46
返信遅くなりすいません。
どうもありがとうございます!
ビルドしたところ今までに一番理想に近い形になりました!
いつもいつも本当にありがとうございます!
|