Спонсор: Microsoft
Опубликован: 10.04.2009 | Уровень: специалист | Доступ: платный
Самостоятельная работа 8:

Методы искусственного интеллекта (ИИ) в компьютерных играх

В данном примере производится инициализация матрицы игрового мира и расстановка объектов. Здесь мы, помимо объекта-игрока и объекта-преследователя, разместили на игровом поле несколько стен (рис. 12.2.).

Непреодолимое препятствие

увеличить изображение
Рис. 12.2. Непреодолимое препятствие

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

В листинге 12.2. приведен код класса gBaseClass.

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.Content;

namespace P8_1.GameObj
{
    
    public class gBaseClass : Microsoft.Xna.Framework.DrawableGameComponent
    {
        Texture2D sprTexture;
        public Vector2 sprPosition;
        public Rectangle sprRectangle;
        //Прямоугольник, представляющий игровое окно
        public Rectangle scrBounds;
        //Скорость объекта
        public float sprSpeed;
        public gBaseClass(Game game, ref Texture2D _sprTexture,
            Vector2 _sprPosition, Rectangle _sprRectangle)
            : base(game)
        {
            sprTexture = _sprTexture;
            //Именно здесь производится перевод индекса элемента массива
            //в координаты на игровом экране
            sprPosition = _sprPosition * 64;
            sprRectangle = _sprRectangle;
            scrBounds = new Rectangle(0, 0,
             game.Window.ClientBounds.Width,
             game.Window.ClientBounds.Height);
        }

        
        public override void Initialize()
        {
            base.Initialize();
        }

        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
        }
        public override void Draw(GameTime gameTime)
        {
            SpriteBatch sprBatch =
                (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch));
            sprBatch.Draw(sprTexture, sprPosition, Color.White);
            base.Draw(gameTime);
        }
        //Проверка на столкновение с каким-либо объектом
       public bool IsCollideWithObject(gBaseClass spr)
        {
            return (this.sprPosition.X + this.sprRectangle.Width > spr.sprPosition.X &&
                        this.sprPosition.X < spr.sprPosition.X + spr.sprRectangle.Width &&
                        this.sprPosition.Y + this.sprRectangle.Height > spr.sprPosition.Y &&
                        this.sprPosition.Y < spr.sprPosition.Y + spr.sprRectangle.Height);


        }
        //Процедуры для перемещения объекта
        public void MoveUp(float speed)
        {
            this.sprPosition.Y -= speed;
        }
        public void MoveDown(float speed)
        {
            this.sprPosition.Y += speed;
        }
        public void MoveLeft(float speed)
        {
            this.sprPosition.X -= speed;
        }
        public void MoveRight(float speed)
        {
            this.sprPosition.X += speed;
        }
        //Проверка на столкновение со стеной
       public bool IsCollideWithWall()
        {
            foreach (gBaseClass spr in Game.Components)
            {
                if (spr.GetType() == (typeof(Wall)))
                {
                    if (IsCollideWithObject(spr)) return true;
                }
            }

            return false;
        }
        //Проверка на столкновение с границами экрана
       public void Check()
        {
            if (sprPosition.X < scrBounds.Left)
            {
                sprPosition.X = scrBounds.Left;
            }
            if (sprPosition.X > scrBounds.Width - sprRectangle.Width)
            {
                sprPosition.X = scrBounds.Width - sprRectangle.Width;
            }
            if (sprPosition.Y < scrBounds.Top)
            {
                sprPosition.Y = scrBounds.Top;
            }
            if (sprPosition.Y > scrBounds.Height - sprRectangle.Height)
            {
                sprPosition.Y = scrBounds.Height - sprRectangle.Height;
            }
        }

    }
}
Листинг 12.2. Код класса gBaseClass

Мы включили в этот класс методы и свойства, которые будем использовать и для объекта игрока и для объекта-преследователя. Они знакомы вам по проекту P5_1.

Теперь рассмотрим код класса Wall(листинг 12.3.) мы приводим его здесь лишь для полноты изложения – он не претерпел изменений.

using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.Content;

namespace P8_1.GameObj
{
    public class Wall : gBaseClass
    {
        public Wall(Game game, ref Texture2D _sprTexture,
            Vector2 _sprPosition, Rectangle _sprRectangle)
            : base(game, ref _sprTexture, _sprPosition, _sprRectangle)
        {
            // TODO: Construct any child components here
        }

        public override void Initialize()
        {
            // TODO: Add your initialization code here

            base.Initialize();
        }

        public override void Update(GameTime gameTime)
        {
            // TODO: Add your update code here

            base.Update(gameTime);
        }
    }
}
Листинг 12.3. Код класса Wall
Alina Lasskaja
Alina Lasskaja

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

Дмитрий Кацман
Дмитрий Кацман
Израиль
Андрей Веденин
Андрей Веденин
Россия, Белгород