2D游戏初步

2007-5-16 2D游戏初步

今天在网上找到一篇文章,2D Game Primer (Visual C#)
http://blogs.msdn.com/coding4fun/archive/2007/02/20/1727608.aspx
文中对2D游戏进行了初步探讨,看过之后受益匪浅。

    首先介绍了游戏循环。对于计算机游戏而言,与通常的Windows Forms applications 或者是Web Formsapplications不同。后者是所谓的“事件驱动”,只要坐在那里等着用户通过键盘鼠标或者其他什么设备进行输入激发事件,然后再响应就行了。而前者则不行,就算用户什么也不做,程序也要让游戏角色动起来,计算AI,播放声音或者做些其他什么。故而在大多数游戏中就使用了“游戏循环”(Game Loop)。伪代码如下:
   While (game is running)
        Check for input
        Update all objects in the game
        Draw all objects in the game
但是上述循环会造成cpu的占有率为100%,并且操作系统没有机会处理其他消息,于是程序就会变成“没有响应”。解决问题的方法有很多,作者采用了一种不是最有效率但是最简单的方法:在windows 窗体的paint事件中处理循环体,最后再调用Invalidate()方法。这样,循环就由不断的事件激发来替代。(Invalidate方法会激发paint事件)
    接着说到了精灵(sprites),精灵是一个出现在视频游戏中二维图片。通过指定其左上角和高宽来确定其位置以及大小。文中推荐使用浮点型而不是整型来记录坐标。因为在一秒之内精灵可能被移动上百次,在次秒级(subsecond)其位置可能是形如 1.45,12.67这样的数据。使用浮点数可以更好的计算出实际的位置,在绘制图形时再将其转换为屏幕上的整数位置。
    向量(vector),简单的说向量就是偏移量。向量(4,2)即是说从某个开始位置沿x轴移动4个单位长度,沿y轴移动2个单位长度。向量可以加减。(4,2) + (2,4) = (6,6).
    另外,速度和速率是两个不同的概念。速度除了表明移动得有多快,还表明了移动的方向。可以将速度存储在向量(s,t)中。比如对于起点(x,y),通过将其相加可以得到一个新的位置: (x,y) + (s,t) = (x+s, y+t)。
例如,在(4,10)有一个精灵,其速度为(1,0)。(1,0)意味着精灵只是沿着x轴移动。(4,10) + (1,0) = (5,10). 如果每秒钟都重复该加法,那么精灵在屏幕上每秒钟移动1个像素。可以通过改变 s,t 的值来任意设置方向和速率。
    基于时钟的动画。由于计算机的性能不同,一秒钟内游戏循环的次数也有所不同。那么同样的速度 (0,10)在不同的计算机上的表现也不同(在每一次循环中进行上面提到的加法)。解决的方法如下:
    //Move the sprite based on the velocity
    Location.X += Velocity.X * (float)elapsedTime;
    Location.Y += Velocity.Y * (float)elapsedTime;
    简单的碰撞检测。简单碰撞可以通过精灵的位置和大小以及碰撞的区域来进行描述。代码如下:
private bool collide()
{
  return ! ( sprite1.Location.X > sprite2.Location.X + sprite2.Size.Width
    || sprite1.Location.X + sprite1.Size.Width  < sprite2.Location.X
    || sprite1.Location.Y > sprite2.Location.Y + sprite2.Size.Height
    || sprite1.Location.Y + sprite1.Size.Height < sprite2.Location.Y);
}

OK,基础知识就到此为止了,在网站上又找到了一个系列文章 Beginning Game Development。过两天再看看 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值