private void HaveAttacked(SolidBody attacked, Vec2 position, float angle, IBullet bullet) { PointF locationObject = attacked.Shape.Location; ulong idParent = (Parent as Weapon).Owner.ID; float newDistance = VectorMethod.DefineDistance(position, new Vec2(locationObject.X, locationObject.Y)); Parent.Model.AddOutgoingMessage(new MakedShot(idParent, angle, newDistance)); if (attacked == null) { return; } var damageMsg = new GotDamage(idParent, bullet.Damage); attacked.Parent.Update(damageMsg); //определяем убили ли мы противника Healthy healthyAttacked = attacked.Parent.Components.GetComponent <Healthy>(); if (healthyAttacked == null) { return; } //если убили засчитываем фраг if (healthyAttacked.HP < bullet.Damage) { (Parent as Weapon).Owner.Update(new MakedKill(idParent)); } }
public static GameObject CreateGrenade(IModelForComponents model, PointF location, Vec2 startVelocity, IBullet grenadeBullet) { var gameObject = new GameObject(model, TypesGameObject.Grenade, TypesBehaveObjects.Active); ShapeDef circleShape = CreateBaseCircleDef(setupsWeapon, SizeGreanade); circleShape.Filter.CategoryBits = (ushort)CollideCategory.Grenade; circleShape.Filter.MaskBits = (ushort)CollideCategory.Box | (ushort)CollideCategory.Stone; ShapeDef sensorDef = CreateBaseCircleDef(setupsWeapon, new SizeF(RadiusExplosionGrenade, RadiusExplosionGrenade)); sensorDef.IsSensor = true; sensorDef.Filter.CategoryBits = (ushort)CollideCategory.Grenade; sensorDef.Filter.MaskBits = (ushort)CollideCategory.Player; var body = new SolidBody(gameObject, new RectangleF(location, SizeGreanade), new ShapeDef[] { circleShape, sensorDef }, setupsWeapon.linearDamping, startVelocity); gameObject.Components.Add(body); var explosion = new Explosion(gameObject, grenadeBullet); gameObject.Components.Add(explosion); model.AddOrUpdateGameObject(gameObject); return(gameObject); }
public static void CreateNewBodyForWeapon(Weapon weapon, Vec2 startVelocity, PointF location) { SolidBody body = null; switch (weapon.TypeWeapon) { case TypesWeapon.AssaultRifle: body = CreateBodyWeapon(weapon, location, setupsWeapon, SizeAssaulRiffle); break; case TypesWeapon.GrenadeCollection: body = CreateBodyWeapon(weapon, location, setupsWeapon, SizeGrenadeCollection); break; case TypesWeapon.Gun: body = CreateBodyWeapon(weapon, location, setupsWeapon, SizeGun); break; case TypesWeapon.ShotGun: body = CreateBodyWeapon(weapon, location, setupsWeapon, SizeShotGun); break; default: throw new Exception("Ошибка создания тела для оружия"); } body.Body.SetLinearVelocity(startVelocity); weapon.Components.Add(body); weapon.Model.AddOrUpdateGameObject(weapon); }
/// <summary> /// Делаем шаг игровой карты /// </summary> /// <param name="passedTime">в миллесекундах</param> public void MakeStep(int passedTime) { Field.Step((float)passedTime / 1000, 8, 3); IMessage msg = new TimeQuantPassed(passedTime); for (Body list = Field.GetBodyList(); list != null; list = list.GetNext()) { if (list.GetUserData() != null) { SolidBody solidBody = (SolidBody)list.GetUserData(); if (!solidBody.Parent.Destroyed) { if (solidBody.Parent.TypeBehave == TypesBehaveObjects.Active) { //запускаем обработку всех событий на этом объекте solidBody.Parent.Update(msg); } } //если объект уничтожен удаляем его else { RemoveGameObject(solidBody.Parent); if (solidBody.Parent is Gamer) { RemovePlayer(solidBody.Parent as Gamer); } } } } //обновляем игровую зону DeathZone.Update(msg); }
private void Handler_MakeShot(IMessage msg) { SolidBody BodyHolder = (Parent as Weapon).Owner?.Components?.GetComponent <SolidBody>(); if (BodyHolder == null) { return; } //получаем гранату IBullet grenadeBullet = magazin.GetBullet(); if (grenadeBullet == null) { return; } //получаем позицию игрока Vec2 position = (Vec2)BodyHolder.Body?.GetPosition(); //определяем импульс float dX = msg.Location.X - position.X; float dY = (msg.Location.Y - position.Y); //нельзя бросить дальше дальности броска if (System.Math.Sqrt(dX * dX + dY * dY) > strength) { return; } Vec2 impulse = new Vec2(dX, dY); //создаем объект гранаты var grenade = BuilderGameObject.CreateGrenade(Parent.Model, (Parent as Weapon).Owner.Components.GetComponent <SolidBody>().Shape.Location, impulse, grenadeBullet); }
public override void Setup() { this.body = Parent.Components?.GetComponent <SolidBody>(); if (body == null) { Log.AddNewRecord("Ошибка создания компонента Movement", "Не получена сслыка на компонент SoldiBody"); throw new Exception("Ошибка создания компонента Movement"); } Parent.Received_GoTo += Handler_GoTo; }
public override void Setup() { this.bodyGrenade = Parent.Components?.GetComponent <SolidBody>(); if (bodyGrenade == null) { Log.AddNewRecord("Ошибка создания компонента Explosion", "Не получена сслыка на компонент SolidBody"); throw new Exception("Ошибка создания компонента Explosion"); } Parent.Received_TimeQuantPassed += Handler_TimeQuantPassed; }
public override void Remove(ContactPoint point) { base.Remove(point); if (point.Shape1.GetBody().GetUserData() is SolidBody) { SolidBody bodyA = (SolidBody)point.Shape1.GetBody().GetUserData(); if (point.Shape2.GetBody().GetUserData() is SolidBody) { SolidBody bodyB = (SolidBody)point.Shape2.GetBody().GetUserData(); bodyA.CoveredObjects.Remove(bodyB); bodyB.CoveredObjects.Remove(bodyA); } } }
public static GameObject CreateStone(IModelForComponents model, PointF location) { var gameObject = new GameObject(model, TypesGameObject.Stone, TypesBehaveObjects.Passive); ShapeDef CircleDef = CreateBaseCircleDef(setupsStoneAndTree, SizeStone); CircleDef.Filter.CategoryBits = (ushort)CollideCategory.Stone; CircleDef.Filter.MaskBits = (ushort)CollideCategory.Player | (ushort)CollideCategory.Grenade | (ushort)CollideCategory.Loot; var body = new SolidBody(gameObject, new RectangleF(location, SizeStone), new ShapeDef[] { CircleDef }); gameObject.Components.Add(body); model.AddOrUpdateGameObject(gameObject); return(gameObject); }
public static GameObject CreateBox(IModelForComponents model, PointF location) { var gameObject = new GameObject(model, TypesGameObject.Box, TypesBehaveObjects.Passive); var shapeBox = CreateBaseRectangleDef(setupsStillObject, SizeBox); shapeBox.Filter.CategoryBits = (ushort)CollideCategory.Box; shapeBox.Filter.MaskBits = (ushort)CollideCategory.Player | (ushort)CollideCategory.Grenade | (ushort)CollideCategory.Loot; var body = new SolidBody(gameObject, new RectangleF(location, SizeBox), new ShapeDef[] { shapeBox }); gameObject.Components.Add(body); model.AddOrUpdateGameObject(gameObject); return(gameObject); }
private static SolidBody CreateBodyWeapon(Weapon weapon, PointF location, PhysicsSetups physicsSetupsWeapon, SizeF sizeWeapon) { ShapeDef circleShape = CreateBaseCircleDef(physicsSetupsWeapon, sizeWeapon); circleShape.Filter.CategoryBits = (ushort)CollideCategory.Loot; circleShape.Filter.MaskBits = (ushort)CollideCategory.Box | (ushort)CollideCategory.Stone; ShapeDef sensorDef = CreateBaseCircleDef(physicsSetupsWeapon, sizeWeapon); sensorDef.IsSensor = true; sensorDef.Filter.CategoryBits = (ushort)CollideCategory.Loot; sensorDef.Filter.MaskBits = (ushort)CollideCategory.Player; var body = new SolidBody(weapon, new RectangleF(location, sizeWeapon), new ShapeDef[] { circleShape, sensorDef }, physicsSetupsWeapon.linearDamping, Vec2.Zero); weapon.Components.Add(body); return(body); }
public override void Add(ContactPoint point) { base.Add(point); if (point.Shape1.GetBody().GetUserData() is SolidBody) { SolidBody bodyA = (SolidBody)point.Shape1.GetBody().GetUserData(); if (point.Shape2.GetBody().GetUserData() is SolidBody) { SolidBody bodyB = (SolidBody)point.Shape2.GetBody().GetUserData(); if (bodyA.CoveredObjects.IndexOf(bodyB) == -1) { bodyA.CoveredObjects.Add(bodyB); } if (bodyB.CoveredObjects.IndexOf(bodyA) == -1) { bodyB.CoveredObjects.Add(bodyA); } } } }
private void Handler_MakeShot(IMessage msg) { try { SolidBody BodyHolder = (Parent as Weapon).Owner?.Components?.GetComponent <SolidBody>(); if (BodyHolder == null) { Log.AddNewRecord("Ошибка получения держателя оружия"); return; } Vec2 position = (Vec2)BodyHolder.Body.GetPosition(); //получаем патрон IBullet bullet = magazin.GetBullet(); if (bullet == null) { return; } //определяем угол float angle = VectorMethod.DefineAngle(position, new Vec2(msg.Location.X, msg.Location.Y)); var rayOfShot = CreateRayForShot(position, angle, bullet.Distance); var attackedObject = DefineDamagedSolidBody(rayOfShot, (Parent as Weapon).Owner.ID); if (attackedObject == null) { NotAttacked(angle, bullet.Distance); } else { HaveAttacked(attackedObject, position, angle, bullet); } } catch (Exception e) { Log.AddNewRecord(e.ToString()); } }
public static Gamer CreateGamer(IModelForComponents model, PointF location) { var gameObject = new Gamer(model, TypesGameObject.Player, TypesBehaveObjects.Active); ShapeDef CircleDef = CreateBaseCircleDef(setupsGamer, SizeGamer); CircleDef.Filter.CategoryBits = (ushort)CollideCategory.Player; CircleDef.Filter.MaskBits = (ushort)CollideCategory.Box | (ushort)CollideCategory.Stone | (ushort)CollideCategory.Grenade; var body = new SolidBody(gameObject, new RectangleF(location, SizeGamer), new ShapeDef[] { CircleDef }); gameObject.Components.Add(body); var movement = new Movement(gameObject, SpeedGamer); gameObject.Components.Add(movement); var collector = new Collector(gameObject); gameObject.Components.Add(collector); var currentWeapon = new CurrentWeapon(gameObject); gameObject.Components.Add(currentWeapon); var healthy = new Healthy(gameObject); gameObject.Components.Add(healthy); var statistics = new Statistics(gameObject); gameObject.Components.Add(statistics); model.AddOrUpdateGameObject(gameObject); model.Players.Add(gameObject); return(gameObject); }
public override void Dispose() { body = null; Parent.Received_GoTo -= Handler_GoTo; }
//только для тестов public Collector(IGameObject parent, Weapon[] weapons) : base(parent) { modifiers = new Modifier[CountOfModifier]; this.weapons = weapons; this.body = new SolidBody(parent); }
public override void Setup() { base.Setup(); body = Components.GetComponent <SolidBody>(); Received_PlayerTurn += Handler_Received_PlayerTurn; }