Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить..... |
Сетевые игры
Особенности организации сетевой игры
Для того чтобы создать сетевую игру, нужно выполнить следующие шаги:
- Создать учетную запись игрока, войти в систему
- Создать сетевую сессию
- Дождаться подключения игроков
- Начать игру
- В процессе игры вам придется обновлять состояние игровых объектов, следить за действиями игроков, проверять игру на выполнение критериев окончания, а так же – выполнять другие игровые задачи.
Рассмотрим создание сетевой SystemLink-игры, которая может работать в локальной сети.
Разработка сетевой игры
Разработаем сетевую версию клона популярной игры Pong. Реализуем в нашем примере базовую функциональность сетевой игры, которая, при практическом применении, должна быть дополнена.
Создадим новый игровой проект P12_1. На рис. 16.3. вы можете видеть окно Solution Explorer для этого проекта.
Здесь мы использовали уже знакомый вам набор текстур BallandBats, содержащий текстуры для клона игры в Pong. Основная функциональность сосредоточена в классе Game1. Классы Ball и Bat используются для представления соответствующих объектов в игре.
Алгоритм работы с программой выглядит так. Сразу после запуска она запускает интерфейс для создания учетной записи игрока, после того, как игрок войдет в систему, запускается игра. После запуска программа пытается автоматически найти сетевую сессию, созданную другой аналогичной программой. Если попытка поиска не увенчалась успехом, программа самостоятельно создает сессию и ждет подключения другой программы. После подключения начинается игра.
В листинге 16.1. вы можете найти код класса Ball. Этот класс используется для хранения атрибутов мяча, а так же – содержит код для вывода объекта на экран.
using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Net; using Microsoft.Xna.Framework.Storage; namespace P12_1 { //Класс мяча //Обычный класс, содержащий данные о мяче и процедуру визуализации class Ball { //Текстура Texture2D sprTexture; //Прямоугольник, ограничивающий нужную текстуру public Rectangle sprRectangle; //Позиция на экране public Vector2 sprPosition; //Скорость перемещения public Vector2 sprSpeed; //Границы экрана public Rectangle scrBounds; //Конструктор - принимает на вход объект для загрузки //контента и ссылку на игру public Ball(ContentManager content, Game game) { //Загрузим текстуру sprTexture = content.Load<Texture2D>("Ballandbats"); //Установим прямоугольник sprRectangle = new Rectangle(16, 203, 17, 17); //Установим скорость sprSpeed = new Vector2(-1.5f, -2.7f); //Вычислим границы экрана scrBounds = new Rectangle(0, 0, game.Window.ClientBounds.Width, game.Window.ClientBounds.Height); //Установим мяч в центр экрана sprPosition = new Vector2(scrBounds.Width / 2, scrBounds.Height / 2); } //Процедура для рисования объекта //Принимает на вход объект SpriteBatch //Используется в основной игре внутри команд Begin и End //в цикле вывода изображений с помощью объекта типа SpriteBatch public void Draw(SpriteBatch spriteBatch) { spriteBatch.Draw(sprTexture, sprPosition, sprRectangle, Color.White); } } }Листинг 16.1. Код класса Ball
В листинге 16.2. вы можете найти код класса Bat. Он почти так же прост, как и код мяча. Единственное существенное отличие – он включает в себя проверку на столкновение с верхней и нижней границами экрана. Эта проверка происходит каждый раз после вызова процедуры вывода объекта на экран.
using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Net; using Microsoft.Xna.Framework.Storage; namespace P12_1 { //Класс биты class Bat { //Текстура Texture2D sprTexture; //Прямоугольник, ограничивающий нужную текстуру public Rectangle sprRectangle; //Позиция public Vector2 sprPosition; //Границы экрана Rectangle scrBounds; //Конструктор - принимает на вход номер игрока, объект для загрузки //контента и ссылку на игру public Bat(int PlIndex, ContentManager content, Game game) { //Загрузим текстуру sprTexture = content.Load<Texture2D>("Ballandbats"); //Если номер игрока равен нулю (то есть - это хост) if (PlIndex == 0) { //Установим биту слева sprRectangle = new Rectangle(18, 9, 17, 88); sprPosition = new Vector2(0, 0); } //Если номер равен 1 (это - обычный игрок) if (PlIndex == 1) { //Установим биту справа sprRectangle = new Rectangle(17, 106, 17, 88); sprPosition = new Vector2(game.Window.ClientBounds.Width-sprRectangle .Width, 0); } //Границы экрана scrBounds = new Rectangle(0, 0, game.Window.ClientBounds.Width, game.Window.ClientBounds.Height); } //Процедура визуализации, которую вызываем из основной программы public void Draw(SpriteBatch spriteBatch) { //Перед визуализацие проверяем, не вышел ли объект за пределы экрана //Если вышел - исправляем if (sprPosition.Y < scrBounds.Y) sprPosition.Y = scrBounds.Y; if (sprPosition.Y + sprRectangle.Height > scrBounds.Height) sprPosition.Y = scrBounds.Height - sprRectangle.Height; //выводим объект на экран spriteBatch.Draw(sprTexture, sprPosition, sprRectangle, Color.White); } } }Листинг 16.2. Код класса Bat