|
Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить..... |
Опубликован: 10.04.2009 | Доступ: свободный | Студентов: 3253 / 244 | Оценка: 4.49 / 4.39 | Длительность: 17:21:00
Темы: Компьютерная графика, Программирование, Игры
Специальности: Программист
Самостоятельная работа 5:
Игровая физика
В табл. 9.1. приведено соответствие чисел, используемых в таблице-конструкторе уровня и объектов.
| Номер | Название объекта |
|---|---|
| 0 | Объект отсутствует |
| 1 | Стена |
| 2 | Лестница |
| 3 | Бонус №1 |
| 4 | Бонус №2 |
| 5 | Враг |
| 6 | Игрок |
На рис. 9.2. приведено изображение игрового экрана, сконструированного в соответствии с таблицей и содержимым массива.
На рис. 9.3. приведено окно проекта.
В табл. 9.2. приведено описание классов, которые мы используем в данном проекте.
| Имя файла | Описание |
|---|---|
| Game1.cs | Класс стандартного проекта |
| gBaseClass.cs | Базовый класс – родитель классов игровых объектов. Он содержит процедуры визуализации объектов и их расстановки по игровому полю. Этот класс наследует класс DrawableGameComponent |
| Bonus1.cs | Класс для создания объектов бонусов вида №1 |
| Bonus2.cs | Класс для создания объектов бонусов вида №2 |
| Enemy.cs | Класс для создания объектов-врагов |
| Ladder.cs | Класс для создания лестниц |
| Me.cs | Класс для создания объекта игрока. Именно он содержит основную часть игровой логики, в том числе – реализацию игровой физики для объекта-игрока |
| Wall.cs | Класс для создания стен |
В листинге 9.2. приведен код класса Game1.
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 P5_1
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D txtBackground;
Texture2D txtBonus1;
Texture2D txtBonus2;
Texture2D txtEnemy;
Texture2D txtLadder;
Texture2D txtMe;
Texture2D txtWall;
//Массив для конструирования уровня
public int[,] Layer;
Rectangle recBackround = new Rectangle(0, 0, 640, 512);
Rectangle recSprite = new Rectangle(0, 0, 64, 64);
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
// TODO: Add your initialization logic here
Layer = new int[8, 10] {
{ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 5, 1, 3, 5, 1, 1, 2, 1, 5 },
{ 0, 0, 0, 1, 2, 1, 1, 2, 0, 4 },
{ 0, 1, 3, 0, 2, 0, 0, 2, 0, 3 },
{ 0, 5, 0, 0, 1, 1, 1, 2, 0, 1 },
{ 0, 0, 0, 1, 0, 0, 0, 2, 0, 1 },
{ 6, 0, 1, 3, 4, 0, 5, 2, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
};
//Устанавливаем разрешение игрового окна
//640х512
graphics.PreferredBackBufferWidth = 640;
graphics.PreferredBackBufferHeight = 512;
graphics.ApplyChanges();
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
Services.AddService(typeof(SpriteBatch), spriteBatch);
txtBackground = Content.Load<Texture2D>("background");
txtBonus1 = Content.Load<Texture2D>("bonus1");
txtBonus2 = Content.Load<Texture2D>("bonus2");
txtEnemy = Content.Load<Texture2D>("enemy");
txtLadder = Content.Load<Texture2D>("ladder");
txtMe = Content.Load<Texture2D>("me");
txtWall = Content.Load<Texture2D>("wall");
//Вызываем процедуру расстановки объектов в игровом окне
AddSprites ();
}
//Процедура расстановки объектов в игровом окне
void AddSprites()
{
//Переменные для временного хранения адреса
//объекта-игрока
int a=0,b=0;
//Просматриваем массив Layer
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 10; j++)
{
//Если элемент с индексом (i,j) равен 1 -
//устанавливаем в соответствующую позицию элемент с
//номером 1, то есть - стену
if (Layer[i,j]==1)
Components.Add(new GameObj.Wall(this, ref txtWall, new Vector2(j, i), recSprite));
if (Layer[i, j] == 2)
Components.Add(new GameObj.Ladder(this, ref txtLadder, new Vector2(j, i), recSprite));
if (Layer[i, j] == 3)
Components.Add(new GameObj.Bonus1(this, ref txtBonus1, new Vector2(j, i), recSprite));
if (Layer[i, j] == 4)
Components.Add(new GameObj.Bonus2(this, ref txtBonus2, new Vector2(j, i), recSprite));
if (Layer[i, j] == 5)
Components.Add(new GameObj.Enemy(this, ref txtEnemy, new Vector2(j, i), recSprite));
//Если обнаружен объект игрока - запишем его координаты
if (Layer[i, j] == 6)
{
a = i;
b = j;
}
}
}
//Последним установим объект игрока - так он гарантированно
//расположен поверх всех остальных объектов
Components.Add(new GameObj.Me(this, ref txtMe, new Vector2(b, a), new Rectangle (0,0,32,32)));
}
protected override void UnloadContent()
{
txtBackground.Dispose();
txtBonus1.Dispose();
txtBonus2.Dispose();
txtEnemy.Dispose();
txtLadder.Dispose();
txtMe.Dispose ();
txtWall.Dispose();
spriteBatch.Dispose();
}
protected override void Update(GameTime gameTime)
{
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
//выведем фоновое изображение
spriteBatch.Draw(txtBackground, recBackround ,Color.White);
//Выведем игровые объекты
base.Draw(gameTime);
spriteBatch.End();
}
}
}
Листинг
9.2.
Код класса Game1
Теперь рассмотрим код класса gBaseClass (листинг 9.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 P5_1.GameObj
{
public class gBaseClass : Microsoft.Xna.Framework.DrawableGameComponent
{
Texture2D sprTexture;
public Vector2 sprPosition;
public Rectangle sprRectangle;
public gBaseClass(Game game, ref Texture2D _sprTexture,
Vector2 _sprPosition, Rectangle _sprRectangle)
: base(game)
{
sprTexture = _sprTexture;
//Именно здесь производится перевод индекса элемента массива
//в координаты на игровом экране
sprPosition = _sprPosition * 64;
sprRectangle = _sprRectangle;
}
public override void Initialize()
{
base.Initialize();
}
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);
}
}
}
Листинг
9.3.
Код класса gBaseClass

