Вы можете для обоих классов добавить свойство
public Rectangle PositionRectangle { get; private set; }
затем в соответствующих конструкторах вам нужно будет инициировать это свойство
public Man(..., Rectangle rectangle)
{
PositionRectangle = rectangle;
}
public Player(..., Vector2 position, int width, int height)
{
PositionRectangle = new rectangle((int)position.X, (int)position.Y, width, height);
}
Вам не нужно беспокоиться о том, какой кадр вы показываете, так как он связан с исходным прямоугольником, а не с целевым прямоугольником (это то, что вам нужно для тест на столкновение).
Затем вы можете легко проверить эти столкновения
if(man.PositionRectangle.Intersects(player.PositionRectangle))
{
//collision logic
}
Конечно, вам нужно позаботиться об обновлении этих прямоугольников каждый раз, когда вы меняете позиции (или ширину и высоту, если они изменяемы)
Небольшое редактирование (или лучшая версия)
Если вы хотите легко расположить Человека и Игрока, не беспокоясь об обновлении их прямоугольников, вы можете настроить это следующим образом:
class Man
{
Texture2D _texture;
public Vector2 Position { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public Rectangle PositionRectangle
{
get
{
return new Rectangle((int)Position.X, (int)Position.Y, Width, Height);
}
}
public Man(Texture2D texture)
{
this._texture = texture;
this.Width = texture.Width;
this.Height = texture.Height;
}
... //other man related logic!
}
class Player
{
Texture2D _texture;
int _frameCount;
int _currentFrame;
//other frame related logic...
public Vector2 Position { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public Rectangle PositionRectangle
{
get
{
return new Rectangle((int)Position.X, (int)Position.Y, Width, Height);
}
}
public Rectangle SourceRectangle
{
get
{
return new Rectangle(Width * _currentFrame, 0, Width, Height);
}
}
public Player(Texture2D texture, int frameWidth, int frameCount)
{
this._texture = texture;
this.Width = frameWidth;
this.Height = texture.Height;
this._frameCount = frameCount;
this._currentFrame = 0;
//etc...
}
... //other player related logic! such as updating _currentFrame
public Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(_texture, PositionRectangle, SourceRectangle, Color.White);
}
}
Здесь я дал вам пример того, как вы можете использовать методы доступа к свойствам для динамического создания соответствующих прямоугольников!
Вы используете PositionRectangle
, чтобы определить, где ваш игрок (или человек) будет расположен на экране, и вы используете SourceRectangle
, чтобы определить, какую часть текстуры вы собираетесь рисовать.
Кроме того, если ширина и высота вашего мужчины и игрока не будут меняться, вам следует установить их аксессоры set
на private
.
Когда вам нужно изменить местоположения, вы просто устанавливаете их свойство position
man.Position = new Vector2(100, 100); //i.e.
и ваши коллизии и логика рисования будут автоматически использовать новые прямоугольники без какого-либо дополнительного вмешательства!
Надеюсь, вам понравится!
Редактировать2
Что касается исходного прямоугольника, который является общедоступным, вам это нужно только в том случае, если вы рисуете его снаружи (т.е. Game1
вызывает spriteBatch.Draw(player.Texture, player.PositionRectangle, player.SourceRectangle, Color.White);
).
Если вы рисуете его, как в примере (изнутри), вы можете просто отказаться от всего public Recangle SourceRectangle{...}
и просто использовать этот прямоугольник непосредственно в отрисовке:
public Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(_texture, PositionRectangle, new Rectangle(Width * _currentFrame, 0, Width, Height), Color.White);
}
person
neeKo
schedule
29.04.2012