From c38737fa61c55fa44eab3f4e952e22c6c100027a Mon Sep 17 00:00:00 2001 From: shadowik Date: Fri, 23 Sep 2022 14:34:19 +0400 Subject: [PATCH] Collision --- .../DoubleDeckerBus/AbstractMap.cs | 67 ++++++++++++++++++- .../DoubleDeckerBus/DrawingObjectBus.cs | 2 +- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/DoubleDeckerBus/DoubleDeckerBus/AbstractMap.cs b/DoubleDeckerBus/DoubleDeckerBus/AbstractMap.cs index 44ac9ad..7ca2613 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/AbstractMap.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/AbstractMap.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.AccessControl; using System.Text; using System.Threading.Tasks; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.ScrollBar; namespace DoubleDeckerBus { @@ -18,6 +20,7 @@ namespace DoubleDeckerBus protected readonly int _freeRoad = 0; protected readonly int _barrier = 1; + public Bitmap CreateMap(int width, int height, IDrawingObject drawningObject) { _width = width; @@ -33,10 +36,28 @@ namespace DoubleDeckerBus public Bitmap MoveObject(Direction direction) { // TODO проверка, что объект может переместится в требуемом направлении - if (true) - { - _drawingObject.MoveObject(direction); + + _drawingObject.MoveObject(direction); + + bool collision = CheckCollision(); + + if (collision) { + switch (direction) { + case Direction.Left: + _drawingObject.MoveObject(Direction.Right); + break; + case Direction.Right: + _drawingObject.MoveObject(Direction.Left); + break; + case Direction.Up: + _drawingObject.MoveObject(Direction.Down); + break; + case Direction.Down: + _drawingObject.MoveObject(Direction.Up); + break; + } } + return DrawMapWithObject(); } private bool SetObjectOnMap() @@ -48,7 +69,15 @@ namespace DoubleDeckerBus int x = _random.Next(0, 10); int y = _random.Next(0, 10); _drawingObject.SetObject(x, y, _width, _height); + + // TODO првоерка, что объект не "накладывается" на закрытые участки + + while (CheckCollision()) { + x = _random.Next(0, 10); + y = _random.Next(0, 10); + _drawingObject.SetObject(x, y, _width, _height); + } return true; } private Bitmap DrawMapWithObject() @@ -75,6 +104,38 @@ namespace DoubleDeckerBus } _drawingObject.DrawingObject(gr); return bmp; + + } + + private bool CheckCollision() { + var pos = _drawingObject.GetCurrentPosition(); + int startX = (int)((pos.Left) / _size_x); + int endX = (int)((pos.Right) / _size_x); + int startY = (int)((pos.Top) / _size_y); + int endY = (int)((pos.Bottom) / _size_y); + + if (startX < 0 || startY < 0 || endX > _map.GetLength(1) || endY > _map.GetLength(0)) { return false; } + + /* startX = (int)((pos.Left - 5) / _size_x); + endX = (int)((pos.Right + 5) / _size_x); + startY = (int)((pos.Top - 5) / _size_y); + endY = (int)((pos.Bottom + 5) / _size_y);*/ + + + + for (int y = startY - 1; y <= endY + 1; y++) + { + for (int x = startX - 1; x <= endX + 1; x++) + { + if (_map[x, y] == _barrier) + { + return true; + break; + } + } + } + + return false; } protected abstract void GenerateMap(); diff --git a/DoubleDeckerBus/DoubleDeckerBus/DrawingObjectBus.cs b/DoubleDeckerBus/DoubleDeckerBus/DrawingObjectBus.cs index 9c09def..9ed77ea 100644 --- a/DoubleDeckerBus/DoubleDeckerBus/DrawingObjectBus.cs +++ b/DoubleDeckerBus/DoubleDeckerBus/DrawingObjectBus.cs @@ -34,7 +34,7 @@ namespace DoubleDeckerBus void IDrawingObject.DrawingObject(Graphics g) { - // TODO + _bus.DrawTransport(g); } } }