Кроме того, атака работает, однако, основная проблема заключается в том, что я должен сделать атаку оружия в ОДНОМ НАПРАВЛЕНИИ.
Привет, я делаю поворотную игру, в которой игрок может либо двигаться, либо атаковать врагов, используя определенное оружие. Враги просто используют простую логику атаки, проверяя, находится ли игрок поблизости, а затем заставляют его нанести урон, если это так. Рядом() использует Math.Abs, чтобы найти абсолютное расстояние.
Вот старый метод Near(), используемый для атаки Enemy:
public bool Nearby(Point locationToCheck, int distance)
{
if (Math.Abs(location.X - locationToCheck.X) < distance &&
(Math.Abs(location.Y - locationToCheck.Y) < distance))
{
return true;
}
else
{
return false;
}
}
Таким образом, класс Enemy, который содержит указанный выше метод, передает местоположение игрока в метод и его собственный диапазон атаки как int, а затем проверяет его на свое местоположение и наносит ущерб игроку, если возвращает true.
Однако атака игрока сложнее. Его оружие должно сначала проверять расстояние "Рядом"() в данном направлении. Поэтому мне нужно написать новый перегруженный метод Near() для работы с логикой атаки с оружием игрока. Я не знаю, как это сделать. Так или иначе, метод атаки оружия игрока должен передавать параметры в следующий метод DamageEnemy():
protected bool DamageEnemy(Direction direction, int radius, int damage, Random random)
{
Point target = game.PlayerLocation;
for (int distance = 0; distance < radius; distance++) {
foreach (Enemy enemy in game.Enemies) {
if (Nearby(enemy.Location, target, distance)) {
enemy.Hit(damage, random);
return true;
}
}
target = Move(direction, target, game.Boundaries);
}
return false;
}
Этот метод DamageEnemy основан на двух новых перегруженных методах, вышеупомянутом методе Move() и перегруженном методе Near(). Я делаю это как учебник в Oreilly Headfirst С#, p. 480, кстати.
* Исходный унаследованный метод Move() прост; он просто обновляет поле местоположения объекта, которое наследует его в направлении, основанном на вводе одного из 4 направлений из перечня направлений.
Я хочу сделать это сам, но на самом деле не могу понять, как должна работать логика атаки! Может ли кто-нибудь дать мне несколько намеков, чтобы указать мне в правильном направлении? Я не знаю, что они хотят, чтобы я сделал новый метод Move() overloaded for. Предполагается ли игрок прыгать до того места, где он атакует? Или у него есть другие функции? Благодарю!
for (int distance = 0; distance < radius; distance++) {
foreach (Enemy enemy in game.Enemies) {
if (Nearby(enemy.Location, target, distance)) {
enemy.Hit(damage, random);
return true;
}
Это действительно плохо. Процедура "для" избыточна - расстояние от врага может быть достигнуто. Место и цель, и навсегда потребовалось бы проверить каждого врага на каждом расстоянии. Плюс, если есть препятствия на пути. Я думаю, что "расстояние" в переопределенной функции Near() должно быть "направлением", которое отвечало бы на ваш вопрос. Я предлагаю:
foreach (Enemy enemy in game.Enemies) {
if (Nearby(enemy.Location, target, radius, direction)) {
enemy.Hit(damage, random);
return true;
}
Также функция "move()" вызывается внутри цикла "расстояние", и поэтому ее поведение непредсказуемо.