windowsphone开发平衡球游戏制作.docx

上传人:b****7 文档编号:9667747 上传时间:2023-02-05 格式:DOCX 页数:26 大小:507.38KB
下载 相关 举报
windowsphone开发平衡球游戏制作.docx_第1页
第1页 / 共26页
windowsphone开发平衡球游戏制作.docx_第2页
第2页 / 共26页
windowsphone开发平衡球游戏制作.docx_第3页
第3页 / 共26页
windowsphone开发平衡球游戏制作.docx_第4页
第4页 / 共26页
windowsphone开发平衡球游戏制作.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

windowsphone开发平衡球游戏制作.docx

《windowsphone开发平衡球游戏制作.docx》由会员分享,可在线阅读,更多相关《windowsphone开发平衡球游戏制作.docx(26页珍藏版)》请在冰豆网上搜索。

windowsphone开发平衡球游戏制作.docx

windowsphone开发平衡球游戏制作

小时候,我就想要自己做游戏,今天的技术已经发展得如此便利,我们可以很容易地创建简单的游戏。

本文试图建立一个可重用的基于组件的游戏框架,减少了我们建立基于物理引擎的XNA游戏所需的时间。

我认为我们应该先明确一点,先建立一个游戏的基础代码,然后逐个解决我们要处理的问题。

因此,我们先建立非常简单,但很容易上瘾的游戏类型,即玩家只需要在物体每次跳跃时击中地面,同时控制物体的向左和向右的运动。

对于不断滚动而向前的移动,玩家很难控制的,也无法掌握游戏的速度。

这种额外操作会加大玩游戏的难度,毕竟游戏吸引的玩家在不同的级别(包括新手,正常水平,骨灰级牛B玩家),所以我们将建立一套不同的困难与不同关卡。

关于游戏的目标,除了生存,玩家需要收集更多的得分与奖励(我们需要考虑我们如何实现它),这是我们的想法。

根据上述的想法,你所需要的基本的东西,就包括关卡选择场景,游戏场景(场景系统),物理碰撞(Farseer物理对象),得到玩家左,右运动的输入按钮,得分系统(毕竟这是一场比赛,他们需要一些目标,我们的游戏的目标是取得尽可能多的玩家)。

在这里我不得不感谢一直支持我的卤面网版主,是他让我提起兴趣写了这么一篇文章,再次感谢卤面网,一个非常不错的wp7开发论坛,后面我也将再次向大家发布几篇高质量文章,请大家到卤面上找我吧,呵呵

  进入正题:

Farseer物理引擎3.2和XNA4

什么是物理引擎,为什么我们需要这个?

物理引擎,使物体以一种我们正常世界接受的方式移动,使他们服从现实世界的物理规则。

从比赛的角度来看,一个物理引擎仅仅是一个功能性的动画系统。

我们可以建立一个我们自己的,但又不需要我们关心太多的以物理规则运动的对象。

我们的目标是快速和可靠的制作游戏,因此,我们不打算自己去做物理引擎,而将使用现有的Farseer物理引擎(V3.2)。

Farseer物理引擎的背景

Farseer物理引擎是一个Box2D的C#版本。

Box2D的是一个2D刚体模拟游戏开发库。

Farseer物理引擎是一个模拟真实的物理反应的碰撞检测系统。

让我们从基本知识开始。

若要使用Farseer物理引擎你需要知道如下所述的4点:

1。

世界:

这是对象,它包含一切,你可以把它与现实世界比较。

它确定了以一定规则移动的物体,并确保一切的运转是一致,稳定的。

//创建一个新的世界与重力方向向下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物理引擎中,旋转使用的是弧度单位,所以一定要在分配物理对象旋转量前转换为弧度。

在这里我不得不感谢一直支持我的卤面网版主,是他让我提起兴趣写了这么一篇文章,再次感谢卤面网,一个非常不错的wp7开发论坛,后面我也将再次向大家发布几篇高质量文章,请大家到卤面上找我吧,呵呵

  进入正题:

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= new 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= new SpriteBatch(GraphicsDevice);

     

    base.LoadContent();

     

    //LoadBlankTexturesothatwecanrendercolorsoverit.

    MyTexture=Content.Load("blank");

     

    //CreateNewWorldwithgravityof10units,downward.

    MyWorld= new 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= true;              //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 in metersnot in pixels.Andpositionsignifiescentrepointof object notthetop-leftcorner.

-做物理相关的东西后,我们需要使用XNA绘制这些对象。

我们在Draw方法中添加以下代码。

protected override void Draw(GameTimegameTime)

{           

    GraphicsDevice.Clear(Color.CornflowerBlue);

     

    spriteBatch.Begin();

     

    //DrawBox,itsHeightis50andWidthis50.

    spriteBatch.Draw(MyTexture, new Rectangle((int)(ConvertUnits.ToDisplayUnits(BoxBody.Position.X)-25),(int)(ConvertUnits.ToDisplayUnits(BoxBody.Position.Y)-25),50,50),Color.Green);

     

    //DrawFloor,itsHeightis10andWidthis480.

    spriteBatch.Draw(MyTexture, newRectangle((int)ConvertUnits.ToDisplayUnits(FloorBody.Position).X-240,(int)ConvertUnits.ToDisplayUnits(FloorBody.Position).Y-5,480,10), null,Color.Gray,FloorBody.Rotation, new Vector2(0,0),SpriteEffects.None,0);

     

    spriteBatch.End();

     

    base.Draw(gameTime);

}

-我们使用SpriteBatch类的Draw方法。

在绘图box的同时,我们提供纹理,和目标矩形。

第一和第二个参数分别是矩形的左上角坐标(记得Farseer保存的是物体中心点位置,所以我们需要从左上角的位置减去一半的宽度和一半的高度,)。

接下来的2个参数分别是高度和宽度。

地板对象也是同理。

-如果你现在运行该项目,你会看到箱子和地板,但箱子不受重力的影响。

这是因为我们没有更新世界。

update方法需要添加的方法,看起来会像下面一样:

protected override void 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渲染)

我将在最后一节中放出所有源码与实例,毫无保留。

我希望你能喜欢我的文章!

如果你有更多想法,请到卤面网 wp7开发论坛()问答区联系我,我会很高兴知道你在想什么。

同时wp7交流QQ群172765887中,也能找到我的身影,感谢大家

 

 

 

 

原文链接:

-DebugDraw是Farseer物理引擎提供的一个功能,让我们还在开发阶段,能在屏幕上绘制对象数据,这将帮助您可视化body,fixtures,以及其它物体。

我在想,我们为什么不能在实际应用中

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 营销活动策划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1