65.9K
CodeProject 正在变化。 阅读更多。
Home

粉碎球

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (12投票s)

2013年8月10日

CPOL

10分钟阅读

viewsIcon

35698

一个多层益智游戏,通过触摸和点击进行一些排列,以在给定的点击次数内摧毁所有目标!!

引言-

Shatter Ball 是一款专为 Windows 桌面设计的、多关卡益智游戏。起初,我将此应用设计为 Metro 应用,现在我正在将其设计为Windows 8 桌面以及平板电脑联想 Horizon AIO。这一切都是关于乐趣和娱乐,并且能够利用联想 Horizon AIO的一些酷炫功能。当我读到这款设备时,我真的觉得这款游戏能够利用这款设备的独特功能,并且它将是一款用户友好的游戏,通过这款带有多种游戏配件的桌面 PC,以及全新一代的触屏一体机,能够吸引目光,适用于桌面应用和 Metro 应用。与 Windows 8 的集成通过其宽广的触摸区域和屏幕尺寸,提供了令人愉悦的触摸体验,这在游戏和其他娱乐方面非常有用。

                      这款游戏是我为 Windows 8 Metro UI 开发的 Shatter Ball 的移植版本,我使用 C#、XAML 和 Silverlight 5 制作了它。这款游戏可以在 联想 Horizon AIO 上作为桌面应用程序运行。在继续之前,我想先介绍一些规则及其完整描述,以及如何玩它。 

规则和描述-

   

我将这款游戏分为两个不同的类别,我为 类别 1 设计了 20 个关卡,为 类别 2 设计了 6 个关卡,以下是这两个类别的描述-

类别 1 

从头开始,有一些 绿色球作为目标球,以及 红色球作为 the striker。每个关卡只有一个 the striker 和可变的 the target balls,根据关卡数量以及一些 棕色方块 作为 the obstacles。所以我们必须通过触摸屏幕来摧毁每一个绿色球。我们必须做出一定的安排,这样在触摸屏幕后,the striker 会朝那个方向移动,并且当 the striker 和绿色球碰撞时,the target balls 会被摧毁。有一些棕色方块是 the stationary objects,充当 the mirror,这意味着 the striker 在与棕色方块碰撞后会反弹。我在每个关卡中都设置了 the tap chances 的数量,在 these chances 之内,玩家必须摧毁每一个绿色球。如果每一个绿色球都在给定的 the tap chances 之内被摧毁,那么玩家将自动进入下一个关卡,否则玩家将进入同一个关卡。关于 the complexity ,随着关卡数量的增加,由于绿色球和 the obstacle blocks 的增加,游戏的 the complexity 也会增加。所有的碰撞和移动都在 the complete physics laws 和 farseer physics engine 下进行。在游戏过程中,如果玩家想重新玩那个关卡,或者返回主菜单,或者选择任何不同的关卡,我通过弹出的选项框提供了 the intergame navigation option。我在类别 1 中设计了 20 个关卡。

类别 2

这个类别与类别 1 几乎相同,但有一个区别,即在类别 1 中,所有的棕色方块都是 the stationary 的,而在这里它们是 the movable red blocks,并且它们是在 the physics laws 下移动的。所以它们将通过它们的移动帮助玩家摧毁 the target balls,因为它们可以自由移动。但是棕色方块是 the stationary 的,它们不会移动。这里我设计了 7 个关卡,并且我正计划让 the striker 可以通过 Air Hockey paddle 或 the striker 移动,这无疑是 联想 Horizon AIO 的一个优雅的附属功能。然后玩家可以用 the paddle 击打 the striker,然后整个东西将根据玩家提供的能量水平移动。

Shatter Ball 的特点-

1.针对平板电脑和 PC 模式进行了优化-

由于联想 Horizon AIO 可以用作台式机和 tablet,因此玩家可以获得两种触摸体验:在 tablet 模式下触摸,在台式机模式下通过鼠标玩。我包含了各种指针按压事件,并尝试引入一些触摸手势,以便两者可以同时进行,这取决于用户。 

2.在移动红色球时使用设备 paddle(the striker)-

正如我所了解的,这款设备有一些配件,如 E-dice电子 paddle(the striker)。正如我在规则中所描述的,在第二类中,我计划通过 the paddle(str)移动那个红色球,因为我使 the striker 可移动,并且整个移动将取决于玩家通过 the paddle 提供的能量。我还没有找到一种合适的方式来包含它,但希望很快就能完成。我认为这种利用将使这款游戏非常适合这款设备。

3.多关卡游戏 -   

我总共设计了27 个关卡,分布在两个类别中,这是这款游戏的关键特色。我提供了游戏内导航系统,用户可以通过弹出窗口选项自由选择任何关卡并进入游戏的任何部分,该选项能够非常有效地进行游戏内导航。您将从简单的关卡开始,随着您进入下一个关卡,目标球的数量会增加,从而增加难度。 

4.显示、动画和屏幕方向 -   

联想 Horizon 是一款巨大的 27 英寸台式机,拥有非常宽广的屏幕显示。这款游戏在这款设备上能够发挥最佳效用,拥有清晰的用户界面和碰撞时的一些动画,这使得这款游戏更具吸引力。屏幕可根据用户方向自动调整,并可根据玩家方向进行360 度旋转。

5.云集成 - 

我正计划在这款游戏中添加一些云功能,并添加一些关于多人版本、排行榜和在线结果生成的功能,这些功能可以共享到 Facebook 和 Twitter 以及其他社交平台。 

 

使用代码

 我将尝试展示一些重要区域,以及我如何构建它,并集成 Physics Farseer Engine、C# 和 XAML 及 Silverlight 5。主要是我使用用户自定义控件来设计每个物理对象,并使用经典的按钮并通过图像填充它们,这些按钮负责事件和导航。由于 Silverlight 中的大部分代码都是相同的,为了实现这一点,我在 XAML 中设计了它,并使用了一些 pointer press event 来有效地从用户那里获得响应,并使其功能完善。 

 

1.物理引擎-   

在这款游戏中,我使用了 Farseer 物理引擎,所有的球和方块都在这个引擎的控制下移动,并且它可以很好地与 WinRT 和 Silverlight 集成。

包含命名空间-  

包含此项后,我们可以访问并将我们的自定义控件变成物理对象,然后它可以根据物理引擎移动。 

xmlns:local="using:Bomb_Man"
xmlns:physics="using:Spritehand.FarseerHelper" 

 2.the striker 和目标(红色球和绿色球)-

所有这些都是用户自定义控件,通常它们是圆形,我在这款游戏中将它们用作 the striker 和 the target balls。 

<Viewbox>
        <Canvas Height="100" Width="100">
        <physics:PhysicsSprite RestitutionCoefficient="1"   x:Name="ManSprite" ShapeType="Ellipse" Height="100" Width="100" >
            <Ellipse x:Name="ellipse" Height="100" Width="100" StrokeThickness="0">
            	
            	<Ellipse.Fill>
            		<ImageBrush ImageSource="Man.png"/>
            	</Ellipse.Fill>
                   
                        <Ellipse.Projection>
                    <PlaneProjection/>
                </Ellipse.Projection>
            </Ellipse>
        </physics:PhysicsSprite>
        </Canvas>
    </Viewbox>
 

3.方块-

这是一个矩形自定义控件,我在游戏中用它来制造障碍物。我将它的恢复系数设置为 1,这样可以根据物理定律实现清晰的反射。 

 <Viewbox HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Canvas x:Name="mainCanvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <MediaElement Name="Prop1" Source="/Prop1.wav"  AutoPlay="False"></MediaElement>
            <physics:PhysicsSprite  IsStatic="True" RestitutionCoefficient="1" x:Name="Man1Sprite" ShapeType="Rectangle" Height="40" Width="1366" >
                <Rectangle Height="40" Width="1366"  RenderTransformOrigin="0.5,0.5" Canvas.Top="0.01" UseLayoutRounding="False" d:LayoutRounding="Auto" Canvas.Left="-1.042">
                    <Rectangle.Fill>
                        <ImageBrush ImageSource="MirrorH.png"/>
                    </Rectangle.Fill>
                </Rectangle>
            </physics:PhysicsSprite>
        </Canvas>
    </Viewbox>   

4.所有物理对象与游戏页面的集成-

在本节中,我将所有物理对象和自定义控件集成到主游戏页面,并设置了每个对象的 {position},然后在游戏引擎下编写了不同对象的不同动作代码。 

                           为此,我将每个物理对象放置在一个 canvas 中,并将该 canvas 的属性设置为 stretched,以便它可以在运行的任何屏幕尺寸下通用显示。然后我放置了我所有的自定义控件,并为它们分配了一个唯一的名称,在这个 canvas 上,我设置了一个 pointer pressed event,这样当用户触摸或单击鼠标时,就会发生所有移动。这就是我们的 game.xaml 页面,我在其中设计了完整的 UI,然后编写了 game.xaml.cs 页面中每个对象的代码。  

<Viewbox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<physics:PhysicsCanvas MousePickEnabled="True" Name="mainCanvas" Width="1366" Height="768" PointerPressed="mainCanvas_PointerPressed_1" >
            <physics:PhysicsCanvas.Background>
                <ImageBrush ImageSource="Background.png"/>
            </physics:PhysicsCanvas.Background>
            <custom:Man Height="82" x:Name="ManBall" Canvas.Left="65" Canvas.Top="166" RenderTransformOrigin="-0.105,3.045" Width="66" />
            <custom:Mirror2 Height="42" x:Name="mirror21" Canvas.Top="726" Width="1178" Canvas.Left="326" />
            <custom:Target1 Height="70" x:Name="target1" Canvas.Left="1122" Canvas.Top="580" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Mirror Height="200" Width="30" x:Name="mirror211" Canvas.Left="667" Canvas.Top="166" />
            <custom:Mirror Height="200" Width="30" x:Name="mirror211_Copy" Canvas.Left="10" Canvas.Top="367" />
            <custom:Mirror Height="200" Width="30" x:Name="mirror211_Copy1" Canvas.Left="1294" Canvas.Top="399" />
            <custom:Target1 Height="70" x:Name="target1_Copy" Canvas.Left="65" Canvas.Top="422" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy1" Canvas.Left="730" Canvas.Top="407" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy2" Canvas.Left="730" Canvas.Top="166" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy3" Canvas.Left="730" Canvas.Top="292" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Mirror Height="200" Width="30" x:Name="mirror211_Copy2" Canvas.Left="667" Canvas.Top="292" />
            <custom:Target1 Height="70" x:Name="target1_Copy4" Canvas.Left="65" Canvas.Top="529" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy5" Canvas.Left="65" Canvas.Top="327" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:MirrorH Height="30" Width="200" x:Name="mirrorh" Canvas.Left="954" RenderTransformOrigin="2.35,-2.067" Canvas.Top="70"/>
            <custom:Target1 Height="70" x:Name="target1_Copy6" Canvas.Left="1098" Canvas.Top="166" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy7" Canvas.Left="954" Canvas.Top="166" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy8" Canvas.Left="553" Canvas.Top="407" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy9" Canvas.Left="553" Canvas.Top="292" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy10" Canvas.Left="553" Canvas.Top="166" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy11" Canvas.Left="843" Canvas.Top="617" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Target1 Height="70" x:Name="target1_Copy12" Canvas.Left="417" Canvas.Top="617" Width="56" RenderTransformOrigin="3.2,1.54"/>
            <custom:Welcome x:Name="Welcome" Canvas.Left="-400" Canvas.Top="200" RenderTransformOrigin="0.5,0.5">
                <custom:Welcome.RenderTransform>
                    <CompositeTransform/>
                </custom:Welcome.RenderTransform>
            </custom:Welcome>
            <TextBlock HorizontalAlignment="Left" Name="text2" TextWrapping="Wrap" Text="Tap:"  VerticalAlignment="Top" Height="66" Foreground="Red" Width="225" FontSize="45" Canvas.Left="1131" Canvas.Top="10"/>
            <Button Height="52" x:Name="b11"  Canvas.Left="10" Canvas.Top="48" Width="56" Click="b11_Click_1">
                <Button.Background>
                    <ImageBrush ImageSource="Set.png"/>
                </Button.Background>
            </Button>
            <MediaElement Name="arcade" Source="arcade.wav"  AutoPlay="False"></MediaElement>
            <custom:Setting11 Height="200" Width="1366" x:Name="setting" Canvas.Left="0" Canvas.Top="-200" RenderTransformOrigin="0.5,0.5"  >
                <custom:Setting11.RenderTransform>
                    <CompositeTransform/>
                </custom:Setting11.RenderTransform>
            </custom:Setting11>
            <custom:Try x:Name="Welcome12" Canvas.Left="1430" Canvas.Top="200" RenderTransformOrigin="0.5,0.5" >
                <custom:Try.RenderTransform>
                    <CompositeTransform/>
                </custom:Try.RenderTransform>
            </custom:Try>
        </physics:PhysicsCanvas>
    </Viewbox>

  

5.目标球的消失和动画- 

这段 XAML 代码是关于 the striker 与 the target balls 碰撞时发生的动画,然后 the target balls 消失。这段代码是关于小的动画和 the target balls 的消失。为了做到这一点,我使用了 Expression Blend 来制作所有的 动画和设计   

                               实际上,我通过 path tool 设计了我的目标球,并制作了 四个圆的 the parts,其中 all of are quarter circle,然后我将它们连接起来,并设置了动画。当 the striker 与 this target ball 碰撞时,这四个 quarter circle 会破碎,然后它们会失去可见性,并且这会发生在每一次碰撞中。 

<UserControl.Resources>
        <Storyboard SpeedRatio="1.5" x:Name="Collision">
            <DoubleAnimation Duration="0:0:0.4" To="-83.333" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="path" d:IsOptimized="True"/>
            <DoubleAnimation Duration="0:0:0.4" To="52" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="path" d:IsOptimized="True"/>
            <DoubleAnimation Duration="0:0:0.4" To="78" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="path1" d:IsOptimized="True"/>
            <DoubleAnimation Duration="0:0:0.4" To="-53.333" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="path1" d:IsOptimized="True"/>
            <DoubleAnimation Duration="0:0:0.4" To="-75.333" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="path2" d:IsOptimized="True"/>
            <DoubleAnimation Duration="0:0:0.4" To="-54" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="path2" d:IsOptimized="True"/>
            <DoubleAnimation Duration="0:0:0.4" To="88.667" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="path3" d:IsOptimized="True"/>
            <DoubleAnimation Duration="0:0:0.4" To="44" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="path3" d:IsOptimized="True"/>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="path">
                <DiscreteObjectKeyFrame KeyTime="0:0:0.4">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
            </ObjectAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="path3">
                <DiscreteObjectKeyFrame KeyTime="0:0:0.4">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
            </ObjectAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="path1">
                <DiscreteObjectKeyFrame KeyTime="0:0:0.4">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
            </ObjectAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="path2">
                <DiscreteObjectKeyFrame KeyTime="0:0:0.4">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
                    <DiscreteObjectKeyFrame.Value>
                        <Visibility>Collapsed</Visibility>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </UserControl.Resources>
    <Viewbox>
        <Canvas Height="100" Width="100">
            
            <physics:PhysicsSprite Mass="1" IsStatic="True"  IsSensor="True" RestitutionCoefficient="1" x:Name="Target1Sprite" ShapeType="Ellipse" Height="100" Width="100" >
                <Ellipse  Height="100" Stroke="Green" Width="100" StrokeThickness="0">
                	<Ellipse.Fill>
                		<ImageBrush ImageSource="Target.png"/>
                	</Ellipse.Fill>
                    <Ellipse.Projection>
                        <PlaneProjection/>
                    </Ellipse.Projection>
                </Ellipse>
            </physics:PhysicsSprite>
            <Canvas Name="animeCanvas" Visibility="Collapsed" Height="100" Width="100">
               
                <Path x:Name="path" Data="M2,50.6667 L42,51.333 L42,92.6854" Fill="#FF27B03A" Height="43" Canvas.Left="9.334" Stretch="Fill" Stroke="Black" Canvas.Top="47" UseLayoutRounding="False" Width="41" RenderTransformOrigin="0.5,0.5">
                    <Path.RenderTransform>
                        <CompositeTransform/>
                    </Path.RenderTransform>
                </Path>
                <Path x:Name="path3" Data="M97.3333,49.3333 L52.0003,50.667 L54.667,88.6581" Fill="#FF27B03A" Height="40.334" Canvas.Left="47.167" Stretch="Fill" Stroke="Black" Canvas.Top="47" UseLayoutRounding="False" Width="46.333" RenderTransformOrigin="0.5,0.5">
                    <Path.RenderTransform>
                        <CompositeTransform/>
                    </Path.RenderTransform>
                </Path>
                <Path x:Name="path1" Data="M52.6667,3.33333 L54.6664,42.667 L93.327,42.667" Fill="#FF27B03A" Height="40.334" Canvas.Left="47.167" Stretch="Fill" Stroke="Black" Canvas.Top="3.499" UseLayoutRounding="False" Width="41.666" RenderTransformOrigin="0.5,0.5">
                    <Path.RenderTransform>
                        <CompositeTransform/>
                    </Path.RenderTransform>
                </Path>
                <Path x:Name="path2" Data="M46.6667,3.33333 L43.9997,40.667 L7.33303,42" Fill="#FF27B03A" Height="39.667" Canvas.Left="10" Stretch="Fill" Stroke="Black" Canvas.Top="5.5" UseLayoutRounding="False" Width="40.334" RenderTransformOrigin="0.5,0.5">
                    <Path.RenderTransform>
                        <CompositeTransform/>
                    </Path.RenderTransform>
                </Path>
                <MediaElement Name="BallHit" Source="/BallHit.wav"  AutoPlay="False"></MediaElement>
            </Canvas>
        </Canvas>
    </Viewbox>
</UserControl>

6.the striker(红色球)的向量赋值代码-

这段代码是关于触摸事件或任何指针按压事件,在这种事件下,the striker 会获得一个指向触摸点的向量,然后在获得触摸位置的坐标后,它会朝着触摸点的方向移动。

private void mainCanvas_PointerPressed_1(object sender, PointerRoutedEventArgs e)
        {
            if (!timer.IsEnabled)
            {
                Point tempPoint = e.GetCurrentPoint(mainCanvas).Position;
                Vector2 mousePoint = new Vector2((float)tempPoint.X, (float)tempPoint.Y);
                Vector2 impulse2 = Vector2.Subtract(ManBall.SpriteReference.Position, mousePoint);
                impulse2.Normalize();
                ManBall.SpriteReference.launchSprite(-impulse2*5);
                timer.Start();
                chance -= 1;
                text2.Text = "Tap: " + chance.ToString();
            }
        }
 

7.目标球的交叉和消失代码-

void Target1Sprite_Collision(PhysicsSprite source, string collidedWith, FarseerPhysics.Dynamics.Contacts.Contact contact)
        {
            if (collidedWith.Contains("ManSprite"))
            {
                App.canvasRef.DeletePhysicsObject(source.Name);
                App.count++;
                playSound1();
                animeCanvas.Visibility = Visibility.Visible;
                Collision.Begin();
                
            }
        } 

8.边界限制和球替换代码- 

这段代码是关于边界限制的,例如当球移动时,或者如果它的位置超出了屏幕,那么它将被放置在其开始的原始位置。 

void move()
        {
            bool hit = false;
            if (ManBall.SpriteReference.Position.X < -50)
            {
                
                ManBall.SpriteReference.Position = orPos;
                timer.Stop();
                hit = true;
            }
            if (ManBall.SpriteReference.Position.Y < -50)
            {
                ManBall.SpriteReference.Position = orPos;
                timer.Stop();
                hit = true;
            }
            if (ManBall.SpriteReference.Position.Y > 820)
            {
                ManBall.SpriteReference.Position = orPos;
                timer.Stop();
                hit = true;
            }
            if (ManBall.SpriteReference.Position.X > 1420)
            {
                ManBall.SpriteReference.Position = orPos;
                timer.Stop();
                hit = true;
            }
            if (hit)
            {
                if (App.count > 13 && chance > 0)
                {
                    playSound();
                    Welcome1.Begin();
                    Welcome1.Completed += Welcome1_Completed;
                    timer.Stop();
                }
                else if (App.count < 14 && chance == 0)
                {
                    playSound();
                    Try11.Begin();
                    Try11.Completed += Try5_Completed;
                    timer.Stop();
                }
                else if (chance == 0 && App.count == 14)
                {
                    playSound();
                    Welcome1.Begin();
                    Welcome1.Completed += Welcome3_Completed;
                    timer.Stop();
            }
        }  

 9.旋转障碍物的代码 

这段代码是关于我在游戏页面上设置的每个棕色和红色障碍物的旋转。我通过在 xaml 代码中设置 rotate angle property 为某个角度来实现这种旋转,并且在 C# 代码中也实现了相同的功能。 

public double RotateAngle
        {
            set
            {
                ManSprite.Rotation = value;
                RotateTransform tr = new RotateTransform();
                tr.Angle = value;
                this.RenderTransform = tr;
            }
        } 

我以前的作品  

我是一名学生,我曾从事 Windows Phone 和 Windows 8 的工作。

我的 Windows Phone 应用- http://www.windowsphone.com/en-in/search?q=sudhanshu%20gupta

我的 Windows 8 应用-

1. 学习字母和数字-http://apps.microsoft.com/windows/app/learn-alphabets-numbers/88a28cf3-9aad-405a-8379-54bb7b028003 

2. Hitball-http://apps.microsoft.com/windows/app/hit-ball/deec5ced-172d-4f16-95e3-1331d9897a01

3. Quick Ball-http://apps.microsoft.com/windows/app/quick-ball/76c9a2c5-63d9-4705-8d7f-cbd8089c3fc4 

未来工作

1. 添加更多关卡,并增加与触摸和计分系统相关的一些功能。

2. 这款游戏的多人版本。

3.性能。  

 平台和类别 

    一体机(游戏) 

演示

在这里我想展示我的游戏的整个概念,并且移植工作正在进行中,所以我想通过这个演示来简要介绍我的游戏。它是一个正在建设中的 Metro 应用,我正在将其移植到桌面端,大部分工作已经完成,我即将完成这款游戏。我使用了 C#、XAML 和 Silverlight 5 进行移植。因此,您可以访问 http://www.youtube.com/watch?v=FGMxXXceTj4 来观看 Metro 形式的完整游戏演示,以获得基本概念和玩法。 

 

Shatter Ball 的截图

关卡 1 

 

关卡 5

 

关卡 8 

 

关卡 13

 

关卡 17 

 

关卡 19 

 

我在每个关卡中都包含了游戏内导航选项。 

 

现在是类别 2 的一些截图

关卡 1  

 

关卡 4 

 

导航到同一关卡- 

 

导航到下一关 

历史  

我的第一篇文章。

© . All rights reserved.