Спонсор: Microsoft
Опубликован: 10.04.2009 | Доступ: свободный | Студентов: 3248 / 243 | Оценка: 4.49 / 4.39 | Длительность: 17:21:00
Специальности: Программист
Самостоятельная работа 12:

Сетевые игры

Особенности организации сетевой игры

Для того чтобы создать сетевую игру, нужно выполнить следующие шаги:

  • Создать учетную запись игрока, войти в систему
  • Создать сетевую сессию
  • Дождаться подключения игроков
  • Начать игру
  • В процессе игры вам придется обновлять состояние игровых объектов, следить за действиями игроков, проверять игру на выполнение критериев окончания, а так же – выполнять другие игровые задачи.

Рассмотрим создание сетевой SystemLink-игры, которая может работать в локальной сети.

Разработка сетевой игры

Разработаем сетевую версию клона популярной игры Pong. Реализуем в нашем примере базовую функциональность сетевой игры, которая, при практическом применении, должна быть дополнена.

Создадим новый игровой проект P12_1. На рис. 16.3. вы можете видеть окно Solution Explorer для этого проекта.

Окно Solution Explorer для проекта P12_1

Рис. 16.3. Окно Solution Explorer для проекта P12_1

Здесь мы использовали уже знакомый вам набор текстур 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
Alina Lasskaja
Alina Lasskaja

Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить.....