public BCharacter(Vector2 position, BTexture spriteSheet, RectangleF spriteBox, BMovementType movementType) : base(position, spriteSheet, spriteBox) { this.movementType = movementType; positionGoto = position; velocity = Vector2.Zero; currentState = BEntityState.Idle; maxMovementSpeed = 20.0f; maxHealth = 200; currentHealth = maxHealth; path = null; pathNode = null; }
public BCharacter(Vector2 position, BTexture spriteSheet) : base(position, spriteSheet) { movementType = BMovementType.MoveToPosition; positionGoto = position; velocity = Vector2.Zero; currentState = BEntityState.Idle; maxMovementSpeed = 20.0f; maxHealth = 200; currentHealth = maxHealth; path = null; pathNode = null; }
public void HandleMovement(double delta) { if (this.movementType == BMovementType.MoveToPosition) { if (positionGoto.Y - this.position.Y >= 0.1f) { velocity.Y = Math.Min(maxMovementSpeed, (positionGoto.Y - this.position.Y)); } else if (this.position.Y - positionGoto.Y >= 0.1f) { velocity.Y = Math.Max(-maxMovementSpeed, -(this.position.Y - positionGoto.Y)); } else { velocity.Y = 0.0f; } if (positionGoto.X - this.position.X >= 0.1f) { velocity.X = Math.Min(maxMovementSpeed, (positionGoto.X - this.position.X)); } else if (this.position.X - positionGoto.X >= 0.1f) { velocity.X = Math.Max(-maxMovementSpeed, -(this.position.X - positionGoto.X)); } else { velocity.X = 0.0f; } } else if (this.movementType == BMovementType.FollowPath) { if (path != null) { if (pathNode == null && path.DestNode.Parent != null) { pathNode = path.DestNode.Parent; } if (pathNode.Parent != null) { Vector2 nodeVec = new Vector2((pathNode.X * path.TileSizeX) + (path.TileSizeX / 2), (pathNode.Y * path.TileSizeY) + (path.TileSizeY / 2)); if (Vector2.Distance(nodeVec, position) > 10.0f) { Vector2 dir = new Vector2(nodeVec.X, nodeVec.Y) - position; MoveInDirection(dir); } else { pathNode = pathNode.Parent; path.DestNode = pathNode; } } else { velocity = Vector2.Zero; path.DestNode = null; path.StartNode = null; } } } if (velocity == Vector2.Zero) { currentState = BEntityState.Idle; } if (velocity.Y > 0f) { if (velocity.X > 0f) { if (velocity.X > velocity.Y) { currentState = BEntityState.MovingR; } else if (velocity.X < velocity.Y) { currentState = BEntityState.MovingD; } } if (velocity.X < 0f) { if (-velocity.X > velocity.Y) { currentState = BEntityState.MovingL; } else if (-velocity.X < velocity.Y) { currentState = BEntityState.MovingD; } } } else if (velocity.Y < 0f) { if (velocity.X > 0f) { if (velocity.X > -velocity.Y) { currentState = BEntityState.MovingR; } else if (velocity.X < -velocity.Y) { currentState = BEntityState.MovingU; } } if (velocity.X < 0f) { if (-velocity.X > -velocity.Y) { currentState = BEntityState.MovingL; } else if (-velocity.X < -velocity.Y) { currentState = BEntityState.MovingU; } } } else { if (velocity.X > 0f) { currentState = BEntityState.MovingR; } if (velocity.X < 0f) { currentState = BEntityState.MovingL; } } velocity = new Vector2(Maths.Clamp(velocity.X, -MaxMovementSpeed, MaxMovementSpeed), Maths.Clamp(velocity.Y, -MaxMovementSpeed, MaxMovementSpeed)); this.position += (velocity * (float)delta); }