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より大きい時—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さんも控えていただければと思います
あと、問題は解決されましたのでこちらのスレッドもロックします
|