Cómo apuntar a una entidad que se está moviendo

Quiero que mi flecha persiga al súbdito que acabo de pulsar. Tengo una Minion Class y una Arrow Class. Estos son los constructores:

/// <summary> /// Constructs a minion /// </summary> public Minion(Texture2D sprite, int x, int y, int windowWidth, int windowHeight, bool isFriendly, int minionHealth) /// <summary> /// Constructor of the bullet from champion to minion /// </summary> public Arrow(Texture2D sprite, Vector2 sourceEntity, Vector2 targetEntity, float arrowSpeed, int arrowAttackSpeed, int damageDone, bool isArrowActive) 

En Game1 tengo la estructura estándar de hacer clic y verifico si el clic está en los minions. Pero compruebo esto con

  foreach (Minion minion in enemyMinions) 

Entonces, quiero marcar de alguna manera al súbdito en el que hice clic y luego enviar la flecha directamente a su location en movimiento.

¿Como hacer eso?

Actualizar:

  //checks if rightmouse button was clicked to activate the arrow if (mouse.RightButton == ButtonState.Released && previousButtonState == ButtonState.Pressed) { //checks if the right mouse click was on a minion and the minion is in champion's range for (int i = 0; i < enemyMinions.Count; i++) { if (enemyMinions[i].CollisionRectangle.Contains(mouse.X, mouse.Y) && (Math.Abs(mouse.X - enemyMinions[i].X) < vayne.ChampionRange) || Math.Abs(mouse.Y - enemyMinions[i].Y) < vayne.ChampionRange) { //mark the minion that the click was made on theCurrentTarget = enemyMinions[i]; //sets the arrow.targetEntity to that particular minion arrow.TargetX = theCurrentTarget.X; arrow.TargetY = theCurrentTarget.Y; arrow.IsArrowActive = true; } } } previousButtonState = mouse.RightButton; 

Por lo que he entendido desde tu publicación original y las demás aclaraciones, creo que quieres crear una flecha en la position de sourceEntity y hacer que se mueva con una velocidad de flecha constante hacia la position de targetEntity hasta que llegue a ella, position que puede haber cambiado desde la creación de la flecha. Corrígeme si estoy equivocado.

Veo que estás usando un flotador para la velocidad de tu flecha, en lugar de un vector. Puede usar un vector 2D igual a la diferencia entre la position del objective y la position actual de la flecha, calcular su magnitud (o longitud) y luego agregar a Arrow.currentPosition una fracción de v vector igual a arrowSpeed ​​/ length:

Vector2 v = targetEntity.currentPosition – Arrow.currentPosition;

longitud flotante = sqrt (vx * vx + vy * vy);

Arrow.currentPosition + = (v * (arrowSpeed ​​/ length));

Al actualizar la position actual de la Flecha, es posible que desee tener la entidad de destino pasada por reference, por lo que tendrá acceso a la position actual de targetEntity. Si no lo pasa por reference, la position de targetEntity permanecerá siempre igual y su flecha se detendrá en la position original de targetEntity.

La flecha finalmente terminará la persecución y golpeará targetEntity.

EDITAR:

Para el código que está utilizando, Arrow.TargetX y Arrow.TargetY deben ser pointers, en lugar de flotantes. Entonces, hazlo así:

 //mark the minion that the click was made on theCurrentTarget = &enemyMinions[i]; //sets the arrow.targetEntity to that particular minion arrow.TargetX = &theCurrentTarget->X; arrow.TargetY = &theCurrentTarget->Y; 

Tenga en count que theCurrentTarget también necesita ser un puntero.

Deberá realizar algunos cambios en la forma de crear una flecha, utilizando el constructor:

Supongamos que tiene 2 objects de la class Minion: Entity1 y Entity2. Entity1 es la fuente de la flecha y siempre permanece en el mismo lugar. Entity2 es el objective de la flecha y se está moviendo.

 public Arrow(Texture2D sprite, Vector2 sourceEntity, Vector2 targetEntity, float arrowSpeed, int arrowAttackSpeed, int damageDone, bool isArrowActive) 

Digamos que creas un object Arrow, como este: Arrow chasingArrow (some_sprite, Entity1.position, Entity2.position, … (el rest de los arguments son irrelevantes))

Cuando llamas a este constructor, el object de la class Arrow que creas saveá el valor del vector targetEntity tal como está ahora y ese valor (que está dentro del object Arrow) nunca cambiará, incluso si el valor del vector dentro del El object Entity2 cambiará. Debes vincular el vector en Entity2 con el vector targetEntity en chasingArrow. Lo haces al no copyr el valor, sino al copyr el puntero. De esta forma, el puntero targetEntity en chasingArrow siempre apuntará a la position actual de Entity2.

Cambia el constructor así:

 public Arrow(Texture2D sprite, Vector2 sourceEntity, Vector2* targetEntity, float arrowSpeed, int arrowAttackSpeed, int damageDone, bool isArrowActive) 

Observe la única modificación: Vector2 * targetEntity . Ahora tomará un puntero a un vector como un parámetro en lugar de un vector.

Y cuando creas un object Arrow, hazlo así:

 Arrow chasingArrow( some_sprite, Entity1.position, &Entity2.position, ...(the rest of the arguments are irrelevant) ) 

También puede pasar Entity1.position por reference, pero funciona tal como está ahora, ya que sourceEntity solo importa en el momento en que se crea la flecha.

Si usted tiene cualquier otra pregunta solo pregunte.

Suponiendo que la entidad objective se está moviendo (ya que usó la palabra 'persecución'), tendría que pasar la location de la entidad objective a un método de actualización para su flecha, y ajustar la velocidad de la flecha en function del vector entre su location y la del objective.

Es difícil ser más específico teniendo en count que solo conocemos sus constructores.