Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить..... |
Опубликован: 10.04.2009 | Уровень: специалист | Доступ: свободно
Самостоятельная работа 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