как вы создаете экземпляр класса в C #? - PullRequest
2 голосов
/ 04 марта 2011

Я делаю игру для Windows Phone, используя платформу XNA C #.

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

Класс пули в основном рисует сам и имеет функцию «Стрелять», которая используется для перемещения пули в направлении игрока.

Я нуб в c # xD

Ответы [ 4 ]

3 голосов
/ 04 марта 2011

Не быть педантичным к Андрею, но технически это

Bullet mybullet = new Bullet(A, B, C);
2 голосов
/ 04 марта 2011

Обычный метод в вашем игровом цикле: добавьте проверку на касание экрана и примите меры, если он есть.

Для XNA в классе Game (который, я думаю, по умолчанию называется Game1) создайте поле для хранения информации о том, касался ли экран предыдущего цикла:

bool screenBeingTouched = false;

Это предотвращает создание нескольких пуль одним касанием (если это не то, что вам нужно).

Затем в методе Update класса Game проверьте, не происходит ли прикосновение к экрану, и выполните действие:

TouchCollection newScreenTouches = TouchPanel.GetState(); 

if (!screenBeingTouched && newScreenTouches.Count > 0)  
{  
    screenBeingTouched = true;  

    Bullet myBullet = new Bullet();
    myBullet.DoSomething(); // Such as render on the screen and move around.

}  
else if (newScreenTouches.Count == 0)  
{  
    screenBeingTouched = false;  
} 
1 голос
/ 04 марта 2011

Поскольку это игра, я бы порекомендовал вам НЕ создавать экземпляры объектов во время цикла обновления. Из-за этого вы будете испытывать очень сильное заикание и отставание во время игры.

То, как вы хотите это сделать - при инициализации игры или на этапе загрузки контента - создать очередь, скажем, 100 пуль:

Queue<Bullet> bulletCache;

Затем заполните этот список 100 экземплярами маркера:

for (int i = 0; i < 100; i++)
    bulletCache.Enqueue(new Bullet());

В вашей игре, когда вам нужно стрелять из пули, просто удалите одну из них, установите ее скорость, положение и т. Д. И дайте ей отрендериться. Когда он больше не виден (то есть ударил что-то, вышел за границы экрана и т. Д.), Поставьте его в очередь.

Таким образом, вы ничего не делаете в игровом цикле, а просто перерабатываете одни и те же объекты. Если вы сделаете это с таким большим количеством вещей в своей игре, у вас будет очень плавный игровой процесс. Если у вас появляется привычка создавать объекты в цикле обновления, сборщик мусора для Compact Framework (тот, что на телефоне) в какой-то момент включится, чтобы очистить их, и разрушит частоту кадров вашей игры.

Надеюсь, это поможет:)

1 голос
/ 04 марта 2011

Если у вас возникают проблемы с созданием экземпляра класса, я полагаю, что вы также не знакомы с конвейером содержимого, поэтому, предполагая базовую структуру маркера, я бы сделал что-то вроде этого:

Для загрузкикод Texture2D используется следующим образом:

var tx = this.Content.LoadContent<Texture2D>("TextureYouAddedAsContent");

Я предполагаю, что у вашего класса Bullet есть конструктор, который принимает Texture2D и другие параметры, используйте такой код для его создания:

int speed = 500;
Vector2 pos = new Vector2(50, 50); // start at 50, 50, top left
Vector2 dir = new Vector2(1, 0); // direction is in positive X direction
Bullet bullet = new Bullet(tx, pos, dir, speed);

ТакжеОформить заказ http://GameDev.StackExchange.com, и конкретно этот вопрос .

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