windowsphone开发平衡球游戏制作Word格式.docx
- 文档编号:22850954
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:26
- 大小:507.38KB
windowsphone开发平衡球游戏制作Word格式.docx
《windowsphone开发平衡球游戏制作Word格式.docx》由会员分享,可在线阅读,更多相关《windowsphone开发平衡球游戏制作Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
世界:
这是对象,它包含一切,你可以把它与现实世界比较。
它确定了以一定规则移动的物体,并确保一切的运转是一致,稳定的。
//创建一个新的世界与重力方向向下10。
WorldMyWorld=newWorld(-Vector2.UnitY*10);
2.Body:
不像现实世界,他们没有任何预设的结构或形状。
body跟踪world的位置,并受碰撞或重力的影响。
以下是有关body类型的细节。
StaticBody:
在模拟环境下,这种body不动,他们不与其他静态或动态物品相撞。
如果开发者希望将它们移动,当然也是可以的。
KinematicBody:
它模拟有移动速度的物品。
Kinematicbodies不受外力影响。
开发者可以强制动移动它们,但大多时候只是设置它的速度。
他们不与其他StaticBody或KinematicBody碰撞。
DynamicBody:
它总是具有非零的具体质量(不会无穷大)。
它可以与任何类型的bodies碰撞。
/*创建一个新的StaticBody,并添加到当前的世界对象中,以便它可以通过引擎更新位置。
*/
BodyMyBody=newBody(World);
MyBody.IsStatic=true;
3。
Shapes:
它是2D结构的body,表示物体在世界上占有多少空间,如:
多边形,方形,圆形等,在计算的惯性,质量,质心和其它相关的东西时,需要这个属性。
Shapes可以独立于Body使用。
总之body有它的位置和速度,并可以受外力,推动,和扭矩的作用。
/*创建一个新的半径为10,密度为25的圆形。
*/
CircleShapeMyCircle=newCircleShape(10,25);
4。
Fixture:
它表示body和shape之间的黏着性。
Fixture和shape,body都有关系,还提供了类似摩擦性能,恢复原状(弹跳能力,我猜),密度等属性,Fixture与碰撞有一定的相关性,比如说,形状间碰撞的效果是由他影响的。
FixtureMyFixture=newFixture(MyBody,MyShape);
关节:
这是两个或两个以上的物体共同的连接点。
在游戏中的典型例子包括布娃娃,摇摇坠,及滑轮。
可以以许多不同的方式组合关节来创造有趣的效果。
有多种类型的关节,如AngleJoint,DistanceJoint,FrictionJoint,RevoluteJoint,GearJoint,LineJoint,PrismaticJoint,PulleyJoint,RevoluteJoint,SliderJointandWeldJoint,
AngleJointMyJoint=newAngleJoint(BodyA,BodyB);
工厂:
工厂提供方法来创建基本类型的对象。
每个对象类型都有它自己的许多重载的静态工厂,以提供充分的灵活性。
我们在我们的游戏主要用BodyFactory和FixtureFactory。
下面是一些工厂的例子。
//CreateBodywhichgetsplacesatOrigin.
BodyMyBody=BodyFactory.CreateBody(MyWorld,Vector2.Zero);
//CreateCircleFixturewith10Radiusand25Density.
FixtureFactory.CreateCircle(MyWorld,10,25);
PolygonTools:
这个类可以帮助我们创建各种多边形。
使用这个类,我们可以创建矩形,圆角矩形,边缘,圆形,椭圆形,齿轮。
示例用法如下:
//生成10x5尺寸的矩形的顶点。
我们可以用同样的方法创建更复杂的对象
Verticesvert=PolygonTools.CreateRectangle(10,5);
FixtureFactory.CreatePolygon(vert,10,MyBody);
现在我们已经创造的世界,加入了身体,用不同的方式创建了形状,,给body加入了关节。
这是所有Farseer物理引擎核心,毫无疑问,如果要建立更复杂的对象和大型游戏,我们要了解更多知识,当然,现在已经足够我们开始玩了。
请大家关注下一节:
在XNA(RenderXNA)渲染Farseer物理对象
我将在最后一节中放出所有源码与实例,毫无保留。
我希望你能喜欢我的文章!
如果你有更多想法,请到卤面网
wp7开发论坛()问答区联系我,我会很高兴知道你在想什么。
同时wp7交流QQ群172765887中,也能找到我的身影,感谢大家
原文链接:
标签:
<
无>
在本节中,我们将看到一些实质代码和world定位对象根本原理。
首先,我们需要了解Farseer物理引擎对对象的测量。
了解Farseer物理引擎的测量方式
Farseer是Box2D引擎的一个版本,在Box2D,如果我们要创建矩形,我们得告诉系统宽度的一半值,高度的一半值和形状的中心点。
Farseer物理引擎也是使用相同的测量方式。
在Silverlight或其他.NET应用程序中,我们试图创建矩形前先指定它的左上角的位置,然后提的高度和宽度的有关信息。
但是,这并不是Farseer物理引擎的使用方式,所以要记住的是,一个物理对象的位置总是指的是中心点不是左上角,但高度和宽度,应指100%的值,而不像Box2D中只填一半,这是唯一的不同。
现在如果你想创建单位为10X10矩形,并和你想要的Farseer物理对象一样大,那么你最后将得到一个非常大体积的对象,因为Farseer物理使用米为单位。
因此,我们必须始终使用非常小的大小或需要一个转换器转换成我们的像素值。
我喜欢转换,因为它会让我在整个应用程序只考虑像素。
因此,我们需要选择一个转换率,如1米=15像素或类似的东西。
这个比例将用于在整个应用程序转换显示的单位(像素)和模拟的单位(米),
最后在Farseer物理引擎中,旋转使用的是弧度单位,所以一定要在分配物理对象旋转量前转换为弧度。
Farseer物理引擎的使用演示
到目前为止,我们已经有了物理对象,我们知道我们需要遵循什么样的标准,但有没有UI相关的东西,因为Farseer只是个物理引擎,不包括用户界面。
因此如果我们想继续开发,在world中创造一个body,我们将不能在屏幕上看到任何东西。
要想让Farseer物理对象出现在屏幕上,我们需要使用XNA绘制他们。
我们可以使用SpriteBatch类和DrawText方法在屏幕上绘制纹理和文字。
下面是画10X10大小的矩形的示例,并贴了MyTexture的纹理。
SpriteBatch.Draw(MyTexture,
new
Rectangle(0,0,10,10),Color.White);
因此,让我们的创建一个让矩形因重力下降的例子。
打开vs2010forwindowsphone,创建新的项目,并选择XNAGameStudio4.0的项目模板,并命名它FarseerXNADemo1。
它会给你生成2个项目,第一个是XNA的项目,另一个是内容项目用来管理资源(如图像,声音,字体等)
-首先,我们需要引用WP7的DLL(Farseer物理引擎上可以找到下载页面)。
现在,我们需要得到需要绘制的一些纹理(这里的纹理是指图像),添加空白PNG图像(blank.png)到项目内容。
经过上述步骤后,我们的解决方案资源管理器将如下图:
public
Game1()
{
Window.Title=
"
DEMO1"
;
_graphics=
GraphicsDeviceManager(this);
_graphics.PreferredBackBufferWidth=480;
_graphics.PreferredBackBufferHeight=800;
_graphics.IsFullScreen=
true;
Content.RootDirectory=
Content"
}
-我们先设置窗口标题,然后创建了一个新的GraphicsDeviceManager对象,它使用了目前的游戏类的实例。
现在我们指定宽度480,高度800,因为我们希望我们的电话是在竖屏模式。
同时,我们正在开发游戏,所以我们不想手机上部分显示电池或连接相关的东西,因此打开全屏标志。
(请注意,有时它是很好的做法,显示电池的详细信息,否则玩家可能会用尽电池,播放时,电话突然被关闭,这将是非常恼人)
-在同一个文件中声明一个Texture2D对象名为MyTexture,一个世界对象名为MyWorld,2个body的对象名为BoxBody和FloorBody
-在initialize方法中,初始化所有4个对象,并给他们设置物理性能相关属性。
Texture2DMyTexture;
WorldMyWorld;
BodyBoxBody,FloorBody;
protected
override
void
LoadContent()
//CreateanewSpriteBatch,whichcanbeusedtodrawtextures.
spriteBatch=
SpriteBatch(GraphicsDevice);
base.LoadContent();
//LoadBlankTexturesothatwecanrendercolorsoverit.
MyTexture=Content.Load<
Texture2D>
("
blank"
);
//CreateNewWorldwithgravityof10units,downward.
MyWorld=
World(Vector2.UnitY*10);
//CreateFloor
FixturefloorFixture=FixtureFactory.CreateRectangle(MyWorld,ConvertUnits.ToSimUnits(480),ConvertUnits.ToSimUnits(10),10);
floorFixture.Restitution=0.5f;
//Bounceability
floorFixture.Friction=0.5f;
//Friction
FloorBody=floorFixture.Body;
//GetBodyfromFixture
FloorBody.IsStatic=
//Floormustbestationaryobject
//CreateBox,(Note:
Differentwayfromabovecode,justtoshowitotherwisethereisnodifference)
BoxBody=BodyFactory.CreateBody(MyWorld);
FixtureFactory.CreateRectangle(ConvertUnits.ToSimUnits(50),ConvertUnits.ToSimUnits(50),10,Vector2.Zero,BoxBody);
foreach
(Fixturefixture
in
BoxBody.FixtureList)
fixture.Restitution=0.5f;
fixture.Friction=0.5f;
BoxBody.BodyType=BodyType.Dynamic;
//Placefloorobjecttobottomofthescreen.
FloorBody.Position=ConvertUnits.ToSimUnits(new
Vector2(240,700));
//PlaceBoxonscreen,somewhere
BoxBody.Position=ConvertUnits.ToSimUnits(new
Vector2(240,25));
-让我们每次分析一行(为有关ConvertUnits类的更多信息,参见“ConvertUnits“小节)。
第一行初始化方法加载纹理并将对象保存供以后使用。
然后我们创建一个新的世界,有着向下10个单位的重力。
之后,我们创建地板的body,创建它的形状,使用FixtureFactory.CreateRectangle方法创建fixture。
它创建高度为20个单位的矩形。
它同时也创建了正确的shape和body。
然后我们设置地板的摩擦系数和弹性系数,并最终保存,以供以后的body对象使用
-我们可以用同样的方法来创建物理对象,就像我们前面创造地板的方式一样,但我想向您展示其他方式,所以我们将创建略有不同的代码。
我们首先创建一个body,如果我们传递world的对象到构造函数,那么我们同时将把该body加入该world。
然后我们创建fixture,它会创建形状,并将它绑定到body(注意,我们这次在CreateRectangle方法中传递BoxBody作为参数)。
然后我们提供body弹性系数和摩擦系数。
最后一行是设置正确的body类型。
我们想在重力作用下移动箱子,所以我们这个对象为动态类型。
-现在我们已经创建了地板和箱子,现在我们需要来定位他们在屏幕上的位置,地板需要放置在屏幕底部,而箱子要放置顶部某处
-ConvertUnits:
这个类是用来转换Farseer物理单位(米)到显示单位(像素)。
我们用16个单位的比例,即对我们1米=16像素。
对于800x480像素的屏幕,这个比率已经足够好了。
在这个类中有3个静态方法,也有许多重载,方法详情如下:
ToSimUnits-这种方法将输入的值转换成模拟单位,也就是说把显示单元(像素)转换为模拟单位(米)。
ToDisplayUnits-这种方法将输入的值转换成显示单位,也就是说把模拟单位(米)转换为显示单元(像素)。
SetDisplayUnitToSimUnitRatio-此方法允许应用程序设置显示单位到模拟单位转换的转换率。
请正确地使用它,因为错误设置的比例可能会导致意想不到的物理的效果(比如物体看起来太重...)。
InFarseerPhysicsmeasurementsare
metersnot
pixels.Andpositionsignifiescentrepointof
object
notthetop-leftcorner.
-做物理相关的东西后,我们需要使用XNA绘制这些对象。
我们在Draw方法中添加以下代码。
Draw(GameTimegameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
//DrawBox,itsHeightis50andWidthis50.
spriteBatch.Draw(MyTexture,
Rectangle((int)(ConvertUnits.ToDisplayUnits(BoxBody.Position.X)-25),(int)(ConvertUnits.ToDisplayUnits(BoxBody.Position.Y)-25),50,50),Color.Green);
//DrawFloor,itsHeightis10andWidthis480.
newRectangle((int)ConvertUnits.ToDisplayUnits(FloorBody.Position).X-240,(int)ConvertUnits.ToDisplayUnits(FloorBody.Position).Y-5,480,10),
null,Color.Gray,FloorBody.Rotation,
Vector2(0,0),SpriteEffects.None,0);
spriteBatch.End();
base.Draw(gameTime);
-我们使用SpriteBatch类的Draw方法。
在绘图box的同时,我们提供纹理,和目标矩形。
第一和第二个参数分别是矩形的左上角坐标(记得Farseer保存的是物体中心点位置,所以我们需要从左上角的位置减去一半的宽度和一半的高度,)。
接下来的2个参数分别是高度和宽度。
地板对象也是同理。
-如果你现在运行该项目,你会看到箱子和地板,但箱子不受重力的影响。
这是因为我们没有更新世界。
update方法需要添加的方法,看起来会像下面一样:
,
Update(GameTimegameTime)
//Allowsthegametoexit
if
(GamePad.GetState(PlayerIndex.One).Buttons.Back==ButtonState.Pressed)
this.Exit();
//variabletimestepbutneverlessthen30Hz
MyWorld.Step(Math.Min((float)gameTime.ElapsedGameTime.TotalMilliseconds*0.001f,(1f/30f)));
base.Update(gameTime);
-按上面步骤写出的代码,效果会是:
world会每秒前进30+个单位。
现在,如果你运行的项目,你会感觉box受到重力下降一样。
-现在你可能会觉得用XNA整合物理对象是如此容易,我也这样认为,但如果您去尝试旋转,转换并组合更多形状于一体,你将不得不精确的计算每个物品在屏幕上应该怎么绘制,相信我,是不容易的,它似乎也将消耗大量的时间,因此要用一个通用的方法精确的得出要绘制对象的当前状态。
我们应该怎么做......?
答案是DebugDraw。
DebugDraw(XNA渲染)
-DebugDraw是Farseer物理引擎提供的一个功能,让我们还在开发阶段,能在屏幕上绘制对象数据,这将帮助您可视化body,fixtures,以及其它物体。
我在想,我们为什么不能在实际应用中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windowsphone 开发 平衡 游戏 制作
