手把手教用XNA开发winphone7游戏(三)

XNA Game Studio 游戏循环

在这部分中您将重点两剩余部分的游戏 重写Update Draw 功能。有些大大可能看过相关微软的训练包,我这里主要是帮一些初学者。希望各位大大包含,毕竟文章发出来还是有工作量的。大家觉得有用就好,要是没有耽误时间给大家道个歉。(感谢http://winphone.us/)

1.       打开 BackgroundScreen.cs文件。

2.       重写基类Update 方法如下:

(Code Snippet – Game Development with XNA – Background Screen Update method)

C#

public override void Update(GameTime gameTime, bool otherScreenHasFocus,

                  bool coveredByOtherScreen)

{

   base.Update(gameTime, otherScreenHasFocus, false);

}

 

3.       重写基类方法绘制。 绘图方法将绘制图形设备上使用 Microsoft.Xna.Framewok.Graphics 命名空间中的 SpriteBatch 类。一组sprites被绘制的时候使用同样的设置。改变 Draw 方法来匹配下面的代码段:

(Code Snippet – Game Development with XNA – Background Screen Draw method)

C#

public override void Draw(GameTime gameTime)

{

   SpriteBatch spriteBatch = ScreenManager.SpriteBatch;

 

   // Make the menu slide into place during transitions, using a

   // power curve to make things look more interesting (this makes

   // the movement slow down as it nears the end).

   float transitionOffset =      (float)Math.Pow(TransitionPosition, 2);

 

   spriteBatch.Begin();

 

   // Draw Background

   spriteBatch.Draw(background, new Vector2(0, 0),

     new Color(255, 255, 255, TransitionAlpha));

 

   // Draw Title

   spriteBatch.Draw(title, new Vector2(60, 55),

     new Color(255, 255, 255, TransitionAlpha));

 

   spriteBatch.End();

}

 

4.       F5 编译并运行该应用程序。

图1

修改了updatae和Draw后的运行效果 

5.       停止调试 (SHIFT + F5),并返回到编辑应用程序。

6.       将一个附加类添加到应用程序并将其名称设置为 GameplayScreen

Note: 要创建一个新的类,在解决方案资源管理器中右键单击 AlienGame 项目并选择Add | Class.

 

7.       添加以下使用申明到新类:

(Code Snippet – Game Development with XNA – Gameplay Screen using statements )

C#

using AlienGameSample;

using Microsoft.Xna.Framework;

using Microsoft.Xna.Framework.Graphics;

using Microsoft.Xna.Framework.Audio;

using System.IO.IsolatedStorage;

using System.IO;

 

8.       GameScreen 派生

C#

class GameplayScreen : GameScreen

{

}

 

9.       添加以下类变量 (将在比赛中使用它们)。 后面我们使用这些变量,处理游戏逻辑、 用户输入和绘图:

(Code Snippet – Game Development with XNA – Gameplay Screen variables)

C#

//

// Game Play Members

//

Rectangle worldBounds;

bool gameOver;

int baseLevelKillCount;

int levelKillCount;

float alienSpawnTimer;

float alienSpawnRate;

float alienMaxAccuracy;

float alienSpeedMin;

float alienSpeedMax;

int alienScore;

int nextLife;

int hitStreak;

int highScore;

Random random;

 

//

// Rendering Members

//

Texture2D cloud1Texture;

Texture2D cloud2Texture;

Texture2D sunTexture;

Texture2D moonTexture;

Texture2D groundTexture;

Texture2D tankTexture;

Texture2D alienTexture;

Texture2D badguy_blue;

Texture2D badguy_red;

Texture2D badguy_green;

Texture2D badguy_orange;

Texture2D mountainsTexture;

Texture2D hillsTexture;

Texture2D bulletTexture;

Texture2D laserTexture;

 

SpriteFont scoreFont;

SpriteFont menuFont;

 

Vector2 cloud1Position;

Vector2 cloud2Position;

Vector2 sunPosition;

 

// Level changes, nighttime transitions, etc

float transitionFactor; // 0.0f == day, 1.0f == night

float transitionRate; // > 0.0f == day to night

 

ParticleSystem particles;

 

//

// Audio Members

//

SoundEffect alienFired;

SoundEffect alienDied;

SoundEffect playerFired;

SoundEffect playerDied;

 

//Screen dimension consts

const float screenHeight = 800.0f;

const float screenWidth = 480.0f;

const int leftOffset = 25;

const int topOffset = 50;

const int bottomOffset = 20;

 

10.   游戏类构造函数定义 (在游戏屏幕和其他屏幕在游戏中的) 之间的屏幕转换的速度和大小—— 在处理游戏的所有操作的地方。 添加此类构造函数,如下所示::

(Code Snippet – Game Development with XNA – Gameplay Screen Constructor)

C#

public GameplayScreen()

{

   random = new Random();

 

   worldBounds = new Rectangle(0, 0, (int)screenWidth, (int)screenHeight);

 

   gameOver = true;

 

   TransitionOnTime = TimeSpan.FromSeconds(0.0);

   TransitionOffTime = TimeSpan.FromSeconds(0.0);

}

 

11.   现在让我们来创建内容的加载和卸载功能。 重写基类的 LoadContent UnloadContent 的方法。

添加 LoadContent 代码段::

(Code Snippet – Game Development with XNA – Gameplay Screen LoadContent method)

C#

public override void LoadContent()

{

    cloud1Texture = ScreenManager.Game.Content.Load<Texture2D>("cloud1");

    cloud2Texture = ScreenManager.Game.Content.Load<Texture2D>("cloud2");

    sunTexture = ScreenManager.Game.Content.Load<Texture2D>("sun");

    moonTexture = ScreenManager.Game.Content.Load<Texture2D>("moon");

    groundTexture = ScreenManager.Game.Content.Load<Texture2D>("ground");

    tankTexture = ScreenManager.Game.Content.Load<Texture2D>("tank");

    mountainsTexture = ScreenManager.Game.Content.Load<Texture2D>("mountains_blurred");

    hillsTexture = ScreenManager.Game.Content.Load<Texture2D>("hills");

    alienTexture = ScreenManager.Game.Content.Load<Texture2D>("alien1");

    badguy_blue = ScreenManager.Game.Content.Load<Texture2D>("badguy_blue");

    badguy_red = ScreenManager.Game.Content.Load<Texture2D>("badguy_red");

    badguy_green = ScreenManager.Game.Content.Load<Texture2D>("badguy_green");

    badguy_orange = ScreenManager.Game.Content.Load<Texture2D>("badguy_orange");

    bulletTexture = ScreenManager.Game.Content.Load<Texture2D>("bullet");

    laserTexture = ScreenManager.Game.Content.Load<Texture2D>("laser");

    alienFired = ScreenManager.Game.Content.Load<SoundEffect>("Tank_Fire");

    alienDied = ScreenManager.Game.Content.Load<SoundEffect>("Alien_Hit");

    playerFired = ScreenManager.Game.Content.Load<SoundEffect>("Tank_Fire");

    playerDied = ScreenManager.Game.Content.Load<SoundEffect>("Player_Hit");

    scoreFont = ScreenManager.Game.Content.Load<SpriteFont>("ScoreFont");

    menuFont = ScreenManager.Game.Content.Load<SpriteFont>("MenuFont");

 

    cloud1Position = new Vector2(224 - cloud1Texture.Width, 32);

    cloud2Position = new Vector2(64, 80);

 

    sunPosition = new Vector2(16, 16);

 

    particles = new ParticleSystem(ScreenManager.Game.Content, ScreenManager.SpriteBatch);

 

    base.LoadContent();

}

 

12.   添加UnloadContent代码段:

(Code Snippet – Game Development with XNA – Gameplay Screen Unload method)

C#

public override void UnloadContent()

{

    particles = null;

 

    base.UnloadContent();

}

 

13.   重写基类Update功能:

Note: 我们将在做游戏逻辑的时候再来修改他。

(Code Snippet – Game Development with XNA – Gameplay Screen Update method)

C#

/// <summary>

/// Runs one frame of update for the game.

/// </summary>

/// <param name="gameTime">Provides a snapshot of timing values.</param>

public override void Update(GameTime gameTime,

bool otherScreenHasFocus, bool coveredByOtherScreen)

{

   float elapsed =  (float)gameTime.ElapsedGameTime.TotalSeconds;

 

   base.Update(gameTime, otherScreenHasFocus,    coveredByOtherScreen);

}

 

14.   重写基类绘图功能,当下的“游戏世界”是每秒30次。

(Code Snippet – Game Development with XNA – Gameplay Screen Draw region)

C#

/// <summary>

/// Draw the game world, effects, and HUD

/// </summary>

/// <param name="gameTime">The elapsed time since last Draw</param>

public override void Draw(GameTime gameTime)

{

   float elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds;

 

   ScreenManager.SpriteBatch.Begin();

 

   ScreenManager.SpriteBatch.End();

}

Note: The GameTime could be used to calculate the drawing locations of various game items.

 

15.   打开 MainMenuScreen.cs,找到 StartGameMenuEntrySelected 方法,现在是空的,我们将以下代码添加进去。 段代码的作用是当用户点击“START GAME”按钮时, GameplayScreen 添加到ScreenManager

(Code Snippet – Game Development with XNA – MainMenu Screen – GameMenuEntrySelected handler)

C#

void StartGameMenuEntrySelected(object sender, EventArgs e)

{

    ScreenManager.AddScreen(new GameplayScreen());

}

 

16.   编译并运行该应用程序。 单击"开始游戏"菜单项,可以看到主菜单从屏幕的下方滚动上来。

图2

运行效果 

Note: 现在游戏的场景你还看不到,不过不要紧,明天我们就开始了,加油!!

 

17.   停止调试并回到应用程序编辑状态。

 

在个章节,你创建了新的主游戏类,并重写了游戏基类的功能

 

转载于:https://www.cnblogs.com/zouyuntao/archive/2010/11/10/1874267.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的代码很好,不需要写注释

作者 | Sheetal 译者 | 弯月 责编 | 王晓曼 有时候&#xff0c;我们会写一些非常有创意的注释&#xff0c;而有些注释确实让人不得不佩服 程序员的想象力。看到下面这些注释&#xff0c;相信每个人都会捧腹大笑。【1】#想了解递归&#xff0c;请参见文件末尾 . .&#xff08;代…

陈潇冰php,webpack4.x入门到进阶

课程详情(本课程所涉及内容)1. webpack是什么?webpack的作用2. webpack的整体构成3. webpack-cli、package.json4. 开发环境(development)和生产环境(production)&#xff0c;npm安装包的方式&#xff0c;-D、-S5. 跑一跑webpack6. webpack.config.js配置总览7. 入口配置形式&…

SpringBoot开发案例之整合Spring-data-jpa

什么是spring-data 为了简化程序与数据库交互的代码&#xff0c;spring提供了一个现成的dao层框架&#xff0c;spring家族提供的spring-data适用于关系型数据库和nosql数据库 什么是jpa JPA全称为Java持久性API&#xff08;Java Persistence API&#xff09;&#xff0c;JPA是j…

细说路由器

介绍以太网交换机工作在第二层即数据链路层&#xff0c;用于在同一网络内部转发以太网帧。但是&#xff0c;当源和目的IP地址位于不同网络时&#xff0c;以太网帧必须发送给路由器。路由器负责在不同网络间传输报文&#xff0c;通过路由表来决定最佳转发路径。当主机将报文发送…

乔布斯,影响了一个时代的人

2011年10月5日&#xff0c;苹果公司的创始人史蒂夫乔布斯&#xff0c;因患胰腺神经内分泌肿瘤病逝&#xff0c;享年56岁&#xff0c;一代传奇人物&#xff0c;与世长辞乔布斯被认为是计算机业界与娱乐业界的标志性人物&#xff0c;同时人们也把他视作麦金塔计算机、iPod、iPhon…

C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)

ODB的组成部分: 1: 操作系统的ODB编译器 2: odb核心库libodb 3: 各种数据库的相关链接库 使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs.com/hul201610101100/p/9482311.html): lib库: odb-oracle-d.lib, odb-d.lib (由libodb-oracle-2.4.0编译成功后产生的l…

平均年薪60.8万,Linux开发拿下这个证书有多吃香?

互联网行业竞争一年比一年严峻&#xff0c;随着互联网的发展和进步&#xff0c;很多人都是想要进军到编程行业中去&#xff0c;作为工程师的我们唯有不停地学习&#xff0c;不断的提升自己才能保证自己的核心竞争力&#xff0c;打破内卷。从而拿到更好的薪水&#xff0c;进入心…

Linux新手必须掌握的命令(2)

一、输入输出重定向 输入重定向是指把文件导入到命令中&#xff0c;而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。 在日常的学习和工作中&#xff0c;相较于输入重定向&#xff0c;我们使用输出重定向的频率更高。 所以又将输出重定向分为了标准输出重定向…

极限编程与敏捷开发(4)

解决方案一&#xff1a; 下面图1是一种最简单的解决方案&#xff0c;Switch对象可以轮询真实开关的状态&#xff0c;并且可以发送相应的turnOn和turnOff消息给Light。 图1解决方案二&#xff1a; 上面这个设计违反了两个设计原则&#xff1a;依赖倒置原则(DIP)和开放封闭原则(O…

虚拟机四种网络连接模式比较

虚拟机一直用&#xff0c;但选择网络时的四种模式总是搞不清楚&#xff0c;只知道选择bridge最好用。为了能更深入了了解&#xff0c;查询了些资料&#xff0c;总结如下 第一种 NAT模式 Vhost访问网络的所有数据都是由主机提供的&#xff0c;vhost并不真实存在于网络中&#xf…

CPU加了缓存后,有人急了~

Hi&#xff0c;我是CPU一号车间的阿Q&#xff0c;还记得我吗&#xff0c;真是好久不见了&#xff5e;我所在的CPU是一个八核CPU&#xff0c;就有八个工作车间&#xff0c;那运行起来速度杠杆的&#xff5e;虚拟地址翻译一大早&#xff0c;我们一号车间MMU&#xff08;内存管理单…

redis -- 学习

redis 安装 就不细说了。 可以看这个 地址 https://www.cnblogs.com/feijl/p/6879929.html 配置完成之后 连接不上redis 如果报错守护模式 解决办法 1.修改redis配置 redis.conf 守护模式不启用 如下 2.第二种 启动redis后 设置密码 先查看是否设置了 config get requirepass…

一个学妹写的按键检测函数把我秀翻了!

摘要&#xff1a;今年实验室来了三个学妹&#xff0c;其中一个学妹以前是物联网专业的&#xff0c;进了实验室老师二话没说&#xff1a;先把STM32单片机过一遍上来第一个例程就是使用按键点亮一个LED灯&#xff0c;好家伙。点灯小师弟比较在行&#xff0c;毕竟32、FPGA、Linux的…

嵌入式行业需要什么样的技术人才?

关注「嵌入式大杂烩」&#xff0c;选择「星标公众号」一起进步&#xff01;来源 | 巧学模电数电单片机嵌入式行业需要什么样的技术人才&#xff1f;仔细观察各种招聘的岗位要求吧&#xff0c;无非是两方面。1&#xff09;通用要求比如什么学历&#xff0c;多少年工作经验&#…

消除VIM光标闪烁

2019独角兽企业重金招聘Python工程师标准>>> VIM光标闪烁比较影响人读代码的心情&#xff0c;消除光标闪烁&#xff0c;在配置文件中写下set gcra:block-blinkon0 保存并重启VIM 即可消除光标闪烁。 转载于:https://my.oschina.net/tonyyang/blog/10240

java异常个人理解

废话不说先贴图 所有的异常和错误都继承与Throwable类&#xff0c;它的下面又分为两大子类。 1.Error(uncheck) Error,错误。它是java程序中不被捕获的错误&#xff0c;并且总是不被控制。 例如&#xff1a;OutOfMemoryError 2.Exception(check) Exception,异常。所有的异常类都…

华为专家助你1个月拿下物联网高工认证,首次提供全方位就业指导!

物联网职业方向主要包括研究型岗位、研发型岗位、技术型岗位和技能型岗位4类&#xff1a;技能型岗位&#xff1a;工作内容主要是系统部署实施、运维管理等技术支持服务。技术型岗位&#xff1a;工作内容主要是负责物联网系统规划、设计、集成、技术咨询。研发型岗位&#xff1a…

php获取linux是几核的,linux下怎么查看机器cpu是几核的

linux下怎么查看机器cpu是几核的&#xff1f;linux下查看机器是cpu是几核的几个cpumore /proc/cpuinfo |grep "physical id"|uniq|wc -l每个cpu是几核(假设cpu配置相同)more /proc/cpuinfo |grep "physical id"|grep "0"|wc -lcat /proc/cpuinfo…

我的自学编程之路!

大家好&#xff0c;我是写代码的篮球球痴昨晚上打车回家&#xff0c;接我的滴滴司机是一个年纪比较大的大姐&#xff0c;她说她儿子毕业了&#xff0c;但是找不到好的工作&#xff0c;就报名参加了编程培训&#xff0c;培训费两万多。我就问&#xff0c;那谁给他学费&#xff0…

鹰眼拓扑锁定跟踪 网络管理一目了然

为什么要在网管软件中引入“鹰眼”的概念&#xff1f; 企业网管经常遇到的问题是&#xff1a;为什么业务人员访问生产系统&#xff08;例如ERP等&#xff09;速度非常慢&#xff0c;甚至无法访问&#xff1f;邮件系统无法使用&#xff1f;下载数据时总是无法连接&#xff…