Доработка карты и разрешение коллизий с объектами карты
This commit is contained in:
parent
7b58ed1f01
commit
20b682b2ef
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -9,6 +10,7 @@ namespace AirBomber
|
|||||||
internal abstract class AbstractMap
|
internal abstract class AbstractMap
|
||||||
{
|
{
|
||||||
private IDrawningObject _drawningObject = null;
|
private IDrawningObject _drawningObject = null;
|
||||||
|
private Bitmap? _staticBitMap;
|
||||||
protected int[,] _map = null;
|
protected int[,] _map = null;
|
||||||
protected int _width;
|
protected int _width;
|
||||||
protected int _height;
|
protected int _height;
|
||||||
@ -20,6 +22,7 @@ namespace AirBomber
|
|||||||
|
|
||||||
public Bitmap CreateMap(int width, int height, IDrawningObject drawningObject)
|
public Bitmap CreateMap(int width, int height, IDrawningObject drawningObject)
|
||||||
{
|
{
|
||||||
|
_staticBitMap = null;
|
||||||
_width = width;
|
_width = width;
|
||||||
_height = height;
|
_height = height;
|
||||||
_drawningObject = drawningObject;
|
_drawningObject = drawningObject;
|
||||||
@ -30,10 +33,56 @@ namespace AirBomber
|
|||||||
}
|
}
|
||||||
return DrawMapWithObject();
|
return DrawMapWithObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>Проверяет наличие непроходимых участков в заданной области</summary>
|
||||||
|
/// <param name="area">Заданная область</param>
|
||||||
|
/// <param name="iBarrier">i-ый индекс первого барьера, который был найден в области</param>
|
||||||
|
/// <param name="jBarrier">j-ый индекс первого барьера, который был найден в области</param>
|
||||||
|
/// <returns>Есть ли барьеры</returns>
|
||||||
|
protected bool BarriersInArea(RectangleF area, ref int iBarrier, ref int jBarrier)
|
||||||
|
{
|
||||||
|
if (!(0 < area.Left && area.Right < _width && 0 < area.Top && area.Bottom < _height))
|
||||||
|
{
|
||||||
|
return true; // Если область попала за карту, считаем что она столкнулась с барьером
|
||||||
|
}
|
||||||
|
int rightArea = (int)Math.Ceiling(area.Right / _size_x);
|
||||||
|
int bottomArea = (int)Math.Ceiling(area.Bottom / _size_y);
|
||||||
|
for (int i = (int)(area.Left / _size_x); i < rightArea; i++)
|
||||||
|
{
|
||||||
|
for (int j = (int)(area.Top / _size_y); j < bottomArea; j++)
|
||||||
|
{
|
||||||
|
if (_map[i, j] == _barrier)
|
||||||
|
{
|
||||||
|
iBarrier = i;
|
||||||
|
jBarrier = j;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
protected bool BarriersInArea(RectangleF area)
|
||||||
|
{
|
||||||
|
int a = 0, b = 0;
|
||||||
|
return BarriersInArea(area, ref a, ref b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public Bitmap MoveObject(Direction direction)
|
public Bitmap MoveObject(Direction direction)
|
||||||
{
|
{
|
||||||
// TODO проверка, что объект может переместится в требуемом направлении
|
var rect = _drawningObject.GetCurrentPosition();
|
||||||
if (true)
|
var step = _drawningObject.Step;
|
||||||
|
// Вычисляем области смещения объекта
|
||||||
|
RectangleF? area = null;
|
||||||
|
if (direction == Direction.Left)
|
||||||
|
area = new(rect.Left - step, rect.Top, step, rect.Height);
|
||||||
|
else if (direction == Direction.Right)
|
||||||
|
area = new(rect.Right, rect.Top, step, rect.Height);
|
||||||
|
else if (direction == Direction.Up)
|
||||||
|
area = new(rect.Left, rect.Top - step, rect.Width, step);
|
||||||
|
else if (direction == Direction.Down)
|
||||||
|
area = new(rect.Left, rect.Bottom, rect.Width, step);
|
||||||
|
if (area.HasValue && !BarriersInArea(area.Value))
|
||||||
{
|
{
|
||||||
_drawningObject.MoveObject(direction);
|
_drawningObject.MoveObject(direction);
|
||||||
}
|
}
|
||||||
@ -48,17 +97,37 @@ namespace AirBomber
|
|||||||
int x = _random.Next(0, 10);
|
int x = _random.Next(0, 10);
|
||||||
int y = _random.Next(0, 10);
|
int y = _random.Next(0, 10);
|
||||||
_drawningObject.SetObject(x, y, _width, _height);
|
_drawningObject.SetObject(x, y, _width, _height);
|
||||||
// TODO првоерка, что объект не "накладывается" на закрытые участки
|
|
||||||
return true;
|
// Если натыкаемся на барьер помещаем левый верхний угол чуть ниже этого барьера
|
||||||
}
|
// если при этом выходим за карту, пермещаем правый нижный угол чуть выше этого барьера
|
||||||
private Bitmap DrawMapWithObject()
|
// если объект выходит за карту, генирируем новые координаты рандомно
|
||||||
{
|
int currI = 0, currJ = 0;
|
||||||
Bitmap bmp = new(_width, _height);
|
var areaObject = _drawningObject.GetCurrentPosition();
|
||||||
if (_drawningObject == null || _map == null)
|
int cntOut = 10000; // Количество итераций до выхода из цикла
|
||||||
|
while (BarriersInArea(areaObject, ref currI, ref currJ) && --cntOut >= 0)
|
||||||
{
|
{
|
||||||
return bmp;
|
if ((currJ + 1) * _size_y + areaObject.Height <= _height)
|
||||||
|
{
|
||||||
|
areaObject.Location = new PointF((currI + 1) * _size_x, (currJ + 1) * _size_y);
|
||||||
|
}
|
||||||
|
else if ((currI - 1) * _size_x - areaObject.Width >= 0)
|
||||||
|
{
|
||||||
|
areaObject = new((currI - 1) * _size_x - areaObject.Width, (currJ - 1) * _size_y - areaObject.Height, areaObject.Width, areaObject.Height);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
areaObject.Location = new PointF(_random.Next(0, _width - (int)areaObject.Width),
|
||||||
|
_random.Next(0, _height - (int)areaObject.Height));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Graphics gr = Graphics.FromImage(bmp);
|
_drawningObject.SetObject((int)areaObject.X, (int)areaObject.Y, _width, _height);
|
||||||
|
return cntOut >= 0;
|
||||||
|
}
|
||||||
|
private void DrawMap()
|
||||||
|
{
|
||||||
|
if (_staticBitMap != null) return;
|
||||||
|
_staticBitMap = new(_width, _height);
|
||||||
|
Graphics gr = Graphics.FromImage(_staticBitMap);
|
||||||
for (int i = 0; i < _map.GetLength(0); ++i)
|
for (int i = 0; i < _map.GetLength(0); ++i)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < _map.GetLength(1); ++j)
|
for (int j = 0; j < _map.GetLength(1); ++j)
|
||||||
@ -73,6 +142,20 @@ namespace AirBomber
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap DrawMapWithObject()
|
||||||
|
{
|
||||||
|
Bitmap bmp = new(_width, _height);
|
||||||
|
if (_drawningObject == null || _map == null)
|
||||||
|
{
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
Graphics gr = Graphics.FromImage(bmp);
|
||||||
|
if (_staticBitMap == null)
|
||||||
|
DrawMap();
|
||||||
|
if (_staticBitMap != null)
|
||||||
|
gr.DrawImage(_staticBitMap, 0, 0);
|
||||||
_drawningObject.DrawningObject(gr);
|
_drawningObject.DrawningObject(gr);
|
||||||
return bmp;
|
return bmp;
|
||||||
}
|
}
|
||||||
|
@ -211,9 +211,9 @@
|
|||||||
/// Получение текущей позиции объекта
|
/// Получение текущей позиции объекта
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public (float Left, float Right, float Top, float Bottom) GetCurrentPosition()
|
public RectangleF GetCurrentPosition()
|
||||||
{
|
{
|
||||||
return (_startPosX, _startPosY, _startPosX + _airplaneWidth, _startPosY + _airplaneHeight);
|
return new(_startPosX, _startPosY, _airplaneWidth, _airplaneHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -17,7 +17,7 @@ namespace AirBomber
|
|||||||
|
|
||||||
public float Step => _airplane?.Airplane?.Step ?? 0;
|
public float Step => _airplane?.Airplane?.Step ?? 0;
|
||||||
|
|
||||||
public (float Left, float Right, float Top, float Bottom) GetCurrentPosition()
|
public RectangleF GetCurrentPosition()
|
||||||
{
|
{
|
||||||
return _airplane.GetCurrentPosition();
|
return _airplane.GetCurrentPosition();
|
||||||
}
|
}
|
||||||
|
1
AirBomber/AirBomber/FormMap.Designer.cs
generated
1
AirBomber/AirBomber/FormMap.Designer.cs
generated
@ -144,6 +144,7 @@
|
|||||||
//
|
//
|
||||||
// buttonCreateModif
|
// buttonCreateModif
|
||||||
//
|
//
|
||||||
|
this.buttonCreateModif.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
|
||||||
this.buttonCreateModif.Location = new System.Drawing.Point(104, 390);
|
this.buttonCreateModif.Location = new System.Drawing.Point(104, 390);
|
||||||
this.buttonCreateModif.Name = "buttonCreateModif";
|
this.buttonCreateModif.Name = "buttonCreateModif";
|
||||||
this.buttonCreateModif.Size = new System.Drawing.Size(110, 23);
|
this.buttonCreateModif.Size = new System.Drawing.Size(110, 23);
|
||||||
|
@ -1,64 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<root>
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
@ -117,4 +57,7 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
</root>
|
</root>
|
@ -38,6 +38,6 @@ namespace AirBomber
|
|||||||
/// Получение текущей позиции объекта
|
/// Получение текущей позиции объекта
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
(float Left, float Right, float Top, float Bottom) GetCurrentPosition();
|
RectangleF GetCurrentPosition();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user