從零開始實現放置游戲(十六)——道具系統(1)道具字典


 

    道具系統是游戲的核心系統之一,常見的業務功能包括 “角色背包”, “道具商店”, “怪物掉落” 等,都依賴道具系統。

    在實現這些功能之前,首先要解決的問題就是要定義我們的游戲世界中,到底會有哪些道具, 以及這些道具是如何分類的?

    這就是我們這期要做的“道具字典“。首先必須要有一個“字典”來說明這個道具是什么,接下來才能有“背包”系統,來表示角色的背包里有些什么道具,數量有多少。

一、道具分類

1.概念設計

    我們先參照魔獸世界的道具分類,整理出分類大致如下(見腦圖)。

圖1.道具分類圖 

 

圖2.裝備分類圖

  從圖中可以看出,整個分類是一個樹形結構。

       “道具“大類下,目前是一個二層的樹形結構,里面包括“雕文”,“坐騎”,“食物”等,這些分類和現有系統聯系不緊密,需要額外開發使用這些道具的玩法系統,可以暫時先不過多考慮。

  “裝備”大類下,是一個三層的樹形結構。裝備系統和戰斗結算,人物戰斗屬性關系緊密,我們接下來將前主要設計裝備字典。

2.數據庫設計

  前幾章,實現了系統的數據字典,但那個字典主要適用於枚舉選項,是一個平面型的數據結構,對裝備類型就不適用了。

  比如,在分類選擇時,想要選擇 “武器” -> “單手武器” -> "單手劍",這樣一級一級往下選擇,就難以實現了。

  因此,需要額外設計一張能夠處理樹形結構的“道具類型表”。在數據字典表的基礎上,加兩個字段 level(當前層級), rootCode(根節點編碼)即可。

  建表語句如下:

CREATE TABLE `item_type` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `code` varchar(20) NOT NULL DEFAULT '' COMMENT '編碼',
  `parent_code` varchar(20) NOT NULL DEFAULT '' COMMENT '父編碼',
  `root_code` varchar(20) NOT NULL DEFAULT '' COMMENT '根節點編碼',
  `level` int NOT NULL DEFAULT '0' COMMENT '層級',
  `value` varchar(20) NOT NULL DEFAULT '' COMMENT '',
  `remark` varchar(100) NOT NULL DEFAULT '' COMMENT '備注',
  `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人',
  `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
  `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 0-否 1-是',
  `version` int NOT NULL DEFAULT '0' COMMENT '版本號',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_code` (`code`),
  KEY `idx_parent_code` (`parent_code`)
) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='道具類型字典表';
item_type.sql

3.內容管理

  表結構有了,參照前面的章節,只要建好對應的實體類,在RMS系統中,添加對應的菜單,實現相應的邏輯即可。

  注意啟動時,把道具分類也加載到緩存中(在StartUpListener類中)。

  (可參照源碼,就不展開了。具體類型編碼在源代碼里的策划文檔中,也可自行定義)

二、道具字典

    有了分類,接下來就可以定義道具字典了(即定義游戲中所有可能出現的道具)。

1.道具編碼

    為了區分道具的類型,我們有必要制定一套編碼規范,來唯一標識一個道具。格式如下:

    道具類型標識 = 類型編碼(5位) + 序列號(5位),比如:單手劍 = 61101, 鈍劍是此類型中的第一個道具,編碼為6110100001。

    背包道具ID = 道具類型標識(10位)+ 時間戳(12位)+ 序列號(4位),比如:打怪掉落的鈍劍,在玩家背包里的道具ID為 61101000012103151200360001。

    即,系統中同類型的裝備,最多可以定義10萬種。同一種裝備,1秒鍾最多可以產生1萬個。

    這里類型編碼是在策划文檔中定義好,序列號是在Redis中做incr操作獲取,具體可參見源碼。

2.數據表結構設計

    在設計數據表的時候,考慮到不管是普通道具,還是裝備道具,都有一些通用的屬性,比如:名稱、描述、品質、是否可交易、是否唯一、是否可丟棄等等。

    對此,可以設計一張道具基礎表,item_common,來記錄所有道具的基本信息。

    而裝備表特有的屬性,比如:傷害值,護甲值,生命值,力量,敏捷,等等,則存到裝備表里 item_equipmen。

    等后面設計普通道具表時,比如烹飪,卷軸,坐騎等,則可以擴展到 item_normal 等表中。

    這樣設計,可以防止單表的字段過多。

CREATE TABLE `item_common` (
  `id` varchar(20) NOT NULL COMMENT '唯一編碼(類型編碼+序號編碼)',
  `type_code` varchar(10) NOT NULL DEFAULT '' COMMENT '類型編碼',
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '物品名稱',
  `description` varchar(500) NOT NULL DEFAULT '' COMMENT '物品描述',
  `quality` varchar(10) NOT NULL DEFAULT '' COMMENT '物品品質',
  `item_level` int NOT NULL DEFAULT '1' COMMENT '物品等級',
  `required_level` int NOT NULL DEFAULT '1' COMMENT '等級要求',
  `required_job` varchar(10) NOT NULL DEFAULT '' COMMENT '職業要求',
  `stack_size` int NOT NULL DEFAULT '1' COMMENT '堆疊數量',
  `price_buy` int NOT NULL DEFAULT '0' COMMENT '購買價格',
  `price_sell` int NOT NULL DEFAULT '0' COMMENT '出售價格',
  `can_trade` tinyint NOT NULL DEFAULT '1' COMMENT '是否可交易 0:否 1:是',
  `can_drop` tinyint NOT NULL DEFAULT '1' COMMENT '是否可丟棄 0:否 1:是',
  `is_unique` tinyint NOT NULL DEFAULT '0' COMMENT '是否唯一 0:否 1:是',
  `extend_prop` varchar(8000) NOT NULL DEFAULT '' COMMENT '擴展屬性',
  `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人',
  `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
  `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 0-否 1-是',
  `version` int NOT NULL DEFAULT '0' COMMENT '版本號',
  PRIMARY KEY (`id`),
  KEY `idx_item_type_code` (`type_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='道具字典表';
item_common
CREATE TABLE `item_equipment` (
  `id` varchar(20) NOT NULL COMMENT '唯一編碼(類型編碼+序號編碼)',
  `type_code` varchar(10) NOT NULL DEFAULT '' COMMENT '類型編碼',
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '裝備名稱',
  `damage_min` int NOT NULL DEFAULT '0' COMMENT '最小傷害',
  `damage_max` int NOT NULL DEFAULT '0' COMMENT '最大傷害',
  `armour` int NOT NULL DEFAULT '0' COMMENT '護甲值',
  `hp` int NOT NULL DEFAULT '0' COMMENT '生命值',
  `strength` int NOT NULL DEFAULT '0' COMMENT '力量',
  `agility` int NOT NULL DEFAULT '0' COMMENT '敏捷',
  `intellect` int NOT NULL DEFAULT '0' COMMENT '智力',
  `stamina` int NOT NULL DEFAULT '0' COMMENT '耐力',
  `extend_attr` varchar(8000) NOT NULL DEFAULT '' COMMENT '擴展屬性',
  `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人',
  `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
  `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 0-否 1-是',
  `version` int NOT NULL DEFAULT '0' COMMENT '版本號',
  PRIMARY KEY (`id`),
  KEY `idx_equipment_type_code` (`type_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='裝備字典表';
item_equipment

    具體到代碼中建模的類圖,大致如下:

 

 三、效果演示

 

四、小結

    本章主要實現的道具分類和道具字典的基本配置。

    道具種類繁多,需要策划一個個配,這里我只配了十幾個單手劍的屬性,用作演示。

    預計下一章會在游戲模塊簡單實現下角色背包

    

    本文原文地址: https://www.cnblogs.com/lyosaki88/p/idlewow_16.html
    本章源碼下載地址: https://474b.com/f/14960372-485827531-39583c (訪問密碼:9502)

    項目交流群:329989095

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM