装备系统步骤

本文详细介绍了游戏开发中装备系统的实现,包括装备数据结构的设计,如使用数组保存装备信息,通过枚举定义装备类型和装备槽位。服务器端和客户端的装备操作逻辑,如装备穿戴和卸下,以及数据的存储和同步。此外,还展示了UI层面如何响应装备变化,包括装备栏的UI更新和装备选择交互。
摘要由CSDN通过智能技术生成

装备系统可以与背包相似,而装备与道具类似,区别在于装备系统的道具无法堆叠,且装备栏的格子较少。

装备的数据结构,使用数组来保存各个位置的信息。

下标位置代表了各个部位

EQUIP_DATA

WEAPON,ACCESSORY,HELMET,CHEST,SHOULDER,PANTS,BOOTS

然后用一个枚举

Enum Equip{
WEAPON,
ACCESSORY,
HELMET,
CHEST,
SHOULDER,
PANTS,
BOOTS
}

增加的协议

enum ITEM_TYPE{
	EQUIP= 3; //装备类型
}
enum EQUIP_SLOT{
	WEAPON = 0;
	ACCESSORY = 1;
	HELMET = 2 ; //头盔
	CHEST = 3;//胸甲
	SHOULDER = 4; //护肩
	PANTS = 5; //裤子
	BOOTS = 6; //靴子
	SLOT_MAX = 7;
}

message NCharacterInfo {
	bytes Equips = 12;
}

message NetMessageRequest{
ItemEquipRequest itemEquip = 12;
}

message NetMessageResponse{
ItemEquipResponse itemEquip = 12;
}

message ItemBuyRequest    
{
int32 shopId = 1;
int32 shopItemId = 2;
}

message ItemBuyResponse  
{
RESULT result = 1;
string errormsg = 2;
}

增加装备的实体类。

public enum EquipSlot {
		WEAPON,
		ACCESSORY,
		HELMET,
		CHEST,
		SHOULDER,
		PANTS,
		BOOTS
	}
public class EquipDefine{
		public int ID { get; set; }
		public EquipSlot Slot { get; set; }
		public string Category { get; set; }
		public float STR { get; set; }
		public float INT { get; set; }
		public float DEX { get; set; }
		public float HP { get; set; }
		public float MP { get; set; }
		public float AD { get; set; }
		public float AP { get; set; }
		public float DEF { get; set; }
		public float MDEF { get; set; }
		public float SPD { get; set; }
		public float CRI { get; set; }
	}

在数据库的Character表里增加Equips字段,设置最大长度为28,存储格式为Binary二进制。(为什么是28字节。)

服务器端

在Character实体类增加

this.Info.Equips = cha.Equips;

将数据库里的装备信息加载入内存。

在DataManager里面加入装载数据的方法。

在ItemService里添加关于装备动作的监听接受request,并且调用EquipManager的方法。EquipManager是单例类,与ItemManager不同,ItemManager是因为Character实体类里有ItemManager,所以需要绑定进去不能是单例。

根据穿装备来考虑EquipManager要做的事,首先考虑谁要穿装备,装备穿上的槽位,道具ID,道具是穿还是脱。

然后直接从session里取出Character.ItemManager,并且根据ItemManager里的数据检验角色是否拥有这件道具。

之后利用与背包系统类似的二维数组的方式存储装备,注意此处是直接用int类型保存ItemId,所以用int指针即可。

class EquipManager : Singleton<EquipManager>
    {
        public Result EquipItem(NetConnection<NetSession> sender,int slot,int itemId,bool isEquip) {
            Character character = sender.Session.Character;
            if (!character.itemManager.Items.ContainsKey(itemId))  //判断角色是否拥有道具
            {
                return Result.Failed;
            }
            UpdateEquip(character.Data.Equips, slot, itemId, isEquip);
            DBService.Instance.Save();
            return Result.Success;
        }
        unsafe void UpdateEquip(byte[] equipData,int slot,int itemId,bool isEquip) {
            fixed (byte* first = equipData) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值