} // does not rotate (i.e. does not respect FacingDirectionInMillidegrees) public PlayerBullet(long xMillis, long yMillis, PlayerBulletType bulletType, DTImmutableList <ObjectBox> collisionBoxes) { this.xMillis = xMillis; this.yMillis = yMillis; this.bulletType = bulletType; this._collisionBoxes = collisionBoxes; }
public static bool HasCollided( long object1XMillis, long object1YMillis, DTImmutableList <ObjectBox> object1Boxes, /* nullable */ long object2XMillis, long object2YMillis, DTImmutableList <ObjectBox> object2Boxes /* nullable */) { if (object1Boxes == null || object2Boxes == null) { return(false); } if (object1Boxes.Count == 0 || object2Boxes.Count == 0) { return(false); } for (int i = 0; i < object1Boxes.Count; i++) { ObjectBox obj1Box = object1Boxes[i]; for (int j = 0; j < object2Boxes.Count; j++) { ObjectBox obj2Box = object2Boxes[j]; long obj1Left = object1XMillis + obj1Box.LowerXMillis; long obj1Right = object1XMillis + obj1Box.UpperXMillis; long obj2Left = object2XMillis + obj2Box.LowerXMillis; long obj2Right = object2XMillis + obj2Box.UpperXMillis; bool noXCollision = obj1Right < obj2Left || obj2Right < obj1Left; if (!noXCollision) { long obj1Bottom = object1YMillis + obj1Box.LowerYMillis; long obj1Top = object1YMillis + obj1Box.UpperYMillis; long obj2Bottom = object2YMillis + obj2Box.LowerYMillis; long obj2Top = object2YMillis + obj2Box.UpperYMillis; bool noYCollision = obj1Top < obj2Bottom || obj2Top < obj1Bottom; if (!noYCollision) { return(true); } } } } return(false); }
// Returns whether the player collided with any enemy objects public static bool HandleCollisionBetweenPlayerAndEnemyObjects( List <Player.PlayerSubFramePosition> playerSubFramePositions, bool isPlayerDead, bool isPlayerInvulnerable, List <EnemyObject> enemyObjects) { if (isPlayerDead) { return(false); } if (isPlayerInvulnerable) { return(false); } List <ObjectBox> playerCollisionBoxesList = new List <ObjectBox>(); playerCollisionBoxesList.Add(new ObjectBox(lowerXMillis: -1 * 1000, upperXMillis: 1 * 1000, lowerYMillis: -1 * 1000, upperYMillis: 1 * 1000)); DTImmutableList <ObjectBox> playerCollisionBoxes = new DTImmutableList <ObjectBox>(playerCollisionBoxesList); foreach (EnemyObject enemyObj in enemyObjects) { if (enemyObj.IsDestroyed) { continue; } foreach (Player.PlayerSubFramePosition playerSubFramePosition in playerSubFramePositions) { bool hasCollided = HasCollided( object1XMillis: playerSubFramePosition.XMillis, object1YMillis: playerSubFramePosition.YMillis, object1Boxes: playerCollisionBoxes, object2XMillis: enemyObj.XMillis, object2YMillis: enemyObj.YMillis, object2Boxes: enemyObj.CollisionBoxes); if (hasCollided) { enemyObj.MilliHP = enemyObj.MilliHP - EnemyObject.DAMAGE_TAKEN_IN_MILLIHP_WHEN_COLLIDE_WITH_PLAYER; return(true); } } } return(false); }
public EnemyObject( EnemyObjectTemplate template, long initialXMillis, long initialYMillis, long playerXMillis, long playerYMillis, long elapsedMillisecondsPerIteration, bool isPlayerDestroyed, EnemyObject parent /* nullable */, Dictionary <string, IMathExpression> initialNumericVariables, /* MathExpression is with respect to the parent */ /* nullable */ Dictionary <string, BooleanExpression> initialBooleanVariables /* BooleanExpression is with respect to the parent */ /* nullable */, IDTDeterministicRandom rng) { this._objectType = template.ObjectType; this._damageBoxes = template.DamageBoxes; this._collisionBoxes = template.CollisionBoxes; this.SpriteName = template.SpriteName; this.Action = template.Action; if (template.InitialMilliHP != null) { EnemyObjectExpressionInfo enemyObjectExpressionInfo; if (parent != null) { enemyObjectExpressionInfo = parent.GetEnemyObjectExpressionInfo(); } else { enemyObjectExpressionInfo = null; } this.MilliHP = template.InitialMilliHP.Evaluate( enemyObjectExpressionInfo: enemyObjectExpressionInfo, playerXMillis: playerXMillis, playerYMillis: playerYMillis, elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration, rng: rng); } else { this.MilliHP = null; } this.XMillis = initialXMillis; this.YMillis = initialYMillis; this.SpeedInMillipixelsPerMillisecond = 0; this.MovementDirectionInMillidegrees = 180 * 1000; this.FacingDirectionInMillidegrees = 180 * 1000; this.IsDestroyed = false; this._parentObject = parent; this.NumericVariables = new Dictionary <string, long>(); this.BooleanVariables = new Dictionary <string, bool>(); if (initialNumericVariables != null) { foreach (var keyValuePair in initialNumericVariables) { string variableName = keyValuePair.Key; EnemyObjectExpressionInfo enemyObjectExpressionInfo; if (parent != null) { enemyObjectExpressionInfo = parent.GetEnemyObjectExpressionInfo(); } else { enemyObjectExpressionInfo = null; } this.NumericVariables.Add(variableName, keyValuePair.Value.Evaluate( enemyObjectExpressionInfo: enemyObjectExpressionInfo, playerXMillis: playerXMillis, playerYMillis: playerYMillis, elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration, rng: rng)); } } if (initialBooleanVariables != null) { foreach (var keyValuePair in initialBooleanVariables) { string variableName = keyValuePair.Key; EnemyObjectExpressionInfo enemyObjectExpressionInfo; if (parent != null) { enemyObjectExpressionInfo = parent.GetEnemyObjectExpressionInfo(); } else { enemyObjectExpressionInfo = null; } bool?isParentDestroyed; if (parent != null) { isParentDestroyed = parent.IsDestroyed; } else { isParentDestroyed = null; } this.BooleanVariables.Add(variableName, keyValuePair.Value.Evaluate( enemyObjectExpressionInfo: enemyObjectExpressionInfo, isParentDestroyed: isParentDestroyed, isPlayerDestroyed: isPlayerDestroyed, playerXMillis: playerXMillis, playerYMillis: playerYMillis, elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration, rng: rng)); } } }