Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣

简介:

今天这套主题,仅仅是通过改进让游戏更加有趣,游戏中的细节永远是耐人寻味,有的游戏团队为此付诸努力甚至成为整个项目的成功关键。

我们将在本次完成加血、背景、更加完美的碰撞,让游戏变得更加有趣。

首先改进碰撞范围,对于主角来说,并不需要完全的碰撞,而只有身体的部分,所以将Rect设置的小一点,例如Width = 32, Height = 36

我们再加上一个食物类,让游戏中有加血的方法,具体效果如下:

食物类的代码如下:

代码

   
   
public class ClassFood : Canvas
{
private Rectangle _rectangle = new Rectangle()
{ Width = 32 , Height = 32 , Stroke = new SolidColorBrush(Colors.Green) };
Image Food;
ImageSource[] FoodFrames
= new ImageSource[ 4 ];
public ClassFood()
{
Food
= new Image();
BitmapImage bitmap
= new BitmapImage( new Uri( @" Src/food.png " , UriKind.Relative));
bitmap.ImageOpened
+= new EventHandler < RoutedEventArgs > (bitmap_ImageOpened);
Food.Source
= bitmap;
this .Children.Add(Food);

this .Children.Add(_rectangle);
}
private static int _framecont = 0 ;
void bitmap_ImageOpened( object sender, RoutedEventArgs e)
{
Food.Source
= sender as BitmapImage;
for ( int i = 0 ; i < 4 ; i ++ )
{
WriteableBitmap wb
= new WriteableBitmap( 32 , 32 );
wb.Render(Food,
new TranslateTransform() { X = - 32 * i, Y = 0 });
wb.Invalidate();
FoodFrames[i]
= (ImageSource)wb;
}
Food.Source
= FoodFrames[_framecont];
_framecont
++ ;
if (_framecont >= 4 )
_framecont
= 0 ;
}
/// <summary>
/// 移动速度
/// </summary>
public double Speed = 1 ;

public double X
{
get { return Canvas.GetLeft( this ); }
set { Canvas.SetLeft( this , value); }
}
public double Y
{
get { return Canvas.GetTop( this ); }
set { Canvas.SetTop( this , value); }
}
public Rect MyRect
{
get
{
return new Rect(X, Y, _rectangle.Width, _rectangle.Height);
}
}
}

可以看出,这个部分的代码和固体类有很接近的地方,所以我们也同样的写一个组,来管理和创建整个食物动画

 

代码

   
   
public class ClassFoodGroup :Canvas
{
Random _random
= new Random(( int )DateTime.Now.Ticks);
public ClassFoodGroup( int max)
{
int segment = ( int )(MainPage.ScreenWidth - 64 ) / max * 2 ;
for ( int i = 0 ; i < max; i ++ )
{
ClassFood food
= new ClassFood();
this .Children.Add(food);
food.X
= _random.Next(segment * i, segment * (i + 1 ));
food.Y
= _random.Next(( int )MainPage.ScreenHeight - 64 ) + MainPage.ScreenHeight;
}
DispatcherTimer dispatcherTimer
= new DispatcherTimer();
dispatcherTimer.Tick
+= new EventHandler(TickGameFrameLoop);
dispatcherTimer.Interval
= TimeSpan.FromMilliseconds( 10 ); // 重复间隔
dispatcherTimer.Start();
}
private void TickGameFrameLoop( object sender, EventArgs e)
{
foreach (UIElement s in this .Children)
{
if (s is ClassFood)
{
ClassFood cloud
= (s as ClassFood);
if (cloud.Y >= - 32 )
cloud.Y
-= cloud.Speed;
else
cloud.Y
= _random.Next( 400 - 64 ) + 400 ;
}
}
}
}

然后加入到游戏的主循环当中,进行检测判定:


  
  
foreach (ClassFood food in foodgroup.Children)
{
Rect rt
= food.MyRect;
rt.Intersect(herorect);
if ( ! double .IsInfinity(rt.Height) && ! double .IsInfinity(rt.Width))
{
flyerlife.Add(
10 );
food.Y
= - 32 ;
break ;
}
}

好了,F5运行一下,看看效果,相信你会觉得有点意思了,当然了,其他部分的代码需要工程支持,还是先下载代码直接看吧:)

还有一些小细节需要增加,比如背景,背景天空的加入可以让游戏更加丰满,但是背景是有一定的要求的,它肯定不可能一直在上升,于是我们搞了一个背景类来处理内部逻辑。

 

代码

   
   
public class ClassBackGroup:Canvas
{
// 天空的高度,在这里顺便了解一下在Silverlight里取得图片的宽高
private int skyHeight = 1000 ;
public ClassBackGroup()
{
Image _Image
= new Image();
BitmapImage bitmap
= new BitmapImage( new Uri( @" Src/sky.jpg " , UriKind.Relative)) ;
bitmap.ImageOpened
+= new EventHandler < RoutedEventArgs > (bitmap_ImageOpened);
_Image.Source
= bitmap;
this .Children.Add(_Image);
DispatcherTimer dispatcherTimer
= new DispatcherTimer();
dispatcherTimer.Tick
+= new EventHandler(TickBackGroupLogic);
dispatcherTimer.Interval
= TimeSpan.FromMilliseconds( 40 ); // 重复间隔
dispatcherTimer.Start();
}
// 在这个完成事件中可以取得bitmap的高度,同样宽度也可以用类似的方式
void bitmap_ImageOpened( object sender, RoutedEventArgs e)
{
skyHeight
= (sender as BitmapSource).PixelHeight;
}
public void TickBackGroupLogic( object sender, EventArgs e)
{
// 如果移动大于屏幕减去天空的高度,那么就不能再动了
if (Y < 400 - skyHeight)
Y
-= Speed;
}
public double Speed = 0.5 ;

public double Y
{
get { return Canvas.GetTop( this ); }
set { Canvas.SetTop( this , value); }
}
}

最后做一点点的修改,将辅助的线条全部隐蔽,运行效果就是如下了:

基本上已经出来一个游戏的大概形状,在这个基础上,可以做一些修改就变成了更加丰富的游戏,预计在Flyer07就结束这套纯用代码实现的Silverlight小游戏。

本Flyer06的源代码在这里下载。



本文转自nowpaper 51CTO博客,原文链接:http://blog.51cto.com/nowpaper/712583

相关文章
|
7月前
|
存储 开发框架 .NET
【C#】C# 基础语法与游戏开发
【1月更文挑战第21天】【C#】C# 基础语法与游戏开发
|
C# 图形学
C#之四十九 游戏编程周每日总结
C#之四十九 游戏编程周每日总结
55 0
|
3月前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
84 0
|
5月前
|
存储 缓存 C#
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏
|
7月前
|
程序员 C# Python
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
|
7月前
|
存储 程序员 C#
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
|
7月前
|
存储 C# 开发工具
22.C# 中使用变量记录玩家创建的角色名:实现与游戏角色的互动
22.C# 中使用变量记录玩家创建的角色名:实现与游戏角色的互动
65 0
|
7月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
156 2
|
7月前
|
存储 开发框架 .NET
【C#】认识C# (为了游戏开发 O(≧口≦)O)
【1月更文挑战第26天】【C#】认识C# (为了游戏开发 O(≧口≦)O)