木有错!又是一款足球射门游戏!《王牌射手》他来了!

之前作者借着CocosCreator得3D性能和官方活动,开发了一款点球大战得3D射门游戏。
既然3D都来了,那么2D得射门游戏《王牌射手》也是如期而至了!(掌声鼓励)

游戏商城地址:王牌射手 | Cocos Store

以作者本身得能力,游戏得策划当然是需要抄袭!不对,是借鉴呀 :blush:,借鉴了微信小游戏**《天天足球》**得玩法。简单得介绍下玩法:就是足球会于场中得球员发生碰撞,如果球员碰到了我方球员,球员会90°以内左右旋转,玩家点击屏幕发射足球,在固定得发球数量内,达到进球门槛即判定为过关呀。

有的人会说,我看不懂哎 :zipper_mouth_face: 没有关系,可以点击《王牌射手》或者搜索微信小游戏“天天足球”进行体验。

开发过程:

这款足球得玩法相对来说算是比较经典得物理游戏,所以游戏中使用了CocosCreator中自带得Box2d系统。

在测试过程可以使用绘制调制信息来查看游戏是否有问题。

PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb |
        EPhysics2DDrawFlags.Pair |
        EPhysics2DDrawFlags.CenterOfMass |
        EPhysics2DDrawFlags.Joint |
        EPhysics2DDrawFlags.Shape;

使用了box2d中得碰撞事件回调来对球碰到了不同得人物进行处理。

 PhysicsSystem2D.instance.on(Contact2DType.BEGIN_CONTACT, this.BeginContact, this);
**
 * 刚开始碰撞回调
 * @param 碰撞体1
 * @param 碰撞体2
 * @param 碰撞信息
 */
private BeginContact(_selfCollider: Collider2D, _otherCollider: Collider2D, _contact: IPhysics2DContact | null) {

    //根据情况确认碰撞体
    let ball_collider: Collider2D = _otherCollider.node.name === Global.HitBodyName.Ball ? _otherCollider : _selfCollider;
    let else_collider: Collider2D = _otherCollider.node.name === Global.HitBodyName.Ball ? _selfCollider : _otherCollider;
    switch (else_collider.node.name) {
        case Global.HitBodyName.GoalHit:
            setTimeout(() => {
                GameScene.instance.ResetRound(true);
            }, 10);
            break;
        case Global.HitBodyName.NoGoal0:
            setTimeout(() => {
                GameScene.instance.ResetRound(false);
            }, 10);
            break;
        case Global.HitBodyName.NoGoal1:
            setTimeout(() => {
                GameScene.instance.ResetRound(false);
            }, 10);
            break;
        case Global.HitBodyName.Mycontrol:
            Global.IsDebug && console.log("碰到了发球人,发球人开始转动")
            //足球暂时消失
            //需要延时处理,否则报错
            setTimeout(() => {
                ball_collider.body.type = 0;
                ball_collider.node.getComponent(Ball).ShowBall(false);
                //
                GameScene.instance.ControlPeople = else_collider.node;
                GameScene.instance.ControlPeople.getComponent(Mycontrol).HitBall();

            }, 10);
            break;
        case Global.HitBodyName.Denfense:
            Global.IsDebug && console.log("碰到了防守者,播放动画")
            setTimeout(() => {
                AudioMgr.instance.PlayEffect("hit")
                else_collider.node.getComponent(Defense).PlayAnimate();
            }, 10);

        case Global.HitBodyName.GoalKeeper:
            Global.IsDebug && console.log("碰到了防守者,播放动画")
            AudioMgr.instance.PlayEffect("hit")
            else_collider.node.getComponent(Animation).play();
            break;
    }

}   

在回调中会设置一些刚体得问题代码会报错。所以每次碰撞之后,都需要有一个简单得延时在设置刚体相关得信息。

游戏配置:

游戏得关卡是配饰在代码Global.ts中得LevelInfor中。暂时只写了五关得配置,并且进入每个关卡都没有限制。
//关卡信息
/**
* 我控制球员得位置
* 防守球员得位置
*
* 每个关卡有五个球进去三个球算是过关
*/
static LevelInfor = [
//第一关
{
mycontrol: [],
denfense: [{ x: 210, y: -37 }, { x: -210, y: -37 }],
gloalnum: 3,
surplenum: 5
},
//第二关
{
mycontrol: [{ x: -200, y: -180 }, { x: 200, y: -180 }],
denfense: [{ x: -200, y: 100 }, { x: 200, y: 100 }, { x: 0, y: 0 }],
gloalnum: 4,
surplenum: 7
},
//第三关
{
mycontrol: [{ x: -250, y: -115 }, { x: 250, y: -115 }],
denfense: [{ x: -140, y: 100 }, { x: 140, y: 100 }, { x: 0, y: -250 }],
gloalnum: 4,
surplenum: 7
},
//第四关
{
mycontrol: [{ x: 0, y: -115 }],
denfense: [{ x: -210 + 50, y: 100 }, { x: -70 + 50, y: 100 }, { x: 84 + 50, y: 100 }],
gloalnum: 4,
surplenum: 7
},
//第五关
{
mycontrol: [{ x: -200, y: -150 }],
denfense: [
{ x: 200, y: 130 }, { x: 55, y: 130 }, { x: -100, y: 130 }, { x: -250, y: 130 },
{ x: 290, y: -150 }, { x: 140, y: -150 }, { x: -20, y: -150 }
],
gloalnum: 4,
surplenum: 7
},
]

如果有后续得话~:

1、首先会添加一个配置界面,直接把配置好的关卡信息放到json文件中,游戏中关于关卡得配置也会json更新。
2、添加多种元素得碰撞体。(比如碰到三下就消失得木头!抄袭,借鉴天天足球)
3、游戏玩法得丰富,比如添加道具和倒计时等。

如果您喜欢这款游戏或者是想要做类似的游戏二创可点击源码地址购买,您的建议和想法也是我成长的一部分,感谢您的观看! :smile:

PS:纯纯得借鉴了微信小游戏天天足球得玩法。再次感谢天天足球 :blush:

其他游戏作品:

《点球大战》
无限模式

《六边形消消乐》

哈哈,挺有创意的

哈哈 你的游戏其实很好的 加油!

:thinking: