XNA 4.0 学习指南(Learning XNA 4.0)样章 8.1_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > XNA 4.0 学习指南(Learning XNA 4.0)样章 8.1

XNA 4.0 学习指南(Learning XNA 4.0)样章 8.1

 2011/1/11 8:57:30  裴小星  http://xxing22657-yahoo-com-cn.javaeye.com  我要评论(0)
  • 摘要:第8章整合到目前为止,您已经构建了一套可靠的设计,并有了一个良好的开始,未来它可能变成一个相当酷的游戏。再次重申,游戏的主题是:让玩家控制一个精灵,尽量避免在追逐精灵飞过屏幕的时候碰到它们,并设法抓住躲避精灵。现在您需要增加一些得分规则和游戏逻辑,并做一些其它的微调来让您的游戏成为您希望的样子。在本章里,您需要做的第一件事情就是增加一些得分规则。当您编写一个游戏程序并着手研究得分规则时,第一步是去决定哪些事件会触发得分的变化。有时某种类型的武器击中了玩家,得分将发生变化。有时
  • 标签:学习

第8章 整合

?

  到目前为止,您已经构建了一套可靠的设计,并有了一个良好的开始,未来它可能变成一个相当酷的游戏。再次重申,游戏的主题是:让玩家控制一个精灵,尽量避免在追逐精灵飞过屏幕的时候碰到它们,并设法抓住躲避精灵。现在您需要增加一些得分规则和游戏逻辑,并做一些其它的微调来让您的游戏成为您希望的样子。
  在本章里,您需要做的第一件事情就是增加一些得分规则。当您编写一个游戏程序并着手研究得分规则时,第一步是去决定哪些事件会触发得分的变化。有时某种类型的武器击中了玩家,得分将发生变化。有时,玩家自己击中某些物体,或者玩家完成某些任务(即回答对某个问题、解决了一个难题,等等)时,您也会去改变得分。
在这个游戏中,当一个敌对的精灵离开屏幕而没有冲撞到玩家(意味着玩家成功地躲开了那个精灵)时,您将改变得分。
  由于这种得分机制,您需要为每一个敌方精灵设置分数。某些精灵可能比其它精灵值更多的分数,这取决于它们的速度或其它一些因素。
  除了决定如何计算分数,您还需要在屏幕上绘制得分。我们将会先解决这个问题,然后看看如何在一个敌方精灵穿越屏幕时调整得分。
  除了在游戏中增加得分计算和学习用SpriteFont类绘制文本之外,在本章中,您还将通过为每个类型的精灵引入不同的精灵位图和声音的方式为您的精灵增添一些变化。您还需要一张背景图片,研究游戏状态,以及在游戏中增加能力提升功能。

绘制2D文本

?

  本章是建立在您在第7章编写的代码的基础之上的。打开那个游戏项目,整章中都会使用到它。
  首先,您需要为Sprite基类声明一个整型变量来表示精灵的分数值(也请注意同时通过自动实现的属性添加公共访问方法):

public Sprite(Texture2D textureImage, Vector2 position, Point frameSize,
	int collisionOffset, Point currentFrame, Point sheetSize, Vector2 speed,
	string collisionCueName, int scoreValue)
	: this(textureImage, position, frameSize, collisionOffset, currentFrame,
	sheetSize, speed, defaultMillisecondsPerFrame, collisionCueName,
	scoreValue)
{
}

public Sprite(Texture2D textureImage, Vector2 position, Point frameSize,
	int collisionOffset, Point currentFrame, Point sheetSize, Vector2 speed,
	int millisecondsPerFrame, string collisionCueName, int scoreValue)
{
	this.textureImage = textureImage;
	this.position = position;
	this.frameSize = frameSize;
	this.collisionOffset = collisionOffset;
	this.currentFrame = currentFrame;
	this.sheetSize = sheetSize;
	this.speed = speed;
	this.collisionCueName = collisionCueName;
	this.millisecondsPerFrame = millisecondsPerFrame;
	this.scoreValue = scoreValue;
}

  您将需要改变派生类(AutomatedSprite、ChasingSprite、EvadingSprite和UserControlledSprite)的构造方法以便接受整型分数值参数和传递该值到基类构造方法中。这些精灵的构造方法现在看起来应该是这样的:

  ??AutomatedSprite类的构造方法:

?

public AutomatedSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame, Point sheetSize,
	Vector2 speed, string collisionCueName, int scoreValue)
	: base(textureImage, position, frameSize, collisionOffset, currentFrame,
	sheetSize, speed, collisionCueName, scoreValue)
{
}

public AutomatedSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame, Point sheetSize,
	Vector2 speed, int millisecondsPerFrame, string collisionCueName,
	int scoreValue)
	: base(textureImage, position, frameSize, collisionOffset, currentFrame,
	sheetSize, speed, millisecondsPerFrame, collisionCueName, scoreValue)
{
}

?  ??ChasingSprite类构造方法:

public ChasingSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame,
	Point sheetSize, Vector2 speed, string collisionCueName,
	SpriteManager spriteManager, int scoreValue)
	: base(textureImage, position, frameSize, collisionOffset,
	currentFrame, sheetSize, speed, collisionCueName, scoreValue)
{
	this.spriteManager = spriteManager;
}

public ChasingSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame,
	Point sheetSize, Vector2 speed, int millisecondsPerFrame,
	string collisionCueName, SpriteManager spriteManager,
	int scoreValue)
	: base(textureImage, position, frameSize, collisionOffset,
	currentFrame, sheetSize, speed, millisecondsPerFrame,
	collisionCueName, scoreValue)
{
	this.spriteManager = spriteManager;
}

?  ??EvadingSprite类构造方法:

public EvadingSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame,
	Point sheetSize, Vector2 speed, string collisionCueName,
	SpriteManager spriteManager, float evasionSpeedModifier,
	int evasionRange, int scoreValue)
	: base(textureImage, position, frameSize, collisionOffset,
	currentFrame, sheetSize, speed, collisionCueName, scoreValue)
{
	this.spriteManager = spriteManager;
	this.evasionSpeedModifier = evasionSpeedModifier;
	this.evasionRange = evasionRange;
}

public EvadingSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame,
	Point sheetSize, Vector2 speed, int millisecondsPerFrame,
	string collisionCueName, SpriteManager spriteManager,
	float evasionSpeedModifier, int evasionRange,
	int scoreValue)
	: base(textureImage, position, frameSize, collisionOffset,
	currentFrame, sheetSize, speed, millisecondsPerFrame,
	collisionCueName, scoreValue)
{
	this.spriteManager = spriteManager;
	this.evasionSpeedModifier = evasionSpeedModifier;
	this.evasionRange = evasionRange;
}

?  ??UserControlledSprite类构造方法:

public UserControlledSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame, Point sheetSize,
	Vector2 speed)
	: base(textureImage, position, frameSize, collisionOffset, currentFrame,
	sheetSize, speed, null, 0)
{
}

public UserControlledSprite(Texture2D textureImage, Vector2 position,
	Point frameSize, int collisionOffset, Point currentFrame, Point sheetSize,
	Vector2 speed, int millisecondsPerFrame)
	: base(textureImage, position, frameSize, collisionOffset, currentFrame,
	sheetSize, speed, millisecondsPerFrame, null, 0)
{
}

?

注意
发表评论
用户名: 匿名