Получение классов в XNA, чтобы «поговорить» друг с другом - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть два класса в XNA.

maingame.cs а также player.cs

В моем maingame.cs у меня есть прямоугольник, который рисуется там, где находится мышь, я использую его для нажатия.

Мой player.cs имеет прямоугольник для спрайта игроков.

Понятия не имею, как заставить эти два класса «разговаривать» друг с другом, чтобы у меня было что-то вроде

if (ButtonState.Pressed == mouseState.LeftButton && mouseRectangle.Intersects(playerRectangle))
            {
                //draw something
            }

Проблема в том, что playerRectangle находится в Player.CS , а mouseRectangle находится в maingame.CS

Как мне заставить этих двоих поговорить друг с другом? Я уже несколько часов гуглю без удачи.

Player.CS выглядит как

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;

namespace PlanetDefence
{
    class Battleship
{
//Textures
Texture2D playerBattleshipTexture;

//Rectangles
 Rectangle playerBattleshipRectangle;

//Integers

public Battleship(Texture2D newPlayerBattleshipTexture, Rectangle newPlayerBattleshipRectangle)
{
    playerBattleshipTexture = newPlayerBattleshipTexture;
    playerBattleshipRectangle = newPlayerBattleshipRectangle;

    newPlayerBattleshipRectangle = new Rectangle(100, 100, 100, 100);
}

public void Update()
{

}

public void Draw(SpriteBatch spriteBatch)
{
    //Draw the player Battleship
    spriteBatch.Draw(playerBattleshipTexture, playerBattleshipRectangle, Color.White);
}

}

}

Я пытаюсь сделать так, чтобы мой прямоугольник мыши в MainGame.CS мог щелкнуть по нему, выполнив

    if (ButtonState.Pressed == mouseState.LeftButton && mouseRectangle.Intersects(playerBattleshipRectangle))
    {
        playerBattleship.Draw(spriteBatch);
    }

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Я не уверен, что излагаю здесь очевидное, но вам нужен общедоступный аксессор для вашего Rectangle в вашем классе линейных кораблей. Если вы не понимаете, что это значит, вам нужно почитать основы объектно-ориентированного программирования. На данный момент, однако, если вы измените код вашего класса линкора, чтобы сказать

public Rectangle playerBattleshipRectangle;

... затем вы можете получить к нему доступ из ссылки вашего maingame.cs на объект игрока, используя

player.playerBattleshipRectangle

(при условии, что ваш игрок является классом линкора. Если это не так, вам нужно быть более ясным в своем вопросе и опубликовать исходный код класса для любого класса, которым является ваш игрок. Вы говорите «player.cs», но публикуете класс линкора - что это? Если имя файла - player.cs, но имя класса на самом деле - линкор, вы должны изменить одно из них так, чтобы они были одинаковыми. Практикуйтесь хорошо, легко понимайте имена классов и переменных, будьте как можно более описательными без слишком многословно).

По умолчанию, если вы не включаете модификатор области (открытый, закрытый, защищенный, внутренний ...) перед полями-членами в классе, тогда они устанавливаются как закрытые и недоступны для других классов.

Вы также можете использовать Свойства, чтобы лучше контролировать доступ к полям членов класса. Например,

private int health;
public int Health
{
    get { return health; }
    set { health = MathHelper.Clamp(health, 0, 100); }
}

этот код содержит частное (только этот класс может получить к нему доступ) определение состояния объекта. Он также предоставляет другим классам общедоступный способ «увидеть» здоровье этого объекта и изменить его. Как вы можете видеть в разделе 'set', когда другой класс устанавливает состояние этого объекта, он автоматически фиксируется между 0 и 100. Вы также можете полностью опустить 'set', и никакой другой класс не сможет изменить состояние, они могут видеть только это.

Это все основы объектно-ориентированного программирования на C #. Я настоятельно рекомендую вам начать с основ, если вы их не знаете. Вы не можете успешно создать игру, не понимая области действия, свойств, наследования, экземпляров объектов и ссылок, и это лишь некоторые из них.

Краткое резюме некоторых соответствующих определений из этого поста:

  • поле - иначе переменная; базовая черта, хранящаяся в классе как «член». т.е. "здоровье" или "ограничивающий ящик".
  • свойство - метод доступа к полю, который полезен для определения того, как внешние классы могут видеть и изменять его.
  • экземпляр - «реальный» объект, который хранится в памяти. класс определяет только поведение объекта; он должен быть превращен в экземпляр, чтобы объект действительно существовал. Такой класс, как «Морской бой», может использоваться для создания неограниченных экземпляров линейных кораблей в памяти. Когда вы говорите "Морской бой", игрок = новый Морской бой (), вы создаете экземпляр Морского корабля под названием "игрок".
  • private - размещение 'private' перед полем означает, что только этот класс может его видеть.
  • public - размещение 'public' перед полем означает, что все классы могут его видеть.
  • protected - размещение 'protected' перед полем означает, что только этот класс и все классы, унаследованные от этого класса, могут видеть его.
  • internal - размещение 'internal' перед полем означает, что только классы в этом пространстве имен 'видят его.

Я прошу прощения, если я недооцениваю ваше знание предмета.

1 голос
/ 16 февраля 2012

Один из классов должен содержать ссылку на другой.

С такой ссылкой он может вызывать методы, устанавливать свойства и т. Д.

Вы можете сделать это, передав экземпляр в конструкторе или в качестве свойства.

public Maingame(Player player)
{
  // use the Player instance
}

Чтобы получить доступ к нему вне конструктора, вы должны использовать поле и назначить его в конструкторе (или установщике свойств, в зависимости от того, что вы решите использовать):

Player myPlayer;
public Maingame(Player player)
{
  myPlayer = player;
  // use the myPlayer field in the class
}

Чтобы избежать тесной связи, вы можете исследовать, используя события .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...