| 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
