当前位置:   article > 正文

Zjh游戏(十五)充值功能的实现_游戏充值系统怎么制作

游戏充值系统怎么制作

充值功能的UI搭建

  • Unity搭建充值界面
  • 创建界面的脚本
  • 获取相关UI
  • 向Server端发请求充值的请求

RechargePanel :Unity充值UI脚本

using DG.Tweening;
using Protocol.Code;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class RechargePanel : MonoBehaviour
{
    private GameObject goods;
    private Button[] btnGoodsArr;//所有的充值按钮
    private Button btn_Close;
    private int RechargeCount;//每次充值的金币数
    private void Awake()
    {
        Init();
    }
    private void Init()
    {
        EventCenter.AddListener(EventDefine.ShowRechargePanel,Show);
        //监听收到Server端完成充值后的回应的方法
        EventCenter.AddListener<int>(EventDefine.SendRechargePanel,UpdateCoinCount);
        goods = transform.Find("goods").gameObject;
        btnGoodsArr = new Button[goods.transform.childCount];
        //得到所有充值按钮
        for (int i = 0; i < goods.transform.childCount; i++)
        {
            btnGoodsArr[i] = goods.transform.GetChild(i).GetComponentInChildren<Button>();
        }    
        btn_Close = transform.Find("btn_Close").GetComponent<Button>();
        btn_Close.onClick.AddListener(() =>
        {
            OnCloseButtonClick();
        });
        //添加每个充值按钮的点击事件
        btnGoodsArr[0].onClick.AddListener(delegate{ OnRechargeButtonClick(10); });
        btnGoodsArr[1].onClick.AddListener(delegate{ OnRechargeButtonClick(20); });
        btnGoodsArr[2].onClick.AddListener(delegate{ OnRechargeButtonClick(50); });
        btnGoodsArr[3].onClick.AddListener(delegate{ OnRechargeButtonClick(100); });
        btnGoodsArr[4].onClick.AddListener(delegate{ OnRechargeButtonClick(200); });
        btnGoodsArr[5].onClick.AddListener(delegate{ OnRechargeButtonClick(500); });
    }
    /// <summary>
    /// 关闭按钮的点击
    /// </summary>
    private void OnCloseButtonClick()
    {
        transform.DOScale(Vector3.zero, 0.3f);
    }
    //显示的方法
    private void Show()
    {
        transform.DOScale(Vector3.one, 0.3f);
    }

    /// <summary>
    /// 充值按钮的点击
    /// </summary>
    /// <param name="coin"></param>
    private void OnRechargeButtonClick(int coin)
    {
        RechargeCount = coin;
        NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetRecharge_CREQ,coin);
    }
    /// <summary>
    /// 金币充值成功的提示
    /// </summary>
    private void UpdateCoinCount(int value)
    {
        Models.GameModel.userDto.Coin = value;//保存每次充值后的金币数
        EventCenter.Broadcast(EventDefine.Hint,"充值"+RechargeCount+"金币成功");
    }

    private void OnDestroy()
    {
        //移除监听
        EventCenter.RemoveListener<int>(EventDefine.SendRechargePanel, UpdateCoinCount);
        EventCenter.RemoveListener(EventDefine.ShowRechargePanel, Show);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

数据库的处理:更新金币数,加上每次需要充值的金币,并返回充值成功后的金币数量

    /// <summary>
        /// 更新金币数量
        /// </summary>
        public static int UpdateCoinCount(int userId,int value)
        {
            MySqlCommand cmd = new MySqlCommand("select Coin From userinfo where ID=@id",sqlConnect);
            cmd.Parameters.AddWithValue("id",userId);
            MySqlDataReader reader= cmd.ExecuteReader();
            if (reader.HasRows)
            {
                reader.Read();
                int remainCoinCount = reader.GetInt32("Coin");
                reader.Close();

                MySqlCommand updateCmd = new MySqlCommand("update userinfo set Coin=@coin where ID=@id",sqlConnect);
                updateCmd.Parameters.AddWithValue("coin",remainCoinCount+value);
                updateCmd.Parameters.AddWithValue("id", userId);
                updateCmd.ExecuteNonQuery();
                return remainCoinCount + value;
            }
            reader.Close();
            return 0;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

Server端的处理:发送给客户端充值成功后的金币

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GameServer.DadaBase;
using MyServer;
using Protocol.Code;
using Protocol.Dto;

namespace GameServer.Logic
{
    /// <summary>
    /// 账号模块的处理
    /// </summary>
    public class AccountHandler : IHandler
    {
        public void DisConnected(ClientPeer clientPeer)
        {
            DatabaseManager.OffLine(clientPeer);
        }
        /// <summary>
        /// 处理所有的子操作码
        /// </summary>
        public void Receive(ClientPeer client, int subCode, object value)
        {
            switch (subCode)
            {
                case AccountCode.Register_CREQ:
                    Register(client,value as AccountDto);
                    break;
                case AccountCode.Login_CREQ:
                    Login(client,value as AccountDto);
                    break;
                case AccountCode.GetUserInfo_CREQ:
                    GetUserInfo(client);
                    break;
                case AccountCode.GetRankList_CRES:
                    GetRankList(client);
                    break;
                case AccountCode.GetRecharge_CREQ:
                    GetRecharge_CREQ(client,(int)value);
                    break;
                   
            }
        }

        /// <summary>
        /// 客户端请求充值的处理
        /// </summary>
        private void GetRecharge_CREQ(ClientPeer client,int coinCount)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                int count = DatabaseManager.UpdateCoinCount(client.id, coinCount);
                //完成充值请求后的处理,回应给客户端
                client.SendMsg(OpCode.Account, AccountCode.GetRecharge_SRES, count);
            });
        }

        /// <summary>
        /// 客户端请求排行榜的处理
        /// </summary>
        private void GetRankList(ClientPeer client)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
               RankListDto dto= DatabaseManager.GetRankListDto();
                client.SendMsg(OpCode.Account, AccountCode.GetRankList_SRES, dto);
            });
        }

        /// <summary>
        /// 客户端请求获得用户信息的处理
        /// </summary>
        private void GetUserInfo(ClientPeer client)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                UserDto dto = DatabaseManager.GetUserInfo(client);
                client.SendMsg(OpCode.Account, AccountCode.GetUserInfo_SRES, dto);
            });
        }

        /// <summary>
        /// 客户端请求登陆的处理
        /// </summary>
        private void Login(ClientPeer client, AccountDto dto)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                if (DatabaseManager.IsExistUserName(dto.userName)==false)
                {
                    //用户名不存在
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -1);
                    return;
                }
                if (DatabaseManager.IsMatch(dto.userName,dto.password)==false)
                {
                    //账号密码不匹配
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -2);
                    return;
                }
                if (DatabaseManager.IsOnline(dto.userName))
                {
                    //当前用户已在线
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -3);
                    return;
                }
                DatabaseManager.Login(dto.userName,client);
                //登陆成功
                client.SendMsg(OpCode.Account, AccountCode.Login_SRES, 0);
            });
        }

        /// <summary>
        ///客户端注册请求的处理
        /// </summary>
        private void Register(ClientPeer client, AccountDto dto)
        {
            ///单线程执行
            ///作用:防止多个线程同时访问,数据错乱
            SingleExecute.Instacne.Execute(()=> 
            {
                //判断数据库中是否存在该用户,存在就给客户端返回-1
                if (DatabaseManager.IsExistUserName(dto.userName))
                {
                    client.SendMsg(OpCode.Account, AccountCode.Register_SRES, -1);
                    return;
                }
                //判断数据库中是否存在该用户,不存在就创建该用户并给客户端返回0
                DatabaseManager.CreatUser(dto.userName, dto.password);
                client.SendMsg(OpCode.Account, AccountCode.Register_SRES, 0);
            });
           
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139

客户端处理Server端的回应:

using Protocol.Code;
using Protocol.Dto;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class AccountHandler : BaseHandler
{
    
    public override void OnReceive(int subCode, object value)
    {
        switch (subCode)
        {
            case AccountCode.Register_SRES:
                Register_SRES((int)value);
                break;
            case AccountCode.Login_SRES:
                Login_SRES((int)value);
                break;
            case AccountCode.GetUserInfo_SRES:
                GetUserInfo_SRES(value as UserDto);
                break;
            case AccountCode.GetRankList_SRES:
                GetRankList_SRES(value as RankListDto);
                break;
            case AccountCode.GetRecharge_SRES:
            	//发送到充值脚本自己处理
                EventCenter.Broadcast(EventDefine.SendRechargePanel, (int)value);
                break;
        }
    }

    /// <summary>
    /// 处理服务器端注册后的回应
    /// </summary>
    private void Register_SRES(int value)
    {
        if (value==-1)
        {
            EventCenter.Broadcast(EventDefine.Hint,"该用户已经被注册");
            return;
        }
        if (value==0)
        {
            EventCenter.Broadcast(EventDefine.Hint, "注册成功");
        }
    }

    /// <summary>
    ///  处理服务器端登陆后的回应
    /// </summary>
    private void Login_SRES(int value)
    {
       
        switch (value)
        {
            case -3:
                EventCenter.Broadcast(EventDefine.Hint, "当前用户已在线");
                break;              
            case -2:
                EventCenter.Broadcast(EventDefine.Hint, "账号密码不匹配");
                break;
            case -1:
                EventCenter.Broadcast(EventDefine.Hint, "用户名不存在");
                break;
            case 0:
                //请求获得用户信息
                NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetUserInfo_CREQ,null);
                EventCenter.Broadcast(EventDefine.Hint, "登陆成功");
                break;
        }
    }

    /// <summary>
    /// 处理获取用户信息服务器端的回应
    /// </summary>
    private void GetUserInfo_SRES(UserDto dto)
    {
        Models.GameModel.userDto = dto;//把用户信息存储到数据中心(model层)
        SceneManager.LoadScene("02.Main");
    }

    /// <summary>
    /// 处理获取排行榜信息服务器的回应
    /// </summary>
    /// <param name="dto"></param>
    private void GetRankList_SRES(RankListDto dto)
    {
        //把排行榜信息发送到RankPanel去处理
        EventCenter.Broadcast(EventDefine.SendRankListDto,dto);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

客户端处理充值成功后的操作

  • RechargePanel 脚本中监听handler里发送的事件
  • 广播一下充值了多少金币
  • 在Main界面更新人物的金币数量,并保存在Model里

有需要学习视频的欢迎关注微信公众号:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/233550
推荐阅读
相关标签
  

闽ICP备14008679号