СоХабр закрыт.
С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.
values:
<resources>
<string name="ApplicationName">Angry PacMan</string>
</resources>
values-ru:
<resources>
<string name="ApplicationName">Злой PacMan</string>
</resources>
values-uk:
<resources>
<string name="ApplicationName">Злий PacMan</string>
</resources>
values-be:
<resources>
<string name="ApplicationName">Злы PacMan</string>
</resources>
values-sr:
<resources>
<string name="ApplicationName">Љути PacMan</string>
</resources>
using System;
using Microsoft.Xna.Framework;
namespace pacmangame
{
// класс "игрок"
class Player
{
// поля класса
public float X { get; private set; } //координата X
public float Y { get; private set; } //координата Y
public int Direction; // направление движения (1 - вправо, 2 - влево, 3 - вверх, 4 - вниз)
public float Speed { get; private set; } // скорость движения
public float Angle { get; private set; } // угол наклона
public int Lives; // число жизней
public GameProcess GameProcess; // игровой процесс (устанавливается обратная связь)
private int IncreaseSpeedCount; // промежуточная переменная для хранения счетчика увеличения скорости
// конструктор класса - действия, которые осуществляются при его создании (инициализации)
public Player(GameProcess importGameProcess)
{
// координаты создания - в левой части экрана
X = 50;
Y = 200;
Lives = 5;
Direction = 1; // направление движения устанавливаем "вправо"
Angle = 0; // начальный угол равен 0 градусов
Speed = 160f; // начальная скорость (потом можно изменить)
GameProcess = importGameProcess; // установка обратной связи с игровым процессом
}
// метод обработки взаимодействия игрока с целями
public void WorkWithTarget()
{
foreach (var enemy in GameProcess.Enemies)
{
// если игрок находится вблизи приведения, он его "съедает"
if ((Math.Abs(X - enemy.Screenpos.X) = 400) // спустя некоторое время скорость должна начать увеличиваться
{
if (Speed 960-32) || (Y > 540-32))
{
Lives = 5; // число жизней равно максимальному (не важно, были они потрачены или нет)
if (GameProcess.Score
using System;
using Microsoft.Xna.Framework;
namespace pacmangame
{
// класс "враг"
public class Enemy
{
public Vector2 Screenpos; // позиция на экране
public Vector2 Center; // ось вращения
public Vector2 Velocity; // векторы скорости
public bool IsAlive; // была ли цель уничтожена
public float Rotation; //поворот
public float Speed;//скорость
private Random Rnd; // счетчик случайных чисел
private int IncreaseSpeedCount; // промежуточное поле для хранения счетчика увеличения скорости
// конструктор класса - действия, которые осуществляются при его создании (инициализации)
public Enemy(int x,int y)
{
Speed = 4;
Center.X = 40;
Center.Y = 40;
IsAlive = true;
Screenpos.X = x;
Screenpos.Y = y;
Velocity = new Vector2(20, 20);
}
// метод обработки целей
public void Process(bool enableSpeedUp, GameTime gameTime)
{
Rnd = new Random(); // инициализация счетчика случайных чисел
if (enableSpeedUp) // если допустимо ускорение
{
//увеличение скорости до определенного предела
IncreaseSpeedCount++;
if (IncreaseSpeedCount >= 400) // спустя некоторое время скорость должна начать увеличиваться
{
if (Speed 960 - Center.X) Velocity.X = -Velocity.X;
if (Screenpos.Y 540 - Center.X) Velocity.Y = -Velocity.Y;
}
}
}
using System.Collections.Generic;
namespace pacmangame
{
// класс "Игровой процесс"
class GameProcess
{
public bool IsWin; // была ли победа (к полю можно обратиться извне, но нельзя изменить извне)
public bool IsLose; // было ли поражение (к полю можно обратиться извне, но нельзя изменить извне)
public bool IsGame; // идет ли игровой процесс (к полю можно обратиться извне, но нельзя изменить извне)
public bool IsPause; // включена ли пауза
public int Score; // текущий счет
public int MaxScore = 0; // наилучший счет (изначально равен нулю)
ClassScoreManager ClassScoreManager = new ClassScoreManager(); // менеджер счета
public List<enemy> Enemies = new List<enemy>(); // привидения
public List<enemy> BadEnemies = new List<enemy>(); // желтые шестеренки
// инициализация класса
public GameProcess()
{
IsWin = false; // победы не было
IsLose = false; // поражения не было
IsGame = false; // игровой процесс еще не идет
IsGame = false; // пауза не включена
// установка рекорда
ClassScoreManager = ClassScoreManager.ReadScores();
MaxScore = ClassScoreManager.Score.Value;
// добавление врагов
Enemies.Add(new Enemy(100, 300));
Enemies.Add(new Enemy(500, 400));
Enemies.Add(new Enemy(300, 400));
Enemies.Add(new Enemy(200, 350));
Enemies.Add(new Enemy(600, 100));
Enemies.Add(new Enemy(150, 200));
Enemies.Add(new Enemy(400, 150));
// добавление шестеренок
BadEnemies.Add(new Enemy(200, 500));
BadEnemies.Add(new Enemy(610, 200));
BadEnemies.Add(new Enemy(200, 510));
BadEnemies.Add(new Enemy(500, 350));
BadEnemies.Add(new Enemy(100, 420));
}
// установка новой игры (подразумевает отрисовку начального экрана)
public void NewGame()
{
IsWin = false;
IsLose = false;
IsGame = false;
ClassScoreManager.ReadScores();
}
// установка победы
public void WinGame()
{
IsWin = true;
IsLose = false;
IsGame = false;
ClassScoreManager.Score.Value = Score;
ClassScoreManager.WriteScores();
}
// установка поражения
public void LoseGame()
{
IsWin = false;
IsLose = true;
IsGame = false;
}
}
}
</enemy></enemy></enemy></enemy>
public PacManGame()
{
// инициализация графики
Graphics = new GraphicsDeviceManager(this);
var metric = new Android.Util.DisplayMetrics();
Activity.WindowManager.DefaultDisplay.GetMetrics(metric);
// установка параметров экрана
Graphics.IsFullScreen = true;
Graphics.PreferredBackBufferWidth = metric.WidthPixels;
Graphics.PreferredBackBufferHeight = metric.HeightPixels;
CurrentWidth = Graphics.PreferredBackBufferWidth;
CurrentHeigth = Graphics.PreferredBackBufferHeight;
Graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;
// обновить параметры экрана
UpdateScreenAttributies();
// дальнейшие действия
...
}
// обновление параметров экрана
public void UpdateScreenAttributies()
{
Dx = (float) CurrentWidth/NominalWidth;
Dy = (float) CurrentHeigth/NominalHeight;
NominalHeightCounted = CurrentHeigth/Dx;
NominalWidthCounted = CurrentWidth/Dx;
int check = Math.Abs(CurrentHeigth - CurrentWidth/16*9);
if (check > 10)
deltaY = (float) check/2; // недостающее расстояние до 16:9 по п оси Y (в абсолютных координатах)
deltaY_1 = -(CurrentWidth/16*10 - CurrentWidth/16*9)/2f;
YTopBorder = -deltaY/Dx; // координата точки в левом верхнем углу (в вируальных координатах)
YBottomBorder = NominalHeight + (180); // координата точки в нижнем верхнем углу (в виртуальных координатах)
}
// коррекция координаты X
public static float AbsoluteX(float x)
{
return x*Dx;
}
// коррекция координаты Y
public static float AbsoluteY(float y)
{
return y*Dx + deltaY;
}
// отрисовка визуальных объектов (выполняется в каждый конкретный момент времени)
protected override void Draw(GameTime gameTime)
{
/* Задача данного метода - отрисовывать графически объекты.
То есть: меню, надписи, текстуры игры, объекты интерфейса и т.п. */
GraphicsDevice.Clear (Color.AliceBlue); // заполнить фон
// установить последовательный порядок отрисовки объектов
SpriteBatch.Begin (SpriteSortMode.Deferred, BlendState.NonPremultiplied);
// отрисовка всего необходимого
...
// к примеру - текстура фона
SpriteBatch.Draw (TextureBackground, new Vector2 (AbsoluteX (0), AbsoluteY (0)),
new Rectangle (0, 0, TextureBackground.Width, TextureBackground.Height), Color.White,
0, new Vector2 (0, 0), 1 * Dx, SpriteEffects.None, 0); // отрисовка фона
// обязательно используем AbsoluteX, AbsoluteY и 1*Dx (то есть просто Dx;
// 2 * Dx - значит дополнительное увеличение в 2 раза) в поле Scale
...
// отрисовка рамок
DrawRectangle (new Rectangle (-100, -100, CurrentWidth + 100 + 100, 100 + (int)deltaY),Color.Black);
DrawRectangle (new Rectangle (-100, CurrentHeigth - (int)deltaY, CurrentWidth + 100 + 100,
(int)deltaY + (int)deltaY_1 + 100), Color.Black);
}
SpriteBatch.End (); // прервать отрисовку на данном этапе
base.Draw (gameTime); // обновить счетчик игрового времени
}
// отрисовка прямоугольника (по заданым координатам, с заданным цветом)
public void DrawRectangle(Rectangle coords, Color color)
{
var rect = new Texture2D(GraphicsDevice, 1, 1);
rect.SetData(new[] {color});
SpriteBatch.Draw(rect, coords, color);
}
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input.Touch;
namespace pacmangame
{
partial class PacManGame : Game
{
public class Button
{
public int YUp;
public int YDown;
public int XRight;
public int XLeft;
public Texture2D TextureButton;
public Texture2D TextureButtonLight;
private TouchCollection Touches;
private bool IsPressed;
public bool IsEnabled;
public Button()
{
XRight = -100;
XLeft = -100;
YUp = -100;
YDown = -100;
IsPressed = false;
IsEnabled = false;
}
public void Update(int xLeft, int yUp)
{
XRight = XLeft+TextureButton.Width;
XLeft = xLeft;
YUp = yUp;
YDown = yUp + TextureButton.Height;
}
public void Process(SpriteBatch spriteBatch)
{
Touches = TouchPanel.GetState();
if (Touches.Count == 1)
{
if (!IsPressed)
{
spriteBatch.Draw(TextureButton, new Vector2(AbsoluteX(XLeft), AbsoluteY(YUp)),
new Rectangle(0, 0, TextureButton.Width, TextureButton.Height), Color.White, 0,
new Vector2(0, 0),
Dx, SpriteEffects.None, 0);
}
if ((Touches[0].Position.X > AbsoluteX(XLeft)) && (Touches[0].Position.X AbsoluteX(YUp)) && (Touches[0].Position.Y
ButtonPause.Process (SpriteBatch); // отрисовка кнопки
ButtonPause.Update (830, 484); // выполнение всех проверок, связанных с кнопкой (нажата/не нажата и т.п.)
if (ButtonPause.IsEnabled) // кнопка была нажата и отпущена
{
ButtonPause.Reset (); // обнулить все настройки кнопки
GameProcess.IsPause = true; // выполнить необходимое действие - установить паузу
// другие возможные действия, к которым приводит нажатие кнопки ....
}
ButtonVisitSite.Process(SpriteBatch); // отрисовка кнопки
ButtonVisitSite.Update(741, 475); // выполнение всех проверок, связанных с кнопкой (нажата/не нажата и т.п.)
if (ButtonVisitSite.IsEnabled) // кнопка была нажата и отпущена
{
ButtonVisitSite.Reset(); // обнулить все настройки кнопки
// открыть браузер и нужную страницу
var uri = Android.Net.Uri.Parse("http://адрес");
var intent = new Intent(Intent.ActionView, uri);
Activity.StartActivity(intent);
}
// текстуры
public Texture2D TextureBackground; // фон
public Texture2D TextureBorder; // граница фона
public Texture2D TextureBackgroundLose; // фон меню поражения
public Texture2D TextureBackgroundWin; // фон меню победы
public Texture2D TextureBackgroundLoad; // фон меню загрузки
public Texture2D TexturePlayer; // игрок
public Texture2D TexturePlayerBack; // игрок (отраженный)
public Texture2D TextureTarget; // цель
public Texture2D TextureTargetBad; // шестеренка
public Texture2D TextureCross; // счетчик жизней
public Texture2D Splash; // загрузочный экран
public SpriteFont Font; // шрифт
// кнопки
public Button ButtonUp = new Button();
public Button ButtonDown = new Button();
public Button ButtonRight = new Button();
public Button ButtonLeft = new Button();
public Button ButtonReplay = new Button();
public Button ButtonNewGame = new Button();
public Button ButtonPause = new Button();
public Button ButtonResumeGame = new Button();
public Button ButtonStartNewGame = new Button();
public Button ButtonExit = new Button();
public Button ButtonVisitSite = new Button();
public bool SplashShown = true;
public bool SplashHide = false;
// загрузка контента
protected override void LoadContent()
{
SpriteBatch = new SpriteBatch(GraphicsDevice); // инициализация графики и загрузка текстур
Content.RootDirectory = "Content/"+Language;
Splash = Content.Load<texture2d>(Language+"_"+"splash");
}
</texture2d>
if (SplashShown)
{
// действия, если показан загрузочный экран
if (SplashHide)
{
LoadData(Language); // загрузка данных (основных игровых текстур)
// выключить загрузочный экран
SplashShown = false;
SplashHide = true;
}
else
{
SplashHide = true;
}
// отрисовать загрузочный экран
SpriteBatch.Draw(Splash, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, Splash.Width, Splash.Height),
Color.White, 0,
new Vector2(0, 0), Dx, SpriteEffects.None, 0);
}
else
{
// действия при обычной игре
...
}
public void LoadData(string locale)
{
Content.RootDirectory = "Content/";
TextureBackground = Content.Load<texture2d>("background_game");
TextureBorder = Content.Load<texture2d>("border");
TextureBackgroundLose = Content.Load<texture2d>("background_lose");
TextureBackgroundWin = Content.Load<texture2d>("background_win");
TexturePlayer = Content.Load<texture2d>("pacman");
TexturePlayerBack = Content.Load<texture2d>("pacman_back");
TextureTarget = Content.Load<texture2d>("target");
TextureTargetBad = Content.Load<texture2d>("target_bad");
TextureCross = Content.Load<texture2d>("cross");
Font = Content.Load<spritefont>("Font");
ButtonUp.TextureButton = Content.Load<texture2d>("ButtonUp");
ButtonUp.TextureButtonLight = Content.Load<texture2d>("ButtonUpPressed");
ButtonDown.TextureButton = Content.Load<texture2d>("ButtonDown");
ButtonDown.TextureButtonLight = Content.Load<texture2d>("ButtonDownPressed");
ButtonLeft.TextureButton = Content.Load<texture2d>("ButtonLeft");
ButtonLeft.TextureButtonLight = Content.Load<texture2d>("ButtonLeftPressed");
ButtonRight.TextureButton = Content.Load<texture2d>("ButtonRight");
ButtonRight.TextureButtonLight = Content.Load<texture2d>("ButtonRightPressed");
ButtonVisitSite.TextureButton = Content.Load<texture2d>("ButtonSite");
ButtonVisitSite.TextureButtonLight = Content.Load<texture2d>("ButtonSitePressed");
Content.RootDirectory = "Content/" + locale;
TextureBackgroundLoad = Content.Load<texture2d>(locale + "_" + "LoadingScreen");
ButtonReplay.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonPlayAgain");
ButtonReplay.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonPlayAgainPressed");
ButtonNewGame.TextureButton = Content.Load<texture2d>(locale + "_" + "StartGame");
ButtonNewGame.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "StartGamePressed");
ButtonPause.TextureButton = Content.Load<texture2d>(locale + "_" + "PauseButton");
ButtonPause.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "PauseButtonPressed");
ButtonResumeGame.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonResume");
ButtonResumeGame.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonResumePressed");
ButtonStartNewGame.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonNewGame");
ButtonStartNewGame.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonNewGamePressed");
ButtonExit.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonExit");
ButtonExit.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonExitPressed");
}
</texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></spritefont></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d>
string strlocale = Locale.Default.ToString();
strlocale = strlocale.Substring(0, 2);
if (strlocale.Equals("ru") || strlocale.Equals("be") || strlocale.Equals("uk") || strlocale.Equals("sr") ||
strlocale.Equals("kz"))
{
Language = "ru";
strScore = "Счет: ";
strRecord = "Рекорд: ";
strScoreAmount = "Число очков: ";
strRecordString = "Рекорд ";
strRecordNotReached = " не был побит.";
strPacmanInjured = "Pacman был ранен о границы поля...";
strNewRecord = "Поставлен рекорд ";
}
else
{
Language = "en";
strScore = "Score: ";
strRecord = "Record: ";
strScoreAmount = "Reached score: ";
strRecordString = "Record ";
strRecordNotReached = " was not reached.";
strPacmanInjured = "Pacman was injured by field border...";
strNewRecord = "New record reached: ";
}
using System;
using System.Globalization;
using Android.Content;
using Java.Util;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace pacmangame
{
/* Основной класс "игра". Содержит все визуальные объекты и методы обработки игрового процесса. */
partial class PacManGame : Game
{
// системные объекты графики
private readonly GraphicsDeviceManager Graphics;
private SpriteBatch SpriteBatch;
// текстуры
private Texture2D TextureBackground; // фон
private Texture2D TextureBorder; // фон
private Texture2D TextureBackgroundLose; // фон меню поражения
private Texture2D TextureBackgroundWin; // фон меню победы
private Texture2D TextureBackgroundLoad; // фон меню загрузки
private Texture2D TexturePlayer; // игрок
private Texture2D TexturePlayerBack; // игрок (отраженный)
private Texture2D TextureTarget; // цель
private Texture2D TextureTargetBad; // шестеренка
private Texture2D TextureCross; // счетчик жизней
private SpriteFont Font;
// кнопки
public Button ButtonUp = new Button();
public Button ButtonDown = new Button();
public Button ButtonRight = new Button();
public Button ButtonLeft = new Button();
public Button ButtonReplay = new Button();
public Button ButtonNewGame = new Button();
public Button ButtonPause = new Button();
public Button ButtonResumeGame = new Button();
public Button ButtonStartNewGame = new Button();
public Button ButtonExit = new Button();
public Button ButtonVisitSite = new Button();
// используемые объекты
private Player Player; // игрок (объект)
private GameProcess GameProcess = new GameProcess(); // игровой процесс (объект)
// настройки отрисовки
public static float Dx = 1f;
public static float Dy = 1f;
private static int NominalWidth = 960;
private static int NominalHeight = 540;
private static float NominalWidthCounted;
private static float NominalHeightCounted;
private static int CurrentWidth;
private static int CurrentHeigth;
private static float deltaY = 0;
private static float deltaY_1 = 0;
public static float YTopBorder;
public static float YBottomBorder;
// строки
public string Language = "en";
public string strScore = "";
public string strRecord = "";
public string strScoreAmount = "";
public string strRecordString = "";
public string strRecordNotReached = "";
public string strPacmanInjured = "";
public string strNewRecord = "";
// загрузочный экран
public Texture2D Splash;
public bool SplashShown = true;
public bool SplashHide = false;
// обновление параметров экрана
public void UpdateScreenAttributies()
{
Dx = (float) CurrentWidth/NominalWidth;
Dy = (float) CurrentHeigth/NominalHeight;
NominalHeightCounted = CurrentHeigth/Dx;
NominalWidthCounted = CurrentWidth/Dx;
int check = Math.Abs(CurrentHeigth - CurrentWidth/16*9);
if (check > 10)
deltaY = (float) check/2; // недостающее расстояние до 16:9 по п оси Y (в абсолютных координатах)
deltaY_1 = -(CurrentWidth/16*10 - CurrentWidth/16*9)/2f;
YTopBorder = -deltaY/Dx; // координата точки в левом верхнем углу (в вируальных координатах)
YBottomBorder = NominalHeight + (180); // координата точки в нижнем верхнем углу (в виртуальных координатах)
}
public void DrawRectangle(Rectangle coords, Color color)
{
var rect = new Texture2D(GraphicsDevice, 1, 1);
rect.SetData(new[] {color});
SpriteBatch.Draw(rect, coords, color);
}
// калибровка координаты X
public static float AbsoluteX(float x)
{
return x*Dx;
}
// калибровка координаты Y
public static float AbsoluteY(float y)
{
return y*Dx + deltaY;
}
// инициализация класса "игра"
public PacManGame()
{
// инициализация графики
Graphics = new GraphicsDeviceManager(this);
var metric = new Android.Util.DisplayMetrics();
Activity.WindowManager.DefaultDisplay.GetMetrics(metric);
// установка параметров экрана
Graphics.IsFullScreen = true;
Graphics.PreferredBackBufferWidth = metric.WidthPixels;
Graphics.PreferredBackBufferHeight = metric.HeightPixels;
CurrentWidth = Graphics.PreferredBackBufferWidth;
CurrentHeigth = Graphics.PreferredBackBufferHeight;
Graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;
UpdateScreenAttributies();
string strlocale = Locale.Default.ToString();
strlocale = strlocale.Substring(0, 2);
if (strlocale.Equals("ru") || strlocale.Equals("be") || strlocale.Equals("uk") || strlocale.Equals("sr") ||
strlocale.Equals("kz"))
{
Language = "ru";
strScore = "Счет: ";
strRecord = "Рекорд: ";
strScoreAmount = "Число очков: ";
strRecordString = "Рекорд ";
strRecordNotReached = " не был побит.";
strPacmanInjured = "Pacman был ранен о границы поля...";
strNewRecord = "Поставлен рекорд ";
}
else
{
Language = "en";
strScore = "Score: ";
strRecord = "Record: ";
strScoreAmount = "Reached score: ";
strRecordString = "Record ";
strRecordNotReached = " was not reached.";
strPacmanInjured = "Pacman was injured by field border...";
strNewRecord = "New record reached: ";
}
var locale = new Locale(Language); // languageIso is locale string
Locale.Default = locale;
var config = new Android.Content.Res.Configuration {Locale = locale};
Activity.Resources.UpdateConfiguration(config, Activity.Resources.DisplayMetrics);
}
// загрузка контента
protected override void LoadContent()
{
SpriteBatch = new SpriteBatch(GraphicsDevice); // инициализация графики и загрузка текстур
Content.RootDirectory = "Content/" + Language;
Splash = Content.Load<texture2d>(Language + "_" + "splash");
}
public void LoadData(string locale)
{
Content.RootDirectory = "Content/";
TextureBackground = Content.Load<texture2d>("background_game");
TextureBorder = Content.Load<texture2d>("border");
TextureBackgroundLose = Content.Load<texture2d>("background_lose");
TextureBackgroundWin = Content.Load<texture2d>("background_win");
TexturePlayer = Content.Load<texture2d>("pacman");
TexturePlayerBack = Content.Load<texture2d>("pacman_back");
TextureTarget = Content.Load<texture2d>("target");
TextureTargetBad = Content.Load<texture2d>("target_bad");
TextureCross = Content.Load<texture2d>("cross");
Font = Content.Load<spritefont>("Font");
ButtonUp.TextureButton = Content.Load<texture2d>("ButtonUp");
ButtonUp.TextureButtonLight = Content.Load<texture2d>("ButtonUpPressed");
ButtonDown.TextureButton = Content.Load<texture2d>("ButtonDown");
ButtonDown.TextureButtonLight = Content.Load<texture2d>("ButtonDownPressed");
ButtonLeft.TextureButton = Content.Load<texture2d>("ButtonLeft");
ButtonLeft.TextureButtonLight = Content.Load<texture2d>("ButtonLeftPressed");
ButtonRight.TextureButton = Content.Load<texture2d>("ButtonRight");
ButtonRight.TextureButtonLight = Content.Load<texture2d>("ButtonRightPressed");
ButtonVisitSite.TextureButton = Content.Load<texture2d>("ButtonSite");
ButtonVisitSite.TextureButtonLight = Content.Load<texture2d>("ButtonSitePressed");
Content.RootDirectory = "Content/" + locale;
TextureBackgroundLoad = Content.Load<texture2d>(locale + "_" + "LoadingScreen");
ButtonReplay.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonPlayAgain");
ButtonReplay.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonPlayAgainPressed");
ButtonNewGame.TextureButton = Content.Load<texture2d>(locale + "_" + "StartGame");
ButtonNewGame.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "StartGamePressed");
ButtonPause.TextureButton = Content.Load<texture2d>(locale + "_" + "PauseButton");
ButtonPause.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "PauseButtonPressed");
ButtonResumeGame.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonResume");
ButtonResumeGame.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonResumePressed");
ButtonStartNewGame.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonNewGame");
ButtonStartNewGame.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonNewGamePressed");
ButtonExit.TextureButton = Content.Load<texture2d>(locale + "_" + "ButtonExit");
ButtonExit.TextureButtonLight = Content.Load<texture2d>(locale + "_" + "ButtonExitPressed");
}
// обновление игрового процесса (выполняется в каждый момент времени)
protected override void Update(GameTime gameTime)
{
base.Update(gameTime); // обновить счетчик игрового времени
// обработка нажатия кнопки "назад"
if (GameProcess.IsGame)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) GameProcess.IsPause = true;
}
if (GameProcess.IsPause)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) GameProcess.IsPause = false;
}
}
// отрисовка визуальных объектов (выполняется в каждый конкретный момент времени)
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.AliceBlue); // заполнить фон
SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied); // установить последовательный порядок отрисовки объектов
if (SplashShown)
{
if (SplashHide)
{
LoadData(Language); // загрузка данных (текстур, звуков, шрифта)
SplashShown = false;
SplashHide = true;
}
else
{
SplashHide = true;
}
SpriteBatch.Draw(Splash, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, Splash.Width, Splash.Height),
Color.White, 0,
new Vector2(0, 0), Dx, SpriteEffects.None, 0);
}
else
{
if (GameProcess.IsGame)
{
// если происходит игровой процесс - отрисовка игрового процесса
if (!GameProcess.IsPause)
{
// если пауза выключена
SpriteBatch.Draw(TextureBackground, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, TextureBackground.Width, TextureBackground.Height),
Color.White,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0); // отрисовка фона
foreach (var enemy in GameProcess.Enemies)
{
// отрисовка целей
SpriteBatch.Draw(TextureTarget,
new Vector2(AbsoluteX(enemy.Screenpos.X), AbsoluteY(enemy.Screenpos.Y)),
new Rectangle(0, 0, TextureTarget.Width, TextureTarget.Height), Color.White,
0, new Vector2(TextureTarget.Width/2f, TextureTarget.Height/2f), 1*Dx,
SpriteEffects.None, 0);
}
// отрисовка игрока
if (Player.Direction == 2)
SpriteBatch.Draw(TexturePlayerBack, new Vector2(AbsoluteX(Player.X), AbsoluteY(Player.Y)),
new Rectangle(0, 0, TexturePlayerBack.Width, TexturePlayerBack.Height),
Color.White,
Player.Angle,
new Vector2(TexturePlayerBack.Width/2f, TexturePlayerBack.Height/2f), 1*Dx,
SpriteEffects.None, 0);
// отраженный вариант (движени влево)
else
SpriteBatch.Draw(TexturePlayer, new Vector2(AbsoluteX(Player.X), AbsoluteY(Player.Y)),
new Rectangle(0, 0, TexturePlayer.Width, TexturePlayer.Height), Color.White,
Player.Angle,
new Vector2(TexturePlayerBack.Width/2f, TexturePlayerBack.Height/2f), 1*Dx,
SpriteEffects.None, 0);
// обычный вариант (вправо/вверх/вниз)
foreach (var badenemy in GameProcess.BadEnemies)
{
SpriteBatch.Draw(TextureTargetBad,
new Vector2(AbsoluteX(badenemy.Screenpos.X),
AbsoluteY(badenemy.Screenpos.Y)),
new Rectangle(0, 0, TextureTargetBad.Width, TextureTargetBad.Height),
Color.White,
badenemy.Rotation, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
}
// отрисовка колючек по краям экрана
SpriteBatch.Draw(TextureBorder, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, TextureBorder.Width, TextureBorder.Height), Color.White,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
// отрисовка числа очков
SpriteBatch.DrawString(Font,
strRecord + GameProcess.MaxScore.ToString(CultureInfo.InvariantCulture),
new Vector2(20, 60),
Color.White, 0, new Vector2(0, 0), 0.8f*Dx, SpriteEffects.None, 0);
SpriteBatch.DrawString(Font,
strScoreAmount + GameProcess.Score.ToString(CultureInfo.InvariantCulture),
new Vector2(20, 10),
GameProcess.Score = 1 ? Color.White : Color.Red,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
SpriteBatch.Draw(TextureCross, new Vector2(AbsoluteX(743), AbsoluteY(15)),
new Rectangle(0, 0, TextureCross.Width, TextureCross.Height),
Player.Lives >= 2 ? Color.White : Color.Red,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
SpriteBatch.Draw(TextureCross, new Vector2(AbsoluteX(793), AbsoluteY(15)),
new Rectangle(0, 0, TextureCross.Width, TextureCross.Height),
Player.Lives >= 3 ? Color.White : Color.Red,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
SpriteBatch.Draw(TextureCross, new Vector2(AbsoluteX(845), AbsoluteY(15)),
new Rectangle(0, 0, TextureCross.Width, TextureCross.Height),
Player.Lives >= 4 ? Color.White : Color.Red,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
SpriteBatch.Draw(TextureCross, new Vector2(AbsoluteX(896), AbsoluteY(15)),
new Rectangle(0, 0, TextureCross.Width, TextureCross.Height),
Player.Lives >= 5 ? Color.White : Color.Red,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
// обработка действий целей ("false" означает, что ускорение выключено)
foreach (var enemy in GameProcess.Enemies)
enemy.Process(false, gameTime);
// обработка действий шестеренок ("true" означает, что включено ускорение)
foreach (var badenemy in GameProcess.BadEnemies)
badenemy.Process(true, gameTime);
Player.Process(gameTime); // обработка движения игрока
Player.WorkWithTarget(); // обработка работы с целями
// обработка управления движением
// вверх
ButtonUp.Process(SpriteBatch);
ButtonUp.Update(90, 205);
if (ButtonUp.IsEnabled)
{
ButtonUp.Reset();
Player.Direction = 3;
}
// вниз
ButtonDown.Process(SpriteBatch);
ButtonDown.Update(90, 430);
if (ButtonDown.IsEnabled)
{
ButtonDown.Reset();
Player.Direction = 4;
}
// влево
ButtonLeft.Process(SpriteBatch);
ButtonLeft.Update(18, 312);
if (ButtonLeft.IsEnabled)
{
ButtonLeft.Reset();
Player.Direction = 2;
}
// вправо
ButtonRight.Process(SpriteBatch);
ButtonRight.Update(175, 312);
if (ButtonRight.IsEnabled)
{
Player.Direction = 1;
ButtonRight.Reset();
}
// пауза
ButtonPause.Process(SpriteBatch);
ButtonPause.Update(830, 484);
if (ButtonPause.IsEnabled)
{
ButtonPause.Reset();
GameProcess.IsPause = true;
}
}
else
{
// если пауза включена
SpriteBatch.Draw(TextureBackgroundLoad, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, TextureBackgroundLoad.Width, TextureBackgroundLoad.Height),
Color.White,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
SpriteBatch.DrawString(Font,
"Пауза",
new Vector2(AbsoluteX(420), AbsoluteY(1175)),
Color.White, 0, new Vector2(0, 0), 1.5f*Dx, SpriteEffects.None, 0);
// продолжить
ButtonResumeGame.Process(SpriteBatch);
ButtonResumeGame.Update(328, 351);
if (ButtonResumeGame.IsEnabled)
{
ButtonResumeGame.Reset();
GameProcess.IsPause = false;
}
// начать новую игру
ButtonStartNewGame.Process(SpriteBatch);
ButtonStartNewGame.Update(320, 420);
if (ButtonStartNewGame.IsEnabled)
{
ButtonStartNewGame.Reset();
GameProcess = new GameProcess();
GameProcess.IsGame = true;
Player = new Player(GameProcess);
}
// выход
ButtonExit.Process(SpriteBatch);
ButtonExit.Update(320, 483);
if (ButtonExit.IsEnabled)
{
ButtonExit.Reset();
Exit();
}
// посетить сайт
ButtonVisitSite.Process(SpriteBatch);
ButtonVisitSite.Update(741, 475);
if (ButtonVisitSite.IsEnabled)
{
ButtonVisitSite.Reset();
var uri = Android.Net.Uri.Parse("http://www.dageron.com/?cat=146");
var intent = new Intent(Intent.ActionView, uri);
Activity.StartActivity(intent);
}
}
}
else
{
if (GameProcess.IsLose)
{
// отрисовка меню поражения
SpriteBatch.Draw(TextureBackgroundLose, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, TextureBackgroundLose.Width, TextureBackgroundLose.Height),
Color.White,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
SpriteBatch.DrawString(Font,
strRecordString +
GameProcess.MaxScore.ToString(CultureInfo.InvariantCulture) +
strRecordNotReached,
new Vector2(AbsoluteX(350), AbsoluteY(252)),
Color.White, 0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
if (Player.Lives == 5)
SpriteBatch.DrawString(Font, strPacmanInjured,
new Vector2(AbsoluteX(258), AbsoluteY(278)),
Color.White, 0, new Vector2(0, 0), 1.2f*Dx, SpriteEffects.None, 0);
// сыграть заново
ButtonReplay.Process(SpriteBatch);
ButtonReplay.Update(330, 355);
if (ButtonReplay.IsEnabled)
{
ButtonReplay.Reset();
GameProcess = new GameProcess();
GameProcess.IsGame = true;
Player = new Player(GameProcess);
}
}
else
{
if (GameProcess.IsWin)
{
// отрисовка меню победы
SpriteBatch.Draw(TextureBackgroundWin, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, TextureBackgroundWin.Width, TextureBackgroundWin.Height),
Color.White,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
SpriteBatch.DrawString(Font,
strNewRecord +
GameProcess.Score.ToString(CultureInfo.InvariantCulture) + "!",
new Vector2(AbsoluteX(350), AbsoluteY(252)),
Color.White, 0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
// начать новую игру
ButtonStartNewGame.Process(SpriteBatch);
ButtonStartNewGame.Update(320, 320);
if (ButtonStartNewGame.IsEnabled)
{
ButtonStartNewGame.Reset();
GameProcess = new GameProcess();
GameProcess.IsGame = true;
Player = new Player(GameProcess);
}
// выйти
ButtonExit.Process(SpriteBatch);
ButtonExit.Update(332, 395);
if (ButtonExit.IsEnabled)
{
ButtonExit.Reset();
Exit();
}
// посетить сайт
ButtonVisitSite.Process(SpriteBatch);
ButtonVisitSite.Update(380, 180);
if (ButtonVisitSite.IsEnabled)
{
ButtonVisitSite.Reset();
var uri = Android.Net.Uri.Parse("http://www.dageron.com/?cat=146");
var intent = new Intent(Intent.ActionView, uri);
Activity.StartActivity(intent);
}
}
else
{
// отрисовать стартовый экран игры
SpriteBatch.Draw(TextureBackgroundLoad, new Vector2(AbsoluteX(0), AbsoluteY(0)),
new Rectangle(0, 0, TextureBackgroundLoad.Width,
TextureBackgroundLoad.Height),
Color.White,
0, new Vector2(0, 0), 1*Dx, SpriteEffects.None, 0);
// начать новую игру
ButtonNewGame.Process(SpriteBatch);
ButtonNewGame.Update(330, 455);
if (ButtonNewGame.IsEnabled)
{
ButtonNewGame.Reset();
GameProcess = new GameProcess();
GameProcess.IsGame = true;
Player = new Player(GameProcess);
}
// посетить сайт
ButtonVisitSite.Process(SpriteBatch);
ButtonVisitSite.Update(741, 475);
if (ButtonVisitSite.IsEnabled)
{
ButtonVisitSite.Reset();
var uri = Android.Net.Uri.Parse("http://www.dageron.com/?cat=146");
var intent = new Intent(Intent.ActionView, uri);
Activity.StartActivity(intent);
}
}
}
}
// отрисовать рамки
DrawRectangle(
new Rectangle(-100, -100, CurrentWidth + 100 + 100, 100 + (int) deltaY),
Color.Black);
DrawRectangle(
new Rectangle(-100, CurrentHeigth - (int) deltaY, CurrentWidth + 100 + 100,
(int) deltaY + (int) deltaY_1 + 100), Color.Black);
}
SpriteBatch.End(); // прервать отрисовку на данном этапе
base.Draw(gameTime); // обновить счетчик игрового времени
}
}
}
</texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></spritefont></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d></texture2d>
// обновление игрового процесса (выполняется в каждый момент времени)
protected override void Update(GameTime gameTime)
{
base.Update(gameTime); // обновить счетчик игрового времени
// обработка нажатия кнопки "назад"
if (GameProcess.IsGame)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) GameProcess.IsPause = true;
}
if (GameProcess.IsPause)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) GameProcess.IsPause = false;
}
}
Если нажата кнопка «назад» во время игры, то включается пауза, если во время паузы, то происходит возвращение в игру.using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;
namespace pacmangame
{
[Serializable]
public class ClassScoreManager
{
// класс "счет"
[Serializable]
public class ScoreItem
{
public int Value = 0;
}
public ScoreItem Score;
// прочитать счет из файла
public ClassScoreManager ReadScores()
{
try
{
var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
var filePath = System.IO.Path.Combine(sdCardPath+"/Application/Dageron Studio", "dageron_angry_pacman.xml");
FileStream fStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
var myBinaryFormatter = new BinaryFormatter();
var mc = (ClassScoreManager) myBinaryFormatter.Deserialize(fStream);
fStream.Close();
return mc;
}
catch (Exception e)
{
Score = new ScoreItem ();
return this;
}
}
// записать счет в файл
public void WriteScores()
{
var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
if (!Directory.Exists(sdCardPath +"/Application")) Directory.CreateDirectory (sdCardPath +"/Application");
if (!Directory.Exists(sdCardPath +"/Application/Dageron Studio")) Directory.CreateDirectory (sdCardPath +"/Application/Dageron Studio");
var filePath = System.IO.Path.Combine(sdCardPath+"/Application/Dageron Studio", "dageron_angry_pacman.xml");
FileStream fStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
var myBinaryFormatter = new BinaryFormatter();
myBinaryFormatter.Serialize(fStream, this);
fStream.Close();
}
}
}
комментарии (14)