第4节 角色的状态、运动分析和简单的碰撞检测——XNA4.0 2D游戏开发入门教程

既然游戏角色有好几张图片,那么根据什么决定使用哪一张图片呢?

一个常见的好方法是给角色类加一个枚举,枚举是角色的各种状态,然后在Update或者Draw中写一个switch,根据这个枚举选择显示哪张图片。

有的时候,会有需要状态组合的情况,比如状态有走路、站立,也有开枪和不开枪,组合之后就是走路开枪、站立开枪之类的状态,这时可以使用C#的标志枚举,用法如下:

        [Flags]
        //Flags声明这是个标志枚举
        public enum MeiteluStateEnum
        {

            IsStanding = 0,

            IsShooting = 2,
            IsDieing1 = 4,
            IsDieing2 = 8,

            IsLeft = 16,//左方向

        }

标志枚举中的各个枚举值使用2的倍数,然后使用异或^来减去一个枚举,使用或|来加上一个枚举。

但是角色光会改变图片是不行的,还需要在游戏画面中改变位置来进行运动,这需要通过改变角色的x、y值来实现。

普通的移动很简单,但是遇到跳跃、滑翔之类的动作可能就要费一番功夫了,这个话题不是本教程讨论的内容,这里先不谈。

在几乎任何游戏开发书籍中都会谈到的就是碰撞检测,这也是几乎所有游戏都要用到的一个东西。我们给每个角色添加类似以下的代码:

        public Rectangle CollisionRect
        {
            get
            {
                return new Rectangle(
                    (int)X + collisionOffset,
                    (int)Y + collisionOffset,
                    frameSize.X - (collisionOffset * 2),
                    frameSize.Y - (collisionOffset * 2)
                    );
            }
        }

这是一个矩形包围盒,意思是游戏角色周围有一个矩形,这个矩形和其他角色的矩形包围盒相交,就是碰撞到,否则就是没碰撞到。

其中,collisionOffset是指的矩形包围盒的矩形离图片边缘的距离,上边代码中的四个collisionOffset可以不一样,各自使用一个变量。

使用类似以下的方法检查碰撞检测:

role1.CollisionRect.Intersects(role2.CollisionRect)

至于这句代码在哪里,最好放一个管理所有角色对象的管理类里,或者根本就是Game1类,而不是某一个角色里,这样比较好组织代码。

游戏一般还得有背景,其实这也很简单,背景也可以看做是一种特殊的角色,只不过这个角色比较“愣”,就会在后边罚站,而不会随便动。

如果Update里的switch中的代码过多,可以考虑重构成多态,然后得到一个状态模式。重构的内容,一两句话说不清楚,可以参考《重构:改善既有代码的设计》。状态模式用在这里,再合适不过了,不过还请读者自己查阅设计模式相关书籍资料。

如果角色有很多种碰撞检测算法,跟障碍物碰撞和跟敌人碰撞返回的Rectangle不一样,也可以用一个策略模式优化代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jether

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值