Лекция 7
Раздел 7.1
Windows Phone Темы раздела 3
Windows Phone XNA 4
Windows Phone XNA и Silverlight 5
Windows Phone Проект игры 6
Windows Phone Действия при запуске игры 7
Windows Phone Методы класса XNA Game partial class PongGame : Microsoft.Xna.Framework.Game { protected override void LoadContent (bool loadAllContent) { } protected override void Update(GameTime gameTime) { } protected override void Draw(GameTime gameTime) { } 8
Windows Phone Методы класса XNA Game 9
Windows Phone Загрузка игрового контента protected override void LoadContent() { // создание группы спрайтов, которая можно использовать // для отрисовки текстур spriteBatch = new SpriteBatch(GraphicsDevice); } 10
Windows Phone Загрузка игрового контента ballTexture = Content.Load ("WhiteDot"); 11
Windows Phone Хранение текстуры // игровой мир Texture2D ballTexture; 12
Windows Phone Загрузка текстуры в программу protected override void LoadContent() { // создание группы спрайтов, которая можно использовать // для отрисовки текстур spriteBatch = new SpriteBatch(GraphicsDevice); ballTexture = Content.Load ("WhiteDot"); } 13
Windows Phone Координаты и пиксели 14
Windows Phone Оси координат в XNA 15
Windows Phone Структура Rectangle Rectangle ballRectangle = new Rectangle( 0, 0, ballTexture.Width, ballTexture.Height), Color.White); 16
Windows Phone Метод Draw protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); base.Draw(gameTime); } 17
Windows Phone Группы спрайтов 18
Windows Phone Методы SpriteBatch Begin и End protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); // сюда нужно добавить код для отрисовки объектов spriteBatch.End(); base.Draw(gameTime); } 19
Windows Phone Метод SpriteBatch.Draw spriteBatch.Draw(ballTexture, ballRectangle, Color.White); 20
Windows Phone Настройка положения new Rectangle( 0, 0, ballTexture.Width, ballTexture.Height) new Rectangle( 0, 0, // положение 200,100) // размер new Rectangle( 50, 50, // положение 60, 60) // размер 21
Windows Phone Масштабирование изображения 22
Windows Phone Масштабируемая область ballRectangle = new Rectangle( 0, 0, GraphicsDevice.Viewport.Width / 20, GraphicsDevice.Viewport.Width / 20); 23
Windows Phone Метод Update protected override void Update(GameTime gameTime) { // сюда нужно добавить код для обновления изображения base.Update(gameTime); } 24
Windows Phone Пример метода Update protected override void Update(GameTime gameTime) { ballRectangle.X++; ballRectangle.Y++; base.Update(gameTime); } 25
Windows Phone Краткие итоги 26
Раздел 7.2
Windows Phone Темы раздела 28
Windows Phone Управление движением объекта float ballX = 0; float ballY = 0; ballRectangle.X = (int)(ballX + 0.5f); ballRectangle.Y = (int)(ballY + 0.5f); 29
Windows Phone Перемещение объекта ballX = ballX + ballXSpeed; ballY = ballY + ballYSpeed; 30
Windows Phone Выход за пределы экрана 31
Windows Phone Отскок от границ экрана if (ballX < 0 || ballX + ballRectangle.Width > GraphicsDevice.Viewport.Width) { ballXSpeed = -ballXSpeed; } 32
Windows Phone Игровые переменные // шар Texture2D ballTexture; Rectangle ballRectangle; float ballX; float ballY; float ballXSpeed = 3; float ballYSpeed = 3; // левая платформа Texture2D lPaddleTexture; Rectangle lPaddleRectangle; float lPaddleSpeed = 4; float lPaddleY; // правая платформа создаётся аналогично // расстояние от платформы до границы экрана int margin; 33
Windows Phone Загрузка игровых текстур protected override void LoadContent() { ballTexture = Content.Load ("ball"); lPaddleTexture = Content.Load ("lpaddle"); rPaddleTexture = Content.Load ("rpaddle"); } 34
Windows Phone Настройка платформ margin = GraphicsDevice.Viewport.Width / 20; lPaddleRectangle = new Rectangle( margin, 0, GraphicsDevice.Viewport.Width / 20, GraphicsDevice.Viewport.Height / 5); rPaddleRectangle = new Rectangle( GraphicsDevice.Viewport.Width – lPaddleRectangle.Width - margin, 0, GraphicsDevice.Viewport.Width / 20, GraphicsDevice.Viewport.Height / 5); 35
Windows Phone Управление платформой 36
Windows Phone Класс TouchPanel TouchCollection touches = TouchPanel.GetState(); 37
Windows Phone Информация о сенсорном вводе if (touches.Count > 0) { if (touches[0].Position.Y > GraphicsDevice.Viewport.Height / 2) { lPaddleY = lPaddleY + lPaddleSpeed; } else { lPaddleY = lPaddleY - lPaddleSpeed; } 38
Windows Phone Информация о сенсорном вводе if (touches.Count > 0) { if (touches[0].Position.Y > GraphicsDevice.Viewport.Height / 2) { lPaddleY = lPaddleY + lPaddleSpeed; } else { lPaddleY = lPaddleY - lPaddleSpeed; } 39
Windows Phone Информация о сенсорном вводе if (touches.Count > 0) { if (touches[0].Position.Y > GraphicsDevice.Viewport.Height / 2) { lPaddleY = lPaddleY + lPaddleSpeed; } else { lPaddleY = lPaddleY - lPaddleSpeed; } 40
Windows Phone Информация о сенсорном вводе if (touches.Count > 0) { if (touches[0].Position.Y > GraphicsDevice.Viewport.Height / 2) { lPaddleY = lPaddleY + lPaddleSpeed; } else { lPaddleY = lPaddleY - lPaddleSpeed; } 41
Windows Phone Информация о сенсорном вводе if (touches.Count > 0) { if (touches[0].Position.Y > GraphicsDevice.Viewport.Height / 2) { lPaddleY = lPaddleY + lPaddleSpeed; } else { lPaddleY = lPaddleY - lPaddleSpeed; } 42
Windows Phone Информация о сенсорном вводе if (touches.Count > 0) { if (touches[0].Position.Y > GraphicsDevice.Viewport.Height / 2) { lPaddleY = lPaddleY + lPaddleSpeed; } else { lPaddleY = lPaddleY - lPaddleSpeed; } 43
Windows Phone Обнаружение столкновений if (ballRectangle.Intersects(lPaddleRectangle)) { ballXSpeed = -ballXSpeed; } 44
Windows Phone Добавление шрифта 45
Windows Phone Загрузка шрифта SpriteFont font; protected override void LoadContent() { // остальная часть метода LoadContent font = Content.Load ("MessageFont"); } 46
Windows Phone Отрисовка текста protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); spriteBatch.DrawString( font, "Hello world", new Vector2(100, 100), Color.White); // остальная часть метода Draw } 47
Windows Phone Краткие итоги 48
Раздел 7.3
Windows Phone Темы раздела 50
Windows Phone Акселерометр 51
Windows Phone Акселерометр в XNA
Windows Phone Добавление библиотеки using Microsoft.Devices.Sensors; 53
Windows Phone Класс Accelerometer Accelerometer acc = new Accelerometer(); acc.ReadingChanged += new EventHandler (acc_ReadingChanged); acc.Start(); 54
Windows Phone Событие класса Accelerometer Vector3 accelState = Vector3.Zero; void acc_ReadingChanged (object sender, AccelerometerReadingEventArgs e) { accelState.X = (float)e.X; accelState.Y = (float)e.Y; accelState.Z = (float)e.Z; } 55
Windows Phone Акселерометр и ориентация 56
Windows Phone Эмуляция акселерометра 57
Windows Phone Многопоточность 58
Windows Phone Возможные проблемы 59
Windows Phone Добавление блокировки 60
Windows Phone Использование блокировки object accelLock = new object(); void acc_ReadingChanged (object sender, AccelerometerReadingEventArgs e) { lock (accelLock) { accelState.X = (float)e.X; accelState.Y = (float)e.Y; accelState.Z = (float)e.Z; } 61
Windows Phone Использование блокировки lock (accelLock) { lPaddleY = lPaddleY - (accelState.X * lPaddleSpeed); } 62
Windows Phone Использование звуков в XNA 63
Windows Phone Загрузка звуков // звуковые эффекты SoundEffect dingSound; SoundEffect explodeSound; protected override void LoadContent() { dingSound = Content.Load ("ding"); explodeSound = Content.Load ("explode"); } 64
Windows Phone Воспроизведение звука if (ballY GraphicsDevice.Viewport.Height) { ballYSpeed = -ballYSpeed; dingSound.Play(); } 65
Windows Phone Класс SoundEffectInstance engineInstance = engineSound.CreateInstance(); 66
Windows Phone Воспроизведение звука engineInstance.Play();... engineInstance.Pause();... engineInstance.Stop(); 67
Windows Phone Управление звуком engineInstance.Volume = accelVector.Length() / volFactor; engineInstance.Pitch = accelVector.Length() / soundFactor; engineInstance.Pan = 0; 68
Windows Phone Состояние воспроизведения if (engineInstance.State == SoundState.Stopped) { engineInstance.Play(); } 69
Windows Phone Воспроизведение звуковых эффектов в Silverlight 70
Windows Phone Добавление XNA в приложение Silverlight 71
Windows Phone Загрузка звуков 72 Beep = SoundEffect.FromStream( TitleContainer.OpenStream("Sounds/beep.wav"));
Windows Phone Воспроизведение звука 73 beep.Play();
Windows Phone Обновление XNA 74 DispatcherTimer timer = new DispatcherTimer(); timer.Tick += new EventHandler(timer_Tick); timer.Interval = TimeSpan.FromTicks(333333); timer.Start(); void timer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); }
Windows Phone Выбор разрешения экрана 75
Windows Phone Полноэкранный режим 76
Windows Phone Отмена блокировки экрана Guide.IsScreenSaverEnabled = false; 77
Windows Phone Краткие итоги 78
Раздел
Windows Phone Темы раздела 80
Windows Phone XNA и Silverlight 81
Windows Phone Комбинированное решение 82
Windows Phone Страница игры XNA 83
Windows Phone Переход на страницу игры private void Button_Click(object sender, RoutedEventArgs e) { NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative)); } 84
Windows Phone Страница игры protected override void OnNavigatedTo(NavigationEventArgs e) protected override void OnNavigatedFrom(NavigationEventArgs e) private void OnUpdate(object sender, GameTimerEventArgs e) private void OnDraw(object sender, GameTimerEventArgs e) 85
Windows Phone Элементы Silverlight в XNA 86
Windows Phone Добавление элементов Silverlight 87
Windows Phone Рендеринг элементов Silverlight UIElementRenderer elementRenderer; 88
Windows Phone Создание объекта для рендеринга if (null == elementRenderer) { elementRenderer = new UIElementRenderer(this, (int)ActualWidth, (int)ActualHeight); } 89
Windows Phone Рендеринг элементов Silverlight elementRenderer.Render();... spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White); 90
Windows Phone Краткие итоги 91