protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { if (!(target is MarioCharacter mario)) { return; } if (!mario.Active) { return; } if (top) { ChangeLives(); } eventInfo = EventArgs.Empty; ScorePoints(Const.SCORE_FLAG_MAX * height / maxHeight); World.Add(new PopingUpPoints(World, Boundary.Location, Const.SCORE_FLAG_MAX * height / maxHeight)); flag.PullDown(); mario.FlagPole(); HandlerTimeScore?.Invoke(this, eventInfo); }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { switch (target) { case Mario mario: OnCollisionMario(mario, mode, corner); break; case Brick brick when brick.State is Hidden: break; case Question question when question.State is Blocks.QuestionStates.Hidden: break; case IGameObject _ when target is Brick || target is Question || target is Floor || target is Pipeline || target is Stair: if (mode == CollisionMode.Left) { Bounce(mode, new Vector2(), 1); ChangeFacing(FacingMode.right); } else if (mode == CollisionMode.Right) { Bounce(mode, new Vector2(), 1); ChangeFacing(FacingMode.left); } else if (mode == CollisionMode.Bottom) { Bounce(mode, new Vector2()); } break; case FireBall _: Defeat(); break; case Koopa koopa: if (koopa.State is MovingShell || koopa.State is NewlyMovingShell) { Defeat(); } break; case Beetle beetle: if (beetle.State is BeetleStates.MovingShell || beetle.State is BeetleStates.NewlyMovingShell) { Defeat(); } break; } }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { switch (target.GetType().Name) { case "MarioCharacter": Mario mario = (Mario)target; if (mario.ProtectionState is Starred) { Defeat(); } break; case "Brick": if (((Brick)target).State is Hidden) { break; } goto case "Stair"; case "Question": if (((Question)target).State is Blocks.QuestionStates.Hidden) { break; } goto case "Stair"; case "Floor": onFloor = true; break; case "Pipeline": case "Stair": if (mode == CollisionMode.Left) { Bounce(mode, new Vector2(), 1); ChangeFacing(FacingMode.right); } else if (mode == CollisionMode.Right) { Bounce(mode, new Vector2(), 1); ChangeFacing(FacingMode.left); } else if (mode == CollisionMode.Bottom) { Bounce(mode, new Vector2()); } break; } }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { if (target is Mario && state is Normal) { Collect(); } }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { if (target is Mario && state is StarStates.Normal) { Collect(); } if (state is StarStates.Normal) { switch (target) { case Brick brick when brick.State is Hidden: break; case Question question when question.State is Blocks.QuestionStates.Hidden: break; case IGameObject _ when target is Brick || target is Question || target is Floor || target is Pipeline || target is Stair: if (mode == CollisionMode.Top) { Bounce(mode, new Vector2()); } if (mode == CollisionMode.Left || mode == CollisionMode.InnerLeft && corner == CornerMode.Center) { Bounce(mode, new Vector2(), 1); Facing = FacingMode.right; } else if (mode == CollisionMode.Right || mode == CollisionMode.InnerRight && corner == CornerMode.Center) { Bounce(mode, new Vector2(), 1); Facing = FacingMode.left; } if (mode == CollisionMode.Bottom || mode == CollisionMode.InnerBottom && corner == CornerMode.Center) { Bounce(mode, new Vector2()); SetVerticalVelocity(-Const.VELOCITY_STAR_V); } break; } } }
private void OnCollisionMario(Mario mario, CollisionMode mode, CornerMode corner) { if (mario.MovementState is Crouching && !(mario.ProtectionState is Starred) && (state is MovingShell || state is NewlyMovingShell)) { Wear(mario); } else if (mario.ProtectionState is Starred) { Defeat(); } else if ((state is BeetleStates.Normal || state is MovingShell) && !(mario.ProtectionState is Dead)) { if (mode == CollisionMode.Top) { JumpOn(); } else { mario.Downgrade(); } } else if (state is Defeated && !(mario.ProtectionState is Dead)) { switch (mode) { case CollisionMode.Left: ChangeFacing(FacingMode.right); Pushed(); break; case CollisionMode.Right: ChangeFacing(FacingMode.left); Pushed(); break; case CollisionMode.Top when corner == CornerMode.Left: ChangeFacing(FacingMode.right); Pushed(); break; case CollisionMode.Top when corner == CornerMode.Right: ChangeFacing(FacingMode.left); Pushed(); break; } } }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { if (target is FireBall) { Defeat(); } if (target is Koopa koopa) { if (koopa.State is MovingShell || koopa.State is NewlyMovingShell) { Defeat(); } } }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { if (target is Mario mario && mode is CollisionMode.Top) { if (mario.MovementState is Crouching && Database.IsEntrance(this)) { //TODO:Add warping state to model to allow sound controller play warping sound //SoundManager.Pipe.Play(); switch (Type) { case "LeftIn": if (mario.Boundary.Center.X > Boundary.Center.X) { // TODO // switchingPlayer = mario; } break; case "RightIn": if (mario.Boundary.Center.X < Boundary.Center.X) { // TODO // switchingPlayer = mario; } break; } // TODO: mario.freeze } } }
private void OnCollisionMario(Mario mario, CollisionMode mode, CornerMode corner) { if (mode == CollisionMode.Top && corner == CornerMode.Top && !(mario.ProtectionState is Dead) || mario.ProtectionState is Starred) { Defeat(); } else if ((state is KoopaStates.Normal || state is MovingShell) && !(mario.ProtectionState is Dead)) { if (mode == CollisionMode.Top) { JumpOn(); } else { mario.Downgrade(); } } else if (state is Defeated && !(mario.ProtectionState is Dead)) { switch (mode) { case CollisionMode.Left: ChangeFacing(FacingMode.right); Pushed(); break; case CollisionMode.Right: ChangeFacing(FacingMode.left); Pushed(); break; case CollisionMode.Top when corner == CornerMode.Left: ChangeFacing(FacingMode.right); Pushed(); break; case CollisionMode.Top when corner == CornerMode.Right: ChangeFacing(FacingMode.left); Pushed(); break; case CollisionMode.Bottom: break; case CollisionMode.InnerLeft: break; case CollisionMode.InnerRight: break; case CollisionMode.InnerTop: break; case CollisionMode.InnerBottom: break; default: throw new ArgumentOutOfRangeException(nameof(mode), mode, null); } } }
protected override void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive) { if (ProtectionState is Dead) { return; } switch (target.GetType().Name) { //TODO: add cases when collision mode is OutLeftTop/OutRightTop that Mario will be squeezed to side of the brick //NOTE: if collision mode is OutLeftTop/OutRightTop, be careful that if there are blocks surronding the target, no squeeze will happen!! case "Brick": case "Question": bool isHidden; bool isBumping; Brick brick = target as Brick; Question question = target as Question; if (brick != null) { if (brick.State is Destroyed) { break; } isHidden = brick.State is Hidden; isBumping = brick.State is Bumped; } else if (question != null) { isHidden = question.State is Blocks.QuestionStates.Hidden; isBumping = question.State is Blocks.QuestionStates.Bumped; } else { // never reach isHidden = false; isBumping = false; } if (mode == CollisionMode.Top) { bool bumped = Bounce(mode, new Vector2(), 1); if (isBumping) { //Move(new Point(0, 1)); } else if (bumped) { if (brick != null) { brick.Bump(this); } else if (question != null) { question.Bump(this); } } } else if (!isHidden) { goto case "Stair"; } break; case "Pipeline": if (MovementState is Crouching && Database.IsEntrance((Pipeline)target)) { string type = (target as Pipeline).Type; if (type == "LeftIn") { if (Boundary.Center.X > target.Boundary.Center.X) { Bounce(CollisionMode.Left, new Vector2()); Bounce(CollisionMode.Right, new Vector2()); } else { goto case "Floor"; } } else if (type == "RightIn") { if (Boundary.Center.X < target.Boundary.Center.X) { Bounce(CollisionMode.Left, new Vector2()); Bounce(CollisionMode.Right, new Vector2()); } else { goto case "Floor"; } } } else { goto case "Floor"; } break; case "CompressedBlock": case "Floor": case "Stair": case "Flag": Bounce(mode, new Vector2()); if (mode == CollisionMode.Bottom) { ApplyHorizontalFriction(Const.ACCEL_F_GROUND); MovementState.Land(); } break; case "Goomba": if (target is Goomba goomba && mode != CollisionMode.Bottom) { if (goomba.State is Enemies.GoombaStates.Normal && !(ProtectionState is Starred)) { Downgrade(); } } else if (!(protectionState is Starred)) { Bounce(mode, new Vector2(), 0.5f); } break;
protected abstract void OnCollision( IGameObject target, CollisionMode mode, CollisionMode modePassive, CornerMode corner, CornerMode cornerPassive);
private IEnumerable <Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode> > ScanCollideModes( Rectangle targetBoundary) { Rectangle rectA = Boundary; Rectangle rectB = targetBoundary; if (rectA.Top < rectB.Bottom && rectB.Top < rectA.Bottom) { CornerMode cornerY = rectA.Center.Y <= rectB.Top ? CornerMode.Top : rectA.Center.Y >= rectB.Bottom ? CornerMode.Bottom : CornerMode.Center; CornerMode cornerYPassive = rectB.Center.Y <= rectA.Top ? CornerMode.Top : rectB.Center.Y >= rectA.Bottom ? CornerMode.Bottom : CornerMode.Center; if (rectA.Left == rectB.Right) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.Left, CollisionMode.Right, cornerY, cornerYPassive)); } if (rectA.Right == rectB.Left) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.Right, CollisionMode.Left, cornerY, cornerYPassive)); } if (rectA.Left == rectB.Left) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.InnerLeft, CollisionMode.InnerLeft, cornerY, cornerYPassive)); } if (rectA.Right == rectB.Right) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.InnerRight, CollisionMode.InnerRight, cornerY, cornerYPassive)); } } if (rectA.Left < rectB.Right && rectB.Left < rectA.Right) { CornerMode cornerX = rectA.Center.X <= rectB.Left ? CornerMode.Left : rectA.Center.X >= rectB.Right ? CornerMode.Right : CornerMode.Center; CornerMode cornerXPassive = rectB.Center.X <= rectA.Left ? CornerMode.Left : rectB.Center.X >= rectA.Right ? CornerMode.Right : CornerMode.Center; if (rectA.Top == rectB.Bottom) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.Top, CollisionMode.Bottom, cornerX, cornerXPassive)); } if (rectA.Bottom == rectB.Top) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.Bottom, CollisionMode.Top, cornerX, cornerXPassive)); } if (rectA.Top == rectB.Top) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.InnerTop, CollisionMode.InnerTop, cornerX, cornerXPassive)); } if (rectA.Bottom == rectB.Bottom) { yield return(new Tuple <CollisionMode, CollisionMode, CornerMode, CornerMode>( CollisionMode.InnerBottom, CollisionMode.InnerBottom, cornerX, cornerXPassive)); } } }