羊了个羊手摸手教你制作

最近羊了个羊是真的很火,正是因为这个游戏抓住了用户好胜心,所以每个人的坟头都应该绿树成荫了吧 啊哈哈哈

所以这几天也是用cocos仿了一版羊了个羊,鸡了个鸡代码已开源,获取方式在文章最后,欢迎Star!!!

先上图为敬

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
因为时间关系没有制作 道具,大家可以根据我的项目进行二开,总之代码已开源欢迎Star !!!

运行方式 用cocos打开项目然后 点击 first_scence 后再点击顶部运行按钮即可

源码获取方式 微信搜索小程序大吃一瓜 打开小程序 在休闲一下选项卡下 获取链接

核心代码


import musicMgr from "./musicMgr"
import Toast from "./Toast"
import utils from "./utils"

export default class GameMgr {

    public static readonly instance: GameMgr = new GameMgr()

    http: any = null

    music: any = null

    cardPrefabs: cc.Prefab[] = []
    // 当前关卡
    currentLevel: number = 1
    // 页面渲染的所有card
    renderCardArr: any[] = []

    _layout: cc.Node = null

    _collection: cc.Node = null

    cardWidth: number = null

    cardHeight: number = null

    utils: utils = new utils()

    hasClickedArr: number[] = []

    totalCardNum: number = null

    audioClip = {}

    musicMgr: musicMgr = null

    Toast: Toast = null

    // 游戏进行时产生的卡片
    _gamePrefabs: cc.Prefab[] = []

    nextLevel() {
        this.currentLevel += 1
        this.resetGame()
        this.loadGameByLevel()
    }

    reStartGame() {
        this.currentLevel = 1
        this.resetGame()
        this.initFirstLevel()
    }

    loadGameByLevel() {
        if (this.currentLevel === 1) {
            this.initFirstLevel()
        } else {
            this.initSecondLevel()
        }
    }

    resetGame() {
        this._gamePrefabs = []
        this.totalCardNum = null
        this.hasClickedArr = []
        this.renderCardArr = []
        this._layout.removeAllChildren()
        this._collection.removeAllChildren()
    }

    /**
     * 第一关card分布
     */
    initFirstLevel() {
        let cardPrefabs = this.cardPrefabs
        let gap = 3
        // 随机生成  0 ~ cardPrefabs-3 之间的数字
        let startIndex = Math.floor(Math.random() * (cardPrefabs.length - gap + 1))
        let prefabs = cardPrefabs.slice(startIndex, startIndex + gap)
        // 循环生成6组
        let loopNum = 6
        this._gamePrefabs = this.cloneArr(loopNum, prefabs)
        this.totalCardNum = loopNum * prefabs.length
        this.showFirstLevel()
    }

    /**
 * 第二关card分布
 */
    initSecondLevel() {
        let cardPrefabs = this.cardPrefabs
        // 循环生成6组
        let loopNum = 9
        this._gamePrefabs = this.cloneArr(loopNum, cardPrefabs)
        this.totalCardNum = loopNum * cardPrefabs.length
        this.showSecondLevel()
    }

    showFirstLevel() {
        // 打乱顺序
        let firstPrefabs = this.randomArr(this._gamePrefabs)
        // index为position的指针 满6且排除第0项 那么跳转到下一个position的值
        let index = 0
        let position = [{ x: -200, y: 200 }, { x: 0, y: 200 }, { x: 200, y: 200 }, { x: -200, y: -100 }, { x: 0, y: -100 }, { x: 200, y: -100 }]
        for (let i = 0; i < firstPrefabs.length; i++) {
            let node = cc.instantiate(firstPrefabs[i])
            node.index = i
            if (index > 5) index = 0
            let pos = position[index]
            let vec = new cc.Vec2(pos.x, pos.y + (i / 5 * (-10)))
            node.setPosition(vec)
            this._layout.addChild(node)
            this.addClickEvent(node, i)
            index++
        }
        this.utils.verifyCanRemoveMask()
        this.utils.verifyCanClick()
    }
    showSecondLevel() {
        // 底部的两组卡片 每组6张 定义两个点位 分别为 {x:-280,y:-370} {x:280,y:-370} handleFixedPrefabsBottom处理函数
        let fixedNumBottom = 12
        // 左右的两组卡片 每组6张 定义两个点位 分别为 {x:-280,y:-280} {x:280,y:-280} handleFixedPrefabsBottom处理函数
        let fixedLeftAndRight = 12
        // fixedCenterNum 
        let fixedCenterNum = 36
        // 打乱顺序
        let firstPrefabsRandom = this.randomArr(this._gamePrefabs)
        
        // 底部的prefabs
        let fixedPrefabsBottom = firstPrefabsRandom.slice(0, fixedNumBottom)

        this.handleFixedPrefabsBottom(fixedPrefabsBottom)

        // 左右的prefabs
        let fixedPrefabsLeftAndRight = firstPrefabsRandom.slice(fixedNumBottom, fixedNumBottom + fixedLeftAndRight)

        this.handleFixedPrefabsLeftAndRight(fixedPrefabsLeftAndRight, fixedNumBottom)

        // 中间凌乱的prefabs
        let firstPrefabs = firstPrefabsRandom.slice(fixedNumBottom + fixedLeftAndRight + fixedCenterNum)
        let index = fixedNumBottom + fixedLeftAndRight
        for (let i = 0; i < firstPrefabs.length; i++) {
            let node = cc.instantiate(firstPrefabs[i])
            node.index = index
            let x = this.randomoneToone(-200, 200)
            let y = this.randomoneToone(-200, 250)
            let vec = new cc.Vec2(x, y)
            node.setPosition(vec)
            this._layout.addChild(node)
            this.addClickEvent(node, index)
            index++
        }

        // 中间的prefabs
        let fixedCenterPrefabs = firstPrefabsRandom.slice(fixedNumBottom + fixedLeftAndRight, fixedNumBottom + fixedLeftAndRight + fixedCenterNum)
        this.handleFixedCenter(fixedCenterPrefabs, fixedNumBottom + fixedLeftAndRight + firstPrefabs.length)
        this.utils.verifyCanRemoveMask()
        this.utils.verifyCanClick()
    }

    handleFixedPrefabsBottom(fixedPrefabsBottom) {
        let mid = fixedPrefabsBottom.length / 2
        let towPosition = [{ x: -280, y: -430 }, { x: 280, y: -430 }]
        let currentPos = null
        let offsetX = 0
        let index = 0
        for (let i = 0; i < fixedPrefabsBottom.length; i++) {
            const node = cc.instantiate(fixedPrefabsBottom[i]);
            node.index = index
            if (i <= mid - 1) {
                //左边的卡片渲染 每一张x要加10
                offsetX = i % mid * (30)
                currentPos = towPosition[0]
            } else {
                //右边边的卡片渲染 每一张x要减10
                offsetX = i % mid * (-30)
                currentPos = towPosition[1]
            }
            let vec = new cc.Vec2(currentPos.x + offsetX, currentPos.y)
            node.setPosition(vec)
            this._layout.addChild(node)
            this.addClickEvent(node, index)
            index++
        }
    }

    handleFixedPrefabsLeftAndRight(fixedLeftAndRight, length) {
        let mid = fixedLeftAndRight.length / 2
        let towPosition = [{ x: -290, y: 280 }, { x: 290, y: 280 }]
        let currentPos = null
        let offsetY = 0
        let index = length
        for (let i = 0; i < fixedLeftAndRight.length; i++) {
            const node = cc.instantiate(fixedLeftAndRight[i]);
            node.index = index
            if (i <= mid - 1) {
                currentPos = towPosition[0]
            } else {
                currentPos = towPosition[1]
            }
            offsetY = i % mid * (-40)
            let vec = new cc.Vec2(currentPos.x, currentPos.y + offsetY)
            node.setPosition(vec)
            this._layout.addChild(node)
            this.addClickEvent(node, index)
            index++
        }
    }

    handleFixedCenter(fixedCenterPrefabs, length) {
        let index = length
        let startPos = { x: -150, y: 350 }
        let reverPos = { x: 150, y: 350 }
        let offectX = 0
        let offectY = 0
        let hengNum = 3
        // 方向
        let direction = true
        let maxOffsetX = -150 + (hengNum*2)*this.cardWidth/2
        let maxOffsetXReverse = 150 - (hengNum*2)*this.cardWidth/2
        for (let i = 0; i < fixedCenterPrefabs.length; i++) {
            if(direction){
                if(offectX > maxOffsetX){
                    offectX = 0
                    offectY-= this.cardHeight
                }
                let node = cc.instantiate(fixedCenterPrefabs[i]);
                node.index = index
                let vec = new cc.Vec2(startPos.x + offectX, startPos.y+offectY)
                node.setPosition(vec)
                this._layout.addChild(node)
                this.addClickEvent(node, index)
                offectX += this.cardWidth/2
                index++
                if(i>=fixedCenterPrefabs.length/2 - 1){
                    direction = false
                    offectY = 0
                    offectX = 0
                }
            }else{
                if(offectX < maxOffsetXReverse){
                    offectX = 0
                    offectY-= this.cardHeight
                }
                let node = cc.instantiate(fixedCenterPrefabs[i]);
                node.index = index
                let vec = new cc.Vec2(reverPos.x + offectX, reverPos.y+offectY)
                node.setPosition(vec)
                this._layout.addChild(node)
                this.addClickEvent(node, index)
                offectX -= this.cardWidth/2
                index++
            }

        }
    }

    randomoneToone(min, max) {
        return Math.floor(Math.random() * ((max + 1) - min) + min)
    }

    addClickEvent(node: any, index: number) {
        let eventHandler = new cc.Component.EventHandler();
        eventHandler.target = this._layout;
        eventHandler.component = "layoutBtnEvent";
        eventHandler.handler = "onItemClick";
        eventHandler.customEventData = index.toString();
        let button = node.getComponent(cc.Button);
        button.clickEvents.push(eventHandler);
    }

    /**
 * 
 * @param times 复制数组的次数
 * @param arr 数组
 */
    cloneArr(times, arr) {
        let result = []
        for (let index = 0; index < times; index++) {
            result = result.concat(arr)
        }
        return result
    }


    /**
* 打乱数组顺序
*/
    randomArr(tempArr, size?) {
        var indexs = -1,
            lengths = tempArr.length,
            lastIndex = lengths - 1;

        size = size === undefined ? lengths : size;
        while (++indexs < size) {
            var rand = indexs + Math.floor(Math.random() * (lastIndex - indexs + 1));
            let value = tempArr[rand];
            tempArr[rand] = tempArr[indexs];
            tempArr[indexs] = value;
        }
        tempArr.length = size;
        return tempArr;
    }


}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
要在GitLab中追加上传文件,你可以按照以下步骤进行操作: 1. 首先,确保你已经在GitLab中创建了一个项目,并且已经克隆到本地。你可以使用以下命令克隆项目: ``` git clone git@localhost:root/project1.git ``` \[2\] 2. 在本地项目目录中,将你要上传的文件复制到项目文件夹中。 3. 运行以下命令将文件添加到Git的暂存区: ``` git add <文件名> ``` 你可以使用通配符`*`来添加多个文件。 4. 提交文件到Git的版本控制: ``` git commit -m "添加文件" ``` 在引号中的消息是对这次提交的描述,你可以根据需要进行修改。 5. 最后,将本地的提交推送到GitLab服务器: ``` git push origin master ``` 这将把你的本地更改推送到GitLab服务器上的主分支。 这样,你就成功地将文件追加上传到GitLab中了。请注意,你需要在GitLab中具有适当的权限才能执行这些操作。如果你遇到任何问题,可以查看GitLab容器的日志以获取更多信息: ``` docker logs -f gitlab ``` \[3\] #### 引用[.reference_title] - *1* *3* [你使用 Docker 快速搭建 Gitlab 服务](https://blog.csdn.net/Old_Soldier/article/details/127870690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Gitlab与Jenkins](https://blog.csdn.net/weixin_46018506/article/details/121910949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小张很嚣张~

支持一下小老弟吧~

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

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

打赏作者

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

抵扣说明:

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

余额充值