このスレッドはロックされています。記事の閲覧のみとなります。
トップページ > 記事閲覧
addattacktime中のロックと敵の攻撃について
名前:マーク42 日時: 2019/10/08 06:09

行いたいことが二つあります。 一つは、ロックして攻撃してから相手の目の前に移動している間はaddattacktimeという変数が500から0になるまで働くのですが その間はロックが出来ないようにしたいです。どのように否定文を書けばいいでしょうか。 二つ目は敵の攻撃に関して、たまに自分の目の前に移動してきて、その1秒後に攻撃をしてくるというものをです。 一つ目に関して if (addattacktime <= 500 && addattacktime > 0)//addattacktimeが0になるまでの間に攻撃があればaddattacktimeは20に戻る {//★addattacktimeが500以下で0より大きい時&#8212;1されていく、そして500以下ならばかつ0より大きいならばずっと処理されるということ。 --addattacktime; このように否定を書くことでRキーを押せないようにしようとしました。→!Key[KEY_INPUT_R] == 1; if (Key[KEY_INPUT_K] == 1 && Kcount == 50 && enemyImage == enemyGHandle[5]) {//攻撃がキックだった場合 Kcount = Kcount - 50;//キーKを押すたびに50だけ引く enemyImage = enemyGHandle[5]; if (enemyImage == enemyGHandle[5])//攻撃を食らうと右向きになるようにする { enemyHP = enemyHP - 50; playerImage = playerGHandle[4]; addattacktime = 500; } } } 二つ目に関して、以下の部分で // 敵の移動 int t = GetNowCount(); if (t >= nextMoveTime) { // 指定の時間が経ったら(1sごとに) nextMoveTime = t + MOVE_INTERVAL; // 次回移動処理をする時刻 if (stopCount > 0) { // 停止中のとき stopCount--; // 止まっている残り時間(回数)を減らす } else { // 普通の状態のとき if (GetRand(99) < 10) { // たまに(10%の確率で) stopCount = GetRand(4); // 数秒間(1〜5秒間)その場に止まる } else if (GetRand(99) < 50) { //enemyX = playerX + 1;//敵が目の前に移動してくる。 enemyattack = 1; enemyX = playerX + 1; enemyY = playerY; if (enemyattack > 0) { ++enemyattack; } if(enemyattack == 5){ playerHP = playerHP - 50; } } else { // 9マス上のいずれかのパネルに移動させる int cy = enemyY, cx = enemyX; do { enemyY = GetRand(2); enemyX = GetRand(2) + 3; } while (enemyX == cx && enemyY == cy || enemyX == playerX && enemyY == playerY); enemyImage = enemyGHandle[10]; enemyMove = 1; } } } の else if (GetRand(99) < 50) { //enemyX = playerX + 1;//敵が目の前に移動してくる。 enemyattack = 1; enemyX = playerX + 1; enemyY = playerY; if (enemyattack > 0) { ++enemyattack; } if(enemyattack == 5){ playerHP = playerHP - 50; } } の部分を付け足しました。自分の目の前にたまに敵は移動してくるのですが、なぜか攻撃はしてきてくれません。どうしてでしょうか。 また、敵が目の前にいる際に前に進むと敵と重なるのですが、敵が目の前にいるときに敵のいる座標に進めないようにするには どのように否定文で書けばいいのでしょうか。 以下は全体のコードです。 pastebin.com/UvLhSgm6
メンテ

Page: 1 |

Re: addattacktime中のロックと敵の攻撃について ( No.1 )
名前:マーク42 日時:2019/10/08 08:26

以下のように書いたところ、敵が攻撃してきてくれるのですが、問題があります。 自分が動けば敵もついてきてしまい、攻撃が必ず当たってしまいます。 // 敵の移動 int t = GetNowCount(); if (t >= nextMoveTime) { // 指定の時間が経ったら(1sごとに) nextMoveTime = t + MOVE_INTERVAL; // 次回移動処理をする時刻 if (stopCount > 0) { // 停止中のとき stopCount--; // 止まっている残り時間(回数)を減らす } else { // 普通の状態のとき if (GetRand(99) < 10) { // たまに(10%の確率で) stopCount = GetRand(4); // 数秒間(1〜5秒間)その場に止まる } else { // 9マス上のいずれかのパネルに移動させる int cy = enemyY, cx = enemyX; do { enemyY = GetRand(2); enemyX = GetRand(2) + 3; } while (enemyX == cx && enemyY == cy || enemyX == playerX && enemyY == playerY); enemyImage = enemyGHandle[10]; enemyMove = 1; } }if (GetRand(99) < 5) { //enemyX = playerX + 1;//敵が目の前に移動してくる。 enemyattack = 1; enemyX = playerX + 1; enemyY = playerY; }if (enemyattack > 0) { enemyattack++; enemyX = playerX + 1; enemyY = playerY; } if (enemyattack == 5) { playerHP = playerHP - 50; enemyattack = 0; playerImage = playerGHandle[11]; enemyX = playerX + 1; enemyY = playerY; } } なので以下のように新しい変数として、preenemyXとpreenemyYを付け加えて、攻撃してくるために自分の目の前に移動したマスに enemyattack == 5になるまでずっととどまるようにしてみたのですが、思うようにいきません。 // 敵の移動 int t = GetNowCount(); if (t >= nextMoveTime) { // 指定の時間が経ったら(1sごとに) nextMoveTime = t + MOVE_INTERVAL; // 次回移動処理をする時刻 if (stopCount > 0) { // 停止中のとき stopCount--; // 止まっている残り時間(回数)を減らす } else { // 普通の状態のとき if (GetRand(99) < 10) { // たまに(10%の確率で) stopCount = GetRand(4); // 数秒間(1〜5秒間)その場に止まる } else { // 9マス上のいずれかのパネルに移動させる int cy = enemyY, cx = enemyX; do { enemyY = GetRand(2); enemyX = GetRand(2) + 3; } while (enemyX == cx && enemyY == cy || enemyX == playerX && enemyY == playerY); enemyImage = enemyGHandle[10]; enemyMove = 1; } }if (GetRand(99) < 10) { //enemyX = playerX + 1;//敵が目の前に移動してくる。 enemyattack = 1; enemyX = playerX + 1; preenemyX = enemyX; enemyY = playerY; preenemyY = enemyY; }if (enemyattack > 0) { enemyattack++; preenemyX = enemyX; preenemyY = enemyY; } if (enemyattack == 5) { playerHP = playerHP - 50; enemyattack = 0; playerImage = playerGHandle[11]; preenemyX = enemyX; preenemyY = enemyY; } } 以下は全体のコードです。 pastebin.com/zu9fQQMK
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.2 )
名前:管理人 日時:2019/10/09 01:10

> 一つ目に関して > if (addattacktime <= 500 && addattacktime > 0)//addattacktimeが0になるまでの間に攻撃があればaddattacktimeは20に戻る >  {//★addattacktimeが500以下で0より大きい時&#8212;1されていく、そして500以下ならばかつ0より大きいならばずっと処理されるということ。 >  --addattacktime; > このように否定を書くことでRキーを押せないようにしようとしました。→!Key[KEY_INPUT_R] == 1; すみません、マーク42さんがどのくらいプログラムを理解されているかということについて 私の認識が甘かったようです マーク42さんが作られようとされているゲームを完成させようと考える場合、本件の問題 『ロックして攻撃してから相手の目の前に移動している間はaddattacktimeという変数が0になるまではロックが出来ないようにする』 くらいは自力で解決できないと今後実装したい機能のほぼすべてについて誰かの協力が必要になってしまうと思います 申し訳ありませんが、この問題については自力での解決を目指してください > 以下のように書いたところ、敵が攻撃してきてくれるのですが、問題があります。 > 自分が動けば敵もついてきてしまい、攻撃が必ず当たってしまいます。 > なので以下のように新しい変数として、preenemyXとpreenemyYを付け加えて、攻撃してくるために自分の目の前に移動したマスに > enemyattack == 5になるまでずっととどまるようにしてみたのですが、思うようにいきません。 if (enemyattack > 0) { enemyattack++; preenemyX = enemyX; preenemyY = enemyY; } if (enemyattack == 5) { playerHP = playerHP - 50; enemyattack = 0; playerImage = playerGHandle[11]; preenemyX = enemyX; preenemyY = enemyY; } 単純な書き間違いだと思いたいのですが… こちらの中の preenemyX, preenemyY の使い方に問題があるのですが、分かりますか?
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.3 )
名前:マーク42 日時:2019/10/09 02:01

返信ありがとうございます。 甘えすぎていました。すいません。 はい、自力で解決をしてみます。 preenemyXとpreenemyYにおいての問題は enemyXとenemyYの情報をpreenemyXとpreenemyYに代入する使い方をしました。 申し訳ありません。問題がどこにあるかわかりません。
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.4 )
名前:管理人 日時:2019/10/09 02:37

すみません、私の早とちりかもしれません > 以下は全体のコードです。 > pastebin.com/zu9fQQMK ↑こちらのプログラムには preenemyX, preenemyY について int preenemyX = 0, preenemyY = 0; しか書かれていないようで、こちらの部分↓がありませんでした // 敵の移動 int t = GetNowCount(); if (t >= nextMoveTime) { // 指定の時間が経ったら(1sごとに) nextMoveTime = t + MOVE_INTERVAL; // 次回移動処理をする時刻 if (stopCount > 0) { // 停止中のとき stopCount--; // 止まっている残り時間(回数)を減らす } else { // 普通の状態のとき if (GetRand(99) < 10) { // たまに(10%の確率で) stopCount = GetRand(4); // 数秒間(1〜5秒間)その場に止まる } else { // 9マス上のいずれかのパネルに移動させる int cy = enemyY, cx = enemyX; do { enemyY = GetRand(2); enemyX = GetRand(2) + 3; } while (enemyX == cx && enemyY == cy || enemyX == playerX && enemyY == playerY); enemyImage = enemyGHandle[10]; enemyMove = 1; } }if (GetRand(99) < 10) { //enemyX = playerX + 1;//敵が目の前に移動してくる。 enemyattack = 1; enemyX = playerX + 1; preenemyX = enemyX; enemyY = playerY; preenemyY = enemyY; }if (enemyattack > 0) { enemyattack++; preenemyX = enemyX; preenemyY = enemyY; } if (enemyattack == 5) { playerHP = playerHP - 50; enemyattack = 0; playerImage = playerGHandle[11]; preenemyX = enemyX; preenemyY = enemyY; } } こちらの部分も含めた最新の全体のコードをアップしていただけないでしょうか?
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.5 )
名前:マーク42 日時:2019/10/09 02:42

わかりにくくてすいませんでした。 是非アップさせて頂きます。 以下が全体のコードです。あれからどうにか自己解決しようと試行錯誤したゆえに少し変わりました。 pastebin.com/Pg0LKUd9
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.6 )
名前:マーク42 日時:2019/10/09 05:15

addattacktime中に関しては、 addatacktimeのif文の中に if (Key[KEY_INPUT_R] == 1) { lock = 0; } を書くことでマスを移動した後のそのマスにいる間は新たにロックオン出来ないようにできました!
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.7 )
名前:管理人 日時:2019/10/10 01:01

>  addattacktime中に関しては、 > addatacktimeのif文の中に > if (Key[KEY_INPUT_R] == 1) { >  lock = 0; >  } > を書くことでマスを移動した後のそのマスにいる間は新たにロックオン出来ないようにできました! おぉ、力業で解決されましたね > 以下が全体のコードです。あれからどうにか自己解決しようと試行錯誤したゆえに少し変わりました。 > pastebin.com/Pg0LKUd9 全体のコードを拝見しました 結論から申し上げますと、私の早とちりではなかったようです マーク42さんは本当に基礎的な部分を理解されずにプログラムを組まれているようです No.2 のときの私の認識すら甘かったと思えるほどです 理解されている部分はある程度理解されていると感じるのですが、理解されていないと思われる部分では 極端に理解されていない、という印象です 申し訳ありませんが、今一度書籍やウェブサイトで基礎を学びなおしてみてください ( 特に『変数』や『処理の流れ』について学ばれると良いと思います ) 基礎的な知識が得られれば preenemyX と preenemyY をどのように扱えば敵を留められるのかについても ご自分で答えを出せるようになるはずです
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.8 )
名前:マーク42 日時:2019/10/10 01:22

わかりました。 どうもありがとうございました。
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.9 )
名前:マーク42 日時:2019/10/10 17:52

雑談のスレにおいて、私事でご迷惑をおかけしました。申し訳ありませんでした。 そして、私の質問に親切に解答してくださりどうもありがとうございました。
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.10 )
名前:マーク42 日時:2019/10/10 19:33

// 敵の移動 int t = GetNowCount(); if (t >= nextMoveTime) { // 指定の時間が経ったら(1sごとに) nextMoveTime = t + MOVE_INTERVAL; // 次回移動処理をする時刻 if (stopCount > 0) { // 停止中のとき stopCount--; // 止まっている残り時間(回数)を減らす } else { // 普通の状態のとき if (GetRand(99) < 10) { // たまに(10%の確率で) stopCount = GetRand(4); // 数秒間(1〜5秒間)その場に止まる } else { // 9マス上のいずれかのパネルに移動させる int cy = enemyY, cx = enemyX; do { enemyY = GetRand(2); enemyX = GetRand(2) + 3; } while (enemyX == cx && enemyY == cy || enemyX == playerX && enemyY == playerY); enemyImage = enemyGHandle[10]; enemyMove = 1; } }if (GetRand(99) < 30) { //enemyX = playerX + 1;//敵が目の前に移動してくる。 enemyattack = 1; rundumsave = GetRand(99); enemyX = playerX + 1; enemyY = playerY; preenemyX = enemyX; preenemyY = enemyY; } if (GetRand(99) < 10) { //enemyX = playerX + 1;//敵が目の前に移動してくる。 enemyattack = 1; enemyX = playerX + 1; preenemyX = enemyX; enemyY = playerY; preenemyY = enemyY; }if (enemyattack > 0) { enemyattack++; enemyX = preenemyX; enemyY = preenemyY; if (enemyattack == 5 && enemyX == playerX + 1&& enemyY == playerY) { playerHP = playerHP - 50; enemyattack = 0; playerImage = playerGHandle[11]; enemyX = preenemyX; enemyY = preenemyY; enemyattack = 0; } } } とすることで、実現したいことを再現できました!なんとか自力で解決できました。 これでも基礎は勉強しています。ですが、組み合わせようとすると混乱することがあります。 ですので、今回のように時間がかかることがあります。 私のことに関して誹謗中傷なことを書き込んでいる人がいるようですが、 これを見ても私が小学生以下の馬鹿でクズでif文すら理解できない障害者と言えるのでしょうか。 (多分以上のプログラムを書いても私を認めたくないのでしょうね。 まあ、誹謗中傷なことを書き込んでいる人はまともな人とは思っていません。なので私のことに関して理解を求めるなんて無意味なことは考えていません。) 確かに皆様にご迷惑をおかけしましたが全く何も身についていないわけではありません。 人より時間がかかりますが、身についていることはあります。そして、身に着けたことを使って今回のように自己解決が出来てきています。
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.11 )
名前:マーク42 日時:2019/10/10 23:25

確かに作っていただいた部分や、作っていただいた後で理解して改造した部分はあることは事実です。 しかし、中には今回のプログラムのように一から自力で作ったものがあることも事実です。 まあ、何言っても無駄でしょうけど。 5ちゃんねるに私のことを書き込んでいる人間は誰にも頼らずに何もかも一から作れる人らしいので、そんな人から見たら私は馬鹿なのでしょうね。
メンテ
Re: addattacktime中のロックと敵の攻撃について ( No.12 )
名前:管理人 日時:2019/10/11 00:14

お見事です すみません、自力での解決にはもっと時間が掛かると思っていました ただ、言い争いは控えてください 昨日も、もう少し言い争いが続いたら対処しなければならないと思っていたところですので マーク42さんも控えていただければと思います あと、問題は解決されましたのでこちらのスレッドもロックします
メンテ

Page: 1 |