XNA Как сделать объект невидимым

Я делаю 2D-шутер в XNA. Я работал над скоростью стрельбы игрока (каждый раз, как часто игрок может стрелять другой пулей) и сделал так, чтобы игрок мог стрелять снова только после того, как предыдущая пуля прошла определенное расстояние, например так:

if (this.bulletList[0].BULLETS[(this.bulletList[0].BULLETS.Count) - 1].X >= Pos.X + attackSpeed)
                canShoot = true;

Где bulletList — это доступные снаряды, которые игрок может выстрелить, BULLETS — это список уже выпущенных пуль, а AttackSpeed ​​— это скорость, с которой должны быть выпущены пули, или, проще говоря, расстояние, которое пуля должна пройти, пока не будет выпущена другая пуля. .

Сейчас я работаю над Collisions. Мой метод заключался в том, чтобы избавиться от пули после того, как она попала в цель следующим образом:

for (int i = 0; i < player.BULLETLIST[0].BULLETS.Count; i++)
        {
            if (CollisionManager.PlayerBulletOnBot(player.BULLETLIST[0].BULLETS[i], bot))
                player.BULLETLIST[0].BULLETS.RemoveAt(i);
        }

Проблема в том, что если пуля была удалена при попадании в цель, я больше не могу спросить, прошла ли эта пуля заданное расстояние для выстрела другой пули. Чтобы решить эту проблему, я хотел бы, чтобы пуля становилась невидимой при попадании, а затем она удалялась в другой уже созданной функции.


person Villager    schedule 05.05.2014    source источник


Ответы (3)


Просто установите флаг Visible для экземпляра Bullet:

class Bullet {
    public bool Visible { get; set; }
}

Когда он попадает... сделайте его невидимым:

// ... hit
bulletInstace.Visible = false;

Затем проверьте, прежде чем рисовать его:

if (bulletInstance.Visible)
    drawBullet(bullet);

Если он не виден, ваш код рисования должен просто пропустить его.

person Simon Whitehead    schedule 05.05.2014
comment
Пуля должна быть нарисована только один раз. Как только он появится, я могу настроить его положение любым удобным для меня способом. Он не перерисовывается в другом месте, поэтому я не могу использовать этот флаг. Вот почему я думаю, что сделать объект прозрачным или невидимым должно работать. - person Villager; 05.05.2014
comment
Рисовали один раз? .. на кадр правильно? Этот флаг позволяет пропустить следующий кадр. - person Simon Whitehead; 05.05.2014
comment
Насколько мне известно, в XNA нельзя нарисовать что-то один раз и просто перемещать это каждый кадр. Это просто не то, как работает фреймворк. Саймон прав, вам понадобится свойство Visible, которое вы измените, и нарисуйте маркер только на основе этого. - person Falgantil; 05.05.2014
comment
@Villager Метод Draw вызывается один раз за кадр. Если вы отметите этот флаг Visible до того, как маркеры будут нарисованы в методе Draw, тогда вы можете пропустить их в этом кадре (и в будущем). Эффективно делает их невидимыми, пока они не умрут. - person Simon Whitehead; 05.05.2014
comment
Я понимаю, что вы имеете в виду, я поищу эту часть в коде. - person Villager; 05.05.2014
comment
Ну, я нашел именно то, что вы предложили, но проблема в том, что список под названием BULLETS - это List‹Vector2›, а не список снарядов. - person Villager; 05.05.2014
comment
Это не проблема... вы должны обернуть векторы в экземпляр Bullet. Таким образом, вы сможете добавить к ним еще больше свойств в будущем. - person Simon Whitehead; 05.05.2014

Когда вы рисуете объект с помощью spriteBatch.Draw(...), вам нужно выбрать цвет самого спрайта.

Все мы знаем, что цвет представляет собой смесь значений «красного, зеленого и синего» (или rgb). Немногие знают, что, по крайней мере, в XNA есть четвертое значение, называемое альфа.

Альфа-значение указывает на прозрачность вашего объекта, а это означает, что если вы используете его, как код ниже, ваш объект будет наполовину невидимым (или наполовину видимым).

spriteBatch.Draw(..., Color.White * 0,5f,...);

С этим можно поиграть :)

Узнайте больше здесь, на старых форумах XNA.

person Nahuel Ianni    schedule 05.05.2014

Вам нужно свойство скорострельности (rof), которое вы увеличиваете до некоторого значения maxRof, когда удерживаете кнопку. и когда rof равен maxrof, вы добавляете пулю в список пуль (и сбрасываете rof на 0).

Не делайте его невидимым, удалите его из списка. Каждый экземпляр пули должен иметь свойство «Активен» со значением «истина» в огне. (когда вы стреляете пулей, добавляете ее в список) И когда произошло столкновение, установите для этого свойства значение false. псевдокод в качестве примера:

ОБНОВИТЬ

for each bullet in bullets
  -- update bullet position
  -- check collision if happened if yes then set Active to false
end for

bullets.removeall(function(c) NOT(c.active));

РИСОВАТЬ

for each bullet in bullets.findall(function(c) c.active)
  -- draw your bullets
end for
person Davor Mlinaric    schedule 05.05.2014
comment
Почему бы ему не сделать пули невидимыми. Это легче. Но, конечно, это тоже можно использовать. - person MCollard; 07.05.2014
comment
невидимый означает, что пуля скрыта, но функция обновления все еще вычисляет положение и другие параметры. это его пример, ему это нужно для расчета положения и расстояния ... но если он использует ROF, ему это не нужно, поэтому он может просто избавиться от этой пули после столкновения. - person Davor Mlinaric; 07.05.2014
comment
он рассчитывает только до тех пор, пока не достигнет определенного расстояния (в коде Villager). Затем он может совершить столкновение && (player.BULLETLIST[0].BULLETS[i].Visible == false) Но это всего лишь вариант, здорово видеть ответы других людей на другой взгляд на предмет. - person MCollard; 07.05.2014