public BlueBall(Vector2D position, double radius, PlayerPaddle paddle) { lock (lockCounter) { ballID = IDCounter++; } this.playerPaddle = paddle; this.Velocity = new Vector2D(0, 0); ObjectTextures = new List<GameBitmap>(); this.Position = position; this.Radius = radius; ObjectTextures.Add(new GameBitmap("\\Resources\\Images\\ballBlue.png", this.Position - new Vector2D(0, Radius) - new Vector2D(Radius, 0), this.Position - new Vector2D(0, Radius) + new Vector2D(Radius, 0), this.Position + new Vector2D(0, Radius) + new Vector2D(-Radius, 0))); ObjectTextures[0].IsBall = true; ObjectWidth = ObjectHeight = 2 * radius; ObjectTextures[0].IsSquare = true; ObjectTextures[0].ColorLowSpec = Color.Aqua; //квадратот ќе ги има истите темиња како и сликата textureRotator = new GameRectangle(ObjectTextures[0].PositionUL, ObjectTextures[0].PositionUR, ObjectTextures[0].PositionDL); Health = 1000; }
/// <summary> /// Провери дали се сече или допира со правоаголник /// </summary> /// <param name="rect"></param> /// <param name="points"></param> /// <returns></returns> private bool Intersects(GameRectangle rect, List<Vector2D> points) { /* Ќе сметаме дека правоаголникот секогаш е претставен како * * UL UR * --------------------------- * | | * | | * | | * --------------------------- * DL DR * */ //темиња на првиот правоаголник Vector2D pointUL = PositionUL; Vector2D pointUR = PositionUR; Vector2D pointDL = PositionDL; Vector2D pointDR = GetPositionVectorDR(); //темиња на вториот правоаголник Vector2D pointUL2 = rect.PositionUL; Vector2D pointUR2 = rect.PositionUR; Vector2D pointDL2 = rect.PositionDL; Vector2D pointDR2 = rect.GetPositionVectorDR(); //Провери вториот дали се содржи целосно во првиот. Врати ги темињата на внатрешниот во тој случај if (pointUL2.X > pointUL.X && pointUR2.X < pointUR.X && pointDL2.Y < pointDL.Y) { points.Add(pointUL2); points.Add(pointUR2); points.Add(pointDL2); points.Add(pointDR2); return true; } else if (pointUL.X > pointUL2.X && pointUR.X < pointUR2.X && pointDL.Y < pointDL2.Y) { //обратната ситуација points.Add(pointUL); points.Add(pointUR); points.Add(pointDL); points.Add(pointDR); return true; } //провери дали двете вертикални од вториот ја сечат горната хоризонтална страна од првиот points.AddRange((GeometricAlgorithms.IntersectLineSegments( pointUL2, pointDL2, pointUL, pointUR))); points.AddRange((GeometricAlgorithms.IntersectLineSegments(pointUR2, pointDR2, pointUL, pointUR))); //провери дали двете вертикали од вториот ја сечат долната хоризонтала од првиот points.AddRange((GeometricAlgorithms.IntersectLineSegments( pointUL2, pointDL2, pointDL, pointDR))); points.AddRange((GeometricAlgorithms.IntersectLineSegments( pointUR2, pointDR2, pointDL, pointDR))); //провери дали двете хоризонтали од вториот ја сечат левата вертикала од првиот points.AddRange((GeometricAlgorithms.IntersectLineSegments( pointUL2, pointUR2, pointUL, pointDL))); points.AddRange((GeometricAlgorithms.IntersectLineSegments( pointDL2, pointDR2, pointUL, pointDL))); //провери дали двете хоризонтали од вториот ја сечат десната вертикала од првиот points.AddRange((GeometricAlgorithms.IntersectLineSegments( pointUL2, pointUR2, pointUR, pointDR))); points.AddRange((GeometricAlgorithms.IntersectLineSegments( pointDL2, pointDR2, pointUR, pointDR))); //ако е најдена барем една заедничка точка, врати true return points.Count > 0; }
private static void RotateSingleBrick(Vector2D center, IGameObject obj) { GameRectangle rotator = new GameRectangle(obj.PositionUL, obj.PositionUR, obj.PositionDL); rotator.RotateAroundPointDeg(center, 1); obj.PositionUL.X = rotator.PositionUL.X; obj.PositionUL.Y = rotator.PositionUL.Y; obj.PositionUR.X = rotator.PositionUR.X; obj.PositionUR.Y = rotator.PositionUR.Y; obj.PositionDL.X = rotator.PositionDL.X; obj.PositionDL.Y = rotator.PositionDL.Y; }