首先,了解下WinForm做游戏的基本思路:
做游戏需要的最基本的两个元素,一个是屏幕,另一个就是在屏幕的移动的对象了。
然后,了解下parint事件,WinForm的对象都是继承至Control类的,而Control类中包含一个事件PaintEventHandler Paint,paint翻译过来就是喷绘,类似于绘画,当容器刷新时,就等于重新喷绘一次图像,就会触发此事件。
有了这些,就可以开始做游戏了。
先是定义一个元素(本文是小鸡),这个元素包含一张图片,和X坐标和Y坐标,然后将元素按其坐标,添加进屏幕(WinForm窗口或者其他容器,本文使用PictureBox)中,这样就屏幕就会在刚才定义的X坐标和Y坐标处,出现一个元素的图像。
然后,定义一个定时器timer,每30毫秒运行一次,每次运行都要刷新屏幕。自然屏幕刷新就会触发paint事件啦,本文中的paint事件为GamepictureBox_Paint
那么怎么移动小鸡呢?很简单,在定时器timer的事件里(本文为timer1_Tick)将元素的X坐标改变一下就可以了,然后timer里会进行容器刷新,容器刷新就会触发
paint事件,然后在paint事件里,重新定位下小鸡的X坐标就行了。
不多说了,上代码。
Form页面代码如下:
<span style="color: #0000ff;">namespace<span style="color: #000000;"> Chicken
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">partial <span style="color: #0000ff;">class<span style="color: #000000;"> MyG : Form
{
Element Chicken;<span style="color: #008000;">//<span style="color: #008000;">小鸡类
Road GameRoad;<span style="color: #008000;">//<span style="color: #008000;">陆块类
<span style="color: #0000ff;">public <span style="color: #0000ff;">int RoadCount;<span style="color: #008000;">//<span style="color: #008000;">陆块数
<span style="color: #0000ff;">public <span style="color: #0000ff;">int Length;<span style="color: #008000;">//<span style="color: #008000;">陆块长度
<span style="color: #0000ff;">int EndX;<span style="color: #008000;">//<span style="color: #008000;">设置终点X
EventHandler TimerHandler;<span style="color: #008000;">//<span style="color: #008000;">时间控制手柄
<span style="color: #0000ff;">bool TimerHandlerbool;<span style="color: #008000;">//<span style="color: #008000;">是否已传递时间手柄
EventHandler AgainGame;<span style="color: #008000;">//<span style="color: #008000;">时间控制手柄
<span style="color: #0000ff;">int<span style="color: #000000;"> GamePicX;
<span style="color: #0000ff;">int<span style="color: #000000;"> GamePicY;
<span style="color: #0000ff;">public<span style="color: #000000;"> MyG()
{
InitializeComponent();
Initial(</span><span style="color: #800080;">20</span>,Resources.Bird.Width + <span style="color: #800080;">10</span>);<span style="color: #008000;">//</span><span style="color: #008000;">陆块长度为小鸡长度加10 50个陆块</span>
<span style="color: #000000;"> }
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> Initial(<span style="color: #0000ff;">int</span> Rcount,<span style="color: #0000ff;">int</span><span style="color: #000000;"> Len)
{
AgainGame </span>+= <span style="color: #0000ff;">new</span> EventHandler(AgainGame_Start);<span style="color: #008000;">//</span><span style="color: #008000;">实例化重新开始手柄</span>
TimerHandler += <span style="color: #0000ff;">new</span> EventHandler(Timer_Enabled);<span style="color: #008000;">//</span><span style="color: #008000;">实例化时间手柄</span>
RoadCount = Rcount;<span style="color: #008000;">//</span><span style="color: #008000;">陆块数</span>
Length = Len;<span style="color: #008000;">//</span><span style="color: #008000;">陆块长度</span>
TimerHandlerbool = <span style="color: #0000ff;">false</span>;<span style="color: #008000;">//</span><span style="color: #008000;">未已传递时间手柄</span>
Chicken = <span style="color: #0000ff;">new</span> Element(<span style="color: #800080;">0</span>,<span style="color: #800080;">100</span>-<span style="color: #000000;">Resources.Bird.Height);
GameRoad </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Road(RoadCount,Len);
GamePicX </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
GamePicY </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
Point p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Point();
p.Offset(GamePicX,GamePicY);
GamepictureBox.Location </span>=<span style="color: #000000;"> p;
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> InitialLand(Graphics g)
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">Pen pen = new Pen(Color.Green);</span>
<span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < GameRoad.ListRoad.Count; i++<span style="color: #000000;">)
{
RoadItem Item </span>=<span style="color: #000000;"> GameRoad.ListRoad[i];
</span><span style="color: #0000ff;">if</span> (Item.type == <span style="color: #800080;">1</span>)<span style="color: #008000;">//</span><span style="color: #008000;">如果类型为1 是陆块是陆地</span>
<span style="color: #000000;"> {
Image img </span>=<span style="color: #000000;"> GameRoad.LandImgList[Item.imageIndex];
g.DrawImage(img,</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Rectangle(
Item.start.X,Item.end.Y,Item.end.X </span>-<span style="color: #000000;"> Item.start.X,img.Height
)
);</span><span style="color: #008000;">//</span><span style="color: #008000;">画陆块</span>
<span style="color: #000000;"> }
}
EndX = GameRoad.ListRoad.ElementAt(RoadCount - <span style="color: #800080;">1).end.X;<span style="color: #008000;">//<span style="color: #008000;">设置终点X
<span style="color: #0000ff;">this.GamepictureBox.Width =<span style="color: #000000;"> EndX;
}
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 时间控制函数
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">/// <span style="color: #808080;"><param name="sender">
<span style="color: #808080;">/// <span style="color: #808080;"><param name="e">
<span style="color: #0000ff;">private <span style="color: #0000ff;">void Timer_Enabled(<span style="color: #0000ff;">object<span style="color: #000000;"> sender,EventArgs e)
{
TimerHandler -= <span style="color: #0000ff;">new<span style="color: #000000;"> EventHandler(Timer_Enabled);
timer1.Enabled = <span style="color: #0000ff;">false<span style="color: #000000;">;
Dead D = <span style="color: #0000ff;">new<span style="color: #000000;"> Dead(AgainGame);
D.Show();
}
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">///<span style="color: #008000;"> 游戏开始控制函数
<span style="color: #808080;">/// <span style="color: #808080;">
<span style="color: #808080;">/// <span style="color: #808080;"><param name="sender">
<span style="color: #808080;">/// <span style="color: #808080;"><param name="e">
<span style="color: #0000ff;">private <span style="color: #0000ff;">void AgainGame_Start(<span style="color: #0000ff;">object<span style="color: #000000;"> sender,EventArgs e)
{
AgainGame -= <span style="color: #0000ff;">new<span style="color: #000000;"> EventHandler(AgainGame_Start);
Initial(RoadCount,Length);
timer1.Enabled = <span style="color: #0000ff;">true<span style="color: #000000;">;
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> timer1_Tick(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,EventArgs e)
{
</span><span style="color: #008000;">//</span><span style="color: #008000;">设置屏幕移动</span>
<span style="color: #0000ff;">if</span> ((Chicken.x + <span style="color: #0000ff;">this</span>.GamepictureBox.Location.X) > <span style="color: #0000ff;">this</span>.Width / <span style="color: #800080;">2</span> &&<span style="color: #000000;">
(</span><span style="color: #0000ff;">this</span>.GamepictureBox.Width + <span style="color: #0000ff;">this</span>.GamepictureBox.Location.X) > <span style="color: #0000ff;">this</span><span style="color: #000000;">.Width)
{
</span><span style="color: #0000ff;">int</span> OffX = <span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (Chicken.IsSpeedUp)
{
OffX </span>= <span style="color: #800080;">2</span><span style="color: #000000;">;
}
GamePicX </span>= GamePicX -<span style="color: #000000;"> OffX;
Point p </span>=<span style="color: #000000;"> GamepictureBox.Location;
p.Offset(GamePicX,GamePicY);
GamepictureBox.Location </span>=<span style="color: #000000;"> p;
}
</span><span style="color: #0000ff;">if</span> (Chicken.x + Chicken.bmp.Width / <span style="color: #800080;">2</span> >=<span style="color: #000000;"> EndX)
{
timer1.Enabled </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
Replay R </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Replay(AgainGame);
R.Show();
}
</span><span style="color: #0000ff;">int</span> CurrentRoadsIndex = Chicken.x / Length;<span style="color: #008000;">//</span><span style="color: #008000;">获取当前为第几个陆块</span>
<span style="color: #0000ff;">if</span> (CurrentRoadsIndex >= RoadCount) { CurrentRoadsIndex = RoadCount - <span style="color: #800080;">1</span>; }<span style="color: #008000;">//</span><span style="color: #008000;">如果大于定义总陆块数 设置为最大数</span>
<span style="color: #0000ff;">if</span> (CurrentRoadsIndex < <span style="color: #800080;">0</span>) { CurrentRoadsIndex = <span style="color: #800080;">0</span><span style="color: #000000;">; }
</span><span style="color: #0000ff;">if</span> (GameRoad.ListRoad.ElementAt(CurrentRoadsIndex).type == <span style="color: #800080;">0</span>)<span style="color: #008000;">//</span><span style="color: #008000;">如果当前陆块为空 </span>
<span style="color: #000000;"> {
<span style="color: #008000;">//<span style="color: #008000;"> Y坐标等于空陆块Y坐标
<span style="color: #0000ff;">if ((Chicken.y + Chicken.bmp.Height) ==<span style="color: #000000;"> GameRoad.ListRoad.ElementAt(CurrentRoadsIndex).start.Y)
{
<span style="color: #0000ff;">int DepthEndX = GameRoad.ListRoad.ElementAt(CurrentRoadsIndex).end.X;<span style="color: #008000;">//<span style="color: #008000;">X下落点为当前陆块的X
<span style="color: #0000ff;">if (CurrentRoadsIndex + <span style="color: #800080;">1 <= RoadCount - <span style="color: #800080;">1)<span style="color: #008000;">//<span style="color: #008000;">如果下一个陆块存在
<span style="color: #000000;"> {
<span style="color: #0000ff;">if (GameRoad.ListRoad.ElementAt(CurrentRoadsIndex + <span style="color: #800080;">1).type == <span style="color: #800080;">0)<span style="color: #008000;">//<span style="color: #008000;">如果下一个陆块也是空
<span style="color: #000000;"> {
DepthEndX = GameRoad.ListRoad.ElementAt(CurrentRoadsIndex + <span style="color: #800080;">1).end.X;<span style="color: #008000;">//<span style="color: #008000;">X下落点为下一个陆块的X
<span style="color: #000000;"> }
}
<span style="color: #0000ff;">if (Chicken.x + Chicken.bmp.Width < DepthEndX)<span style="color: #008000;">//<span style="color: #008000;">对象的坐标加对象的宽度 小于空陆块的尾坐标
<span style="color: #000000;"> {
Chicken.IsFalling </span>= <span style="color: #0000ff;">true</span>;<span style="color: #008000;">//</span><span style="color: #008000;">下降</span>
<span style="color: #0000ff;">if</span> (!<span style="color: #000000;">TimerHandlerbool)
{
Chicken.GetHandler(TimerHandler);</span><span style="color: #008000;">//</span><span style="color: #008000;">传递时间控制手柄</span>
TimerHandlerbool = <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
}
}
}
GamepictureBox.Refresh();
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> GamepictureBox_Paint(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,PaintEventArgs e)
{
Chicken.Draw(e.Graphics);
InitialLand(e.Graphics);
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> MyG_KeyDown(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,KeyEventArgs e)
{
</span><span style="color: #0000ff;">if</span> (e.KeyData ==<span style="color: #000000;"> Keys.Right)
{ Chicken.IsRuning </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">; }
</span><span style="color: #0000ff;">if</span> (e.KeyData == Keys.Space &&<span style="color: #000000;"> Chicken.IsRuning)
{ Chicken.IsSpeedUp </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">; }
</span><span style="color: #0000ff;">if</span> (e.KeyData ==<span style="color: #000000;"> Keys.Up)
{ Chicken.IsJumping </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">; }
</span><span style="color: #0000ff;">int</span> CurrentRoadsIndex = Chicken.point.X / Length;<span style="color: #008000;">//</span><span style="color: #008000;">当前陆块</span>
<span style="color: #0000ff;">if</span> (e.KeyData ==<span style="color: #000000;"> Keys.Left)
{ Chicken.Back </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">; }
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> MyG_KeyUp(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,KeyEventArgs e)
{
Chicken.IsRuning </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
Chicken.IsSpeedUp </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
Chicken.Back </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> GamepictureBox_MouseDown(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,MouseEventArgs e)
{
Chicken.x </span>=<span style="color: #000000;"> e.X;
Chicken.y </span>=<span style="color: #000000;"> e.Y;
}
}
}
元素类,定义几个变量来控制对象,注释还算比较多,就不一一解释了,如下:
<span style="color: #0000ff;">namespace<span style="color: #000000;"> Chicken
{
<span style="color: #0000ff;">class<span style="color: #000000;"> Element
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> x;
<span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> y;
<span style="color: #0000ff;">public <span style="color: #0000ff;">int JumpHeight = <span style="color: #800080;">0;<span style="color: #008000;">//<span style="color: #008000;">跳跃高度
<span style="color: #0000ff;">private <span style="color: #0000ff;">bool JumpTop = <span style="color: #0000ff;">false;<span style="color: #008000;">//<span style="color: #008000;">是否跳到最高点
<span style="color: #0000ff;">public <span style="color: #0000ff;">int FallHeight = <span style="color: #800080;">0;<span style="color: #008000;">//<span style="color: #008000;">跳跃高度
<span style="color: #0000ff;">public <span style="color: #0000ff;">bool FallDepth = <span style="color: #0000ff;">false;<span style="color: #008000;">//<span style="color: #008000;">是否跳到最高点
<span style="color: #0000ff;">public <span style="color: #0000ff;">int BasicSpeed = <span style="color: #800080;">1;<span style="color: #008000;">//<span style="color: #008000;">基本速度
<span style="color: #0000ff;">public <span style="color: #0000ff;">bool IsRuning = <span style="color: #0000ff;">false;<span style="color: #008000;">//<span style="color: #008000;">是否移动
<span style="color: #0000ff;">public <span style="color: #0000ff;">bool Back = <span style="color: #0000ff;">false;<span style="color: #008000;">//<span style="color: #008000;">是否后退
<span style="color: #0000ff;">public <span style="color: #0000ff;">bool IsJumping = <span style="color: #0000ff;">false;<span style="color: #008000;">//<span style="color: #008000;">是否跳跃
<span style="color: #0000ff;">public <span style="color: #0000ff;">bool IsSpeedUp = <span style="color: #0000ff;">false;<span style="color: #008000;">//<span style="color: #008000;">是否加速
<span style="color: #0000ff;">public <span style="color: #0000ff;">bool IsFalling = <span style="color: #0000ff;">false;<span style="color: #008000;">//<span style="color: #008000;">是否降落
<span style="color: #0000ff;">public Image bmp;<span style="color: #008000;">//<span style="color: #008000;">对象图形
<span style="color: #0000ff;">public Image img;<span style="color: #008000;">//<span style="color: #008000;">对象图形 暂不使用
<span style="color: #0000ff;">public Point point;<span style="color: #008000;">//<span style="color: #008000;">坐标 暂不使用
<span style="color: #0000ff;">public<span style="color: #000000;"> EventHandler TimerHandler;
<span style="color: #0000ff;">public Element(<span style="color: #0000ff;">int x,<span style="color: #0000ff;">int<span style="color: #000000;"> y)
{
bmp =<span style="color: #000000;"> Resources.Bird;
<span style="color: #0000ff;">this.x =<span style="color: #000000;"> x;
<span style="color: #0000ff;">this.y =<span style="color: #000000;"> y;
}
<span style="color: #0000ff;">public Element(<span style="color: #0000ff;">int x,<span style="color: #0000ff;">int<span style="color: #000000;"> y,Image img)
{
bmp =<span style="color: #000000;"> Resources.Bird;
<span style="color: #0000ff;">this.x =<span style="color: #000000;"> x;
<span style="color: #0000ff;">this.y =<span style="color: #000000;"> y;
<span style="color: #0000ff;">this.img =<span style="color: #000000;"> img;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> Draw(Graphics G)
{
G.DrawImage(bmp,x,y);
Move();
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> Move()
{
<span style="color: #0000ff;">if<span style="color: #000000;"> (IsFalling)
{
IsSpeedUp = <span style="color: #0000ff;">false<span style="color: #000000;">;
IsJumping = <span style="color: #0000ff;">false<span style="color: #000000;">;
IsRuning = <span style="color: #0000ff;">false<span style="color: #000000;">;
<span style="color: #0000ff;">if (!<span style="color: #000000;">FallDepth)
{
<span style="color: #0000ff;">this.y += BasicSpeed <span style="color: #800080;">2<span style="color: #000000;">;
FallHeight += BasicSpeed <span style="color: #800080;">2<span style="color: #000000;">;
}
<span style="color: #0000ff;">if (FallHeight == <span style="color: #800080;">50<span style="color: #000000;">)
{
FallDepth = <span style="color: #0000ff;">true<span style="color: #000000;">;
IsFalling = <span style="color: #0000ff;">false<span style="color: #000000;">;
TimerHandler(<span style="color: #0000ff;">null,<span style="color: #0000ff;">null<span style="color: #000000;">);
}</span><span style="color: #008000;">//</span><span style="color: #008000;">如果下降了50 则下降完成 不在下降</span>
<span style="color: #000000;">
}
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (Back)
{
bmp </span>=<span style="color: #000000;"> Resources.BirdBack;
</span><span style="color: #0000ff;">this</span>.x -=<span style="color: #000000;"> BasicSpeed;
}
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (IsSpeedUp)
{
bmp </span>=<span style="color: #000000;"> Resources.Bird;
</span><span style="color: #0000ff;">this</span>.x += BasicSpeed*<span style="color: #800080;">3</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #000000;"> (IsRuning)
{
bmp </span>=<span style="color: #000000;"> Resources.Bird;
</span><span style="color: #0000ff;">this</span>.x +=<span style="color: #000000;"> BasicSpeed;
}
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (IsJumping)
{
</span><span style="color: #0000ff;">if</span> (!<span style="color: #000000;">JumpTop)
{
</span><span style="color: #0000ff;">this</span>.y += BasicSpeed * (-<span style="color: #800080;">2</span><span style="color: #000000;">);
JumpHeight </span>+= BasicSpeed * (<span style="color: #800080;">2</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">this</span>.y += BasicSpeed * <span style="color: #800080;">2</span><span style="color: #000000;">;
JumpHeight </span>+= BasicSpeed * (-<span style="color: #800080;">2</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">if</span> (JumpHeight == <span style="color: #800080;">30</span>) { JumpTop = <span style="color: #0000ff;">true</span>; }<span style="color: #008000;">//</span><span style="color: #008000;">如果跳跃了30 则跳跃到顶部 不在上升</span>
<span style="color: #0000ff;">if</span> (JumpHeight == <span style="color: #800080;">0</span>) { JumpTop = <span style="color: #0000ff;">false</span>; IsJumping = <span style="color: #0000ff;">false</span>; }<span style="color: #008000;">//</span><span style="color: #008000;">如果回到地面 不在下降 跳跃结束</span>
<span style="color: #000000;"> }
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> GetHandler(EventHandler TimerHandler)
{
</span><span style="color: #0000ff;">this</span>.TimerHandler =<span style="color: #000000;"> TimerHandler;
}
}
}
然后,创建陆块类,如下:
<span style="color: #0000ff;">using<span style="color: #000000;"> System.Text;
<span style="color: #0000ff;">using<span style="color: #000000;"> System.Drawing;
<span style="color: #0000ff;">using<span style="color: #000000;"> Chicken.Properties;
<span style="color: #0000ff;">namespace<span style="color: #000000;"> Chicken
{
<span style="color: #0000ff;">class<span style="color: #000000;"> Road
{
<span style="color: #0000ff;">private Random rand = <span style="color: #0000ff;">new<span style="color: #000000;"> Random();
</span><span style="color: #0000ff;">public</span> List<Image> LandImgList = <span style="color: #0000ff;">new</span> List<Image><span style="color: #000000;">();
</span><span style="color: #0000ff;">public</span> List<RoadItem> ListRoad = <span style="color: #0000ff;">new</span> List<RoadItem><span style="color: #000000;">();
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> RoadY = <span style="color: #800080;">100</span>;<span style="color: #008000;">//</span><span style="color: #008000;">陆地的Y坐标</span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 构建陆地
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="Number"></span><span style="color: #008000;">陆块数量 必须大于2</span><span style="color: #808080;"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="Length"></span><span style="color: #008000;">陆块长度</span><span style="color: #808080;"></param></span>
<span style="color: #0000ff;">public</span> Road(<span style="color: #0000ff;">int</span> Number,<span style="color: #0000ff;">int</span><span style="color: #000000;"> Length)
{
</span><span style="color: #0000ff;">if</span> (Length < <span style="color: #800080;">2</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;
RoadItem StartItem </span>= <span style="color: #0000ff;">new</span> RoadItem(<span style="color: #800080;">0</span><span style="color: #000000;">,Length);
StartItem.imageIndex </span>= <span style="color: #800080;">0</span>;<span style="color: #008000;">//</span><span style="color: #008000;">选择陆块的图像 0为第一个平地 1为第二个左倾斜 2为第三个右倾斜</span>
StartItem.type = <span style="color: #800080;">1</span><span style="color: #000000;">;
ListRoad.Add(StartItem);</span><span style="color: #008000;">//</span><span style="color: #008000;">先添加一个陆块 第一个路块必须是陆地</span>
<span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < Number - <span style="color: #800080;">2</span>; i++<span style="color: #000000;">)
{
</span><span style="color: #0000ff;">int</span> Temp = rand.Next(<span style="color: #800080;">0</span>,<span style="color: #800080;">3</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">int</span> Index = <span style="color: #800080;">0</span>;<span style="color: #008000;">//</span><span style="color: #008000;">选择陆块的图像 0为第一个平地 1为第二个左倾斜 2为第三个右倾斜 这里暂时不使用</span>
<span style="color: #0000ff;">int</span> Ang = <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span> (Temp == <span style="color: #800080;">0</span><span style="color: #000000;">)
{
Ang </span>= -<span style="color: #800080;">20</span><span style="color: #000000;">;
Index </span>= <span style="color: #800080;">2</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> (Temp == <span style="color: #800080;">1</span><span style="color: #000000;">)
{
Ang </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
Index </span>= <span style="color: #800080;">0</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
Ang </span>= <span style="color: #800080;">20</span><span style="color: #000000;">;
Index </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;
}
RoadItem CItem </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> RoadItem(Ang,Length);
</span><span style="color: #008000;">//</span><span style="color: #008000;">CItem.imageIndex = Index;获取随机陆块的图片 这样获取Y值需要写一个一元一次方程获取</span>
CItem.imageIndex = <span style="color: #800080;">0</span>;<span style="color: #008000;">//</span><span style="color: #008000;">这里设置全为第一个图像 这样获取Y值比较方便</span>
<span style="color: #0000ff;">if</span> (rand.Next(<span style="color: #800080;">0</span>,<span style="color: #800080;">4</span>) == <span style="color: #800080;">1</span>)<span style="color: #008000;">//</span><span style="color: #008000;">4分之1的可能性为空陆块</span>
CItem.type = <span style="color: #800080;">0</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
CItem.type </span>= <span style="color: #800080;">1</span><span style="color: #000000;">;
ListRoad.Add(CItem);</span><span style="color: #008000;">//</span><span style="color: #008000;">添加中间的陆块 添加进陆块列表</span>
<span style="color: #000000;"> }
RoadItem EndItem </span>= <span style="color: #0000ff;">new</span> RoadItem(<span style="color: #800080;">0</span><span style="color: #000000;">,Length);
EndItem.imageIndex </span>= <span style="color: #800080;">0</span>;<span style="color: #008000;">//</span><span style="color: #008000;">选择陆块的图像 0为第一个平地 1为第二个左倾斜 2为第三个右倾斜 </span>
EndItem.type = <span style="color: #800080;">1</span><span style="color: #000000;">;
ListRoad.Add(EndItem);</span><span style="color: #008000;">//</span><span style="color: #008000;">添加最后一个陆块</span>
<span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = <span style="color: #800080;">0</span>; i < ListRoad.Count; i++<span style="color: #000000;">)
{
RoadItem DrawItem </span>=<span style="color: #000000;"> ListRoad[i];
</span><span style="color: #0000ff;">if</span> (i == <span style="color: #800080;">0</span><span style="color: #000000;">)
{ DrawItem.start </span>= <span style="color: #0000ff;">new</span> Point(<span style="color: #800080;">0</span><span style="color: #000000;">,RoadY); }
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{ DrawItem.start </span>= ListRoad[i - <span style="color: #800080;">1</span><span style="color: #000000;">].end; }
DrawItem.end </span>= <span style="color: #0000ff;">new</span> Point(DrawItem.start.X +<span style="color: #000000;"> DrawItem.length,RoadY);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">为每一个陆块 定义 起始和终止向量坐标</span>
<span style="color: #000000;">
LandImgList.Add(Resources.land);
</span><span style="color: #008000;">//</span><span style="color: #008000;">为陆块使用的图片列表 赋值</span>
<span style="color: #000000;"> }
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> RoadItem
{
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> angle;
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> length;<span style="color: #008000;">//</span><span style="color: #008000;">陆块长度</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> type;<span style="color: #008000;">//</span><span style="color: #008000;">0为空,1为陆地</span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> imageIndex = <span style="color: #800080;">0</span>;<span style="color: #008000;">//</span><span style="color: #008000;">使用的图片</span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 构建路块
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="angle"></param></span>
<span style="color: #808080;">///</span> <span style="color: #808080;"><param name="length"></span><span style="color: #008000;">陆块长度</span><span style="color: #808080;"></param></span>
<span style="color: #0000ff;">public</span> RoadItem(<span style="color: #0000ff;">int</span> angle,<span style="color: #0000ff;">int</span><span style="color: #000000;"> length)
{
</span><span style="color: #0000ff;">this</span>.angle =<span style="color: #000000;"> angle;
</span><span style="color: #0000ff;">this</span>.length =<span style="color: #000000;"> length;
}
</span><span style="color: #0000ff;">public</span> Point start;<span style="color: #008000;">//</span><span style="color: #008000;">陆块起始坐标</span>
<span style="color: #0000ff;">public</span> Point end;<span style="color: #008000;">//</span><span style="color: #008000;">陆块终止坐标</span>
<span style="color: #000000;">
}
}
辅助类,这两个类是两个窗口,我闲MessageBox不太好看,就换了个窗口,但貌似也没好看到那里去。。。哈哈
<span style="color: #0000ff;">namespace<span style="color: #000000;"> Chicken
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">partial <span style="color: #0000ff;">class<span style="color: #000000;"> Replay : Form
{
EventHandler Again;
<span style="color: #0000ff;">public<span style="color: #000000;"> Replay(EventHandler Again)
{
<span style="color: #0000ff;">this.Again =<span style="color: #000000;"> Again;
InitializeComponent();
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> button1_Click(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,EventArgs e)
{
</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.Close();
Again(</span><span style="color: #0000ff;">null</span>,<span style="color: #0000ff;">null</span><span style="color: #000000;">);
}
}
}
<span style="color: #0000ff;">namespace<span style="color: #000000;"> Chicken
{
<span style="color: #0000ff;">public <span style="color: #0000ff;">partial <span style="color: #0000ff;">class<span style="color: #000000;"> Dead : Form
{
EventHandler Again;
<span style="color: #0000ff;">public<span style="color: #000000;"> Dead(EventHandler Again)
{
<span style="color: #0000ff;">this.Again =<span style="color: #000000;"> Again;
InitializeComponent();
}
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> button1_Click(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,<span style="color: #0000ff;">null</span><span style="color: #000000;">);
}
}
}
这两个类是死亡窗口和重新开始窗口。源代码下载地址
源代码中,和文中的代码稍微有点不一样,如果我记得没错是这里,如下:
= EndX)
是修改,如果鸡身的一半以上超过终点,到达终点,游戏结束。这个源码上传时没修改这里。
不过不影响运行啦,但是还有一些小BUG。。
如果想升级这个游戏也很简答,比如,定义一个炮弹类,随机发一个。
当炮弹的矩形和小鸡的矩形相碰撞了,就死亡啦,矩形相撞有函数的,有兴趣的朋友可以自己扩展。
补充:上是跳跃,左右可以移动,空格是加速,鼠标全屏飞。。。。
开发环境:VS2008。
代码很简单,可以复制到别的环境中运行。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|