说点纯干货吧。我本来还想蓄势铺垫的。
人对未知的内容都很恐慌。就比如说,我打算复刻一下仙剑奇侠传的源码。也就是纯c版本的sdlpal的源码。我要翻译成c++,lua+qt的版本。
你说,这么多文件,凡是带h的c的,cpp的,都是要处理的。
这个游戏我玩过,但是到了至于怎么制造的时候,都是摸石头过河的感觉。我从game_main函数开始,一路顺藤摸瓜,先从菜单着手
原理就是现学现用,很多函数,我不懂,我就改数字,改流程。我在屏幕上面加字。不懂的部分,就暂时使用c语言的原版。说白了就是跳过不懂的部分,去进行其他部分内容。
我原来好大喜功,上来就要搞懂数据结构和算法,结果现实教育了我。慢慢的我改成了顺藤摸瓜。
在主循环里面有一个start frame函数。
而在start frame函数中,分两部分函数,一部分是gameupdate,这个是核心部分,我们这些新手,是不能上来就动它的。那么柿子挑软的捏,就处理下面的那些各种窗口操作。
因为这些东西所见即所得,所有源码虽然看不懂,但是我们可以通过修改坐标,就知道,这段代码写的是什么地方的图。
今天主要讲的就是斗争经验和方法。
目标就是先翻译成lua的脚本,这样的话,修改起来就容易了,光是lua+sdl,是不行的,缺少编辑器。所以要把sdl换成qt,借qt的东风。最终做成仙剑数据可视化编辑器。
流程由写死的代码,更换成行为树。现在的行为树都有图形化工具。
今天剩下的时间,我要做
对就是 从物品到装备选项,
再到装备整个过程。
在play。c中,调用部分其实很少
这个翻译起来很简单,下面的两个menu函数,可都是大家伙。待我下一篇慢慢到来。
翻译过来了。PAL_EquipItemMenuV2(d,select_opt) 真的好长
local functionName='PAL_EquipItemMenuV2'
class_t[functionName]=function(self,d,small_env)
local t =small_env or {}
local wItem=t.wItem
local palcommon=d.palcommon
local util=d.util
local bit=d.bit
-------------------------
local fpBALL=d.fpBALL
local fpFBP=d.fpFBP
local g_InputState=d.g_InputState
-----------------------------
local gpScreen=d.gpScreen
local gpGlobals=d.gpGlobals
local gameData=gpGlobals:getGameData()
local playerRoles=gameData:getPlayerRoles()
local rgParty =gpGlobals:getParty()
gpGlobals.wLastUnequippedItem=wItem
--------------------------------
local bg_w,bg_h=d.bg_w,d.bg_h
local size=bg_w*bg_h
bufBackground=ByteVector(size)
palcommon:MKFDecompressChunk(bufBackground,size, EQUIPMENU_BACKGROUND_FBPNUM,fpFBP)
local bufImage=ByteVector(2048)
--------------------------------
local iCurrentPlayer=0
local bSelectedColor = MENUITEM_COLOR_SELECTED_FIRST
local dwColorChangeTime = lua_GetTicks() + (600 / MENUITEM_COLOR_SELECTED_TOTALNUM)
------------------------------------------------------------------------------------
local dwKeyPress
-------------------------
local dst,item,obj
local w,item_id,text,curr_flag
local bColor
while true do
wItem=gpGlobals.wLastUnequipped