private void Enemy_Collided(object sender, BlockCollisionEventArgs e) { Vector2 vec = new Vector2(VelX + ((this.X + Size / 2) / Map.EntityPixelPerCase) * Map.EntityPixelPerCase + Map.EntityPixelPerCase / 2 - (this.X + this.Size / 2), VelY + ((this.Y + Size / 2) / Map.EntityPixelPerCase) * Map.EntityPixelPerCase + Map.EntityPixelPerCase / 2 - (this.Y + this.Size / 2)); vec.Normalize(); //vec *= _SpeedFactor; this.VelX = vec.X; this.VelY = vec.Y; //this.X = ((this.X + this.Size / 2) / Map.EntityPixelPerCase) * Map.EntityPixelPerCase + Map.EntityPixelPerCase / 2; //this.Y = ((this.Y + this.Size / 2) / Map.EntityPixelPerCase) * Map.EntityPixelPerCase + Map.EntityPixelPerCase / 2; }
public void FireCollided(object sender, BlockCollisionEventArgs e) { Collided?.Invoke(sender, e); }
/// <summary> /// Calcule le mouvement de l'entité /// </summary> /// <param name="DeltaTime"></param> public override void Tick(long deltaTime) { Enemy ent = this as Enemy; if (ent != null) { if (ent._path == null) { int i = 0; } } float dt = deltaTime / 2; //VelY += 0.2f; int vx = (int)(VelX * dt); int vy = (int)(VelY * dt); List <CollisionInfo> res = CheckCollision(X, Y, vx, vy); CollisionSide rs = 0; foreach (CollisionInfo c in res) { rs |= c.Side; if (c.Case != null && c.Case.IsBreaking) { FireDied(this, new CancellableEventArgs(false)); } } bool Or = false; if (Math.Abs(VelX) < 0.01f) { VelX = 0; Or = true; } if (Math.Abs(VelY) < 0.01f) { VelY = 0; Or = true; } if (Or) { FireMoved(this, new CancellableEventArgs(false)); } if (vx == 0 && vy == 0) { return; } if (rs != CollisionSide.None) { BlockCollisionEventArgs e = new BlockCollisionEventArgs(X / Map.EntityPixelPerCase, Y / Map.EntityPixelPerCase, res, false); FireCollided(this, e); if ((rs & (CollisionSide.Left | CollisionSide.Right)) > 0) { //_velx = 0; vx = 0; } if ((rs & (CollisionSide.Up | CollisionSide.Down)) > 0) { //_vely = 0; vy = 0; } } if (X / Map.EntityPixelPerCase != (X + vx) / Map.EntityPixelPerCase) // Side only { FireChangedCase(this, new MultiCaseEventArgs(Map[X / Map.EntityPixelPerCase, Y / Map.EntityPixelPerCase], new AbsCase[] { Map[(X + vx) / Map.EntityPixelPerCase, (Y + vy) / Map.EntityPixelPerCase] }, false)); if (Y / Map.EntityPixelPerCase != (Y + vy) / Map.EntityPixelPerCase) // Both side and up/down { FireChangedCase(this, new MultiCaseEventArgs(Map[X / Map.EntityPixelPerCase, Y / Map.EntityPixelPerCase], new AbsCase[] { Map[(X + vx) / Map.EntityPixelPerCase, (Y + vy) / Map.EntityPixelPerCase], Map[(X + vx) / Map.EntityPixelPerCase, Y / Map.EntityPixelPerCase], Map[X / Map.EntityPixelPerCase, (Y + vy) / Map.EntityPixelPerCase] }, false)); } } else if (Y / Map.EntityPixelPerCase != (Y + vy) / Map.EntityPixelPerCase) // Up/Down only { FireChangedCase(this, new MultiCaseEventArgs(Map[X / Map.EntityPixelPerCase, Y / Map.EntityPixelPerCase], new AbsCase[] { Map[(X + vx) / Map.EntityPixelPerCase, (Y + vy) / Map.EntityPixelPerCase] }, false)); } X += vx; Y += vy; FireMoved(this, new CancellableEventArgs(false)); }