仙剑奇侠传-sdlpal源码解析!

更新时间:2023-07-08 05:57:25 阅读: 评论:0

单亲家庭
仙剑奇侠传-sdlpal源码解析!
01. 源码解析-联⽹研究
图形gui使⽤的是qt的QGraphicsView 和QGraphicsScene,以及item系列。⽹络库使⽤的是lua的concurrent。两边都安装了这个库,数据传输,就跟单机⼀样。看到这⾥你可能会认为我怎么这么low啊,都什么年代了,还⽤这些玩具。经过你们这么⼀提醒,我还真反思了⼀下,决定把仙剑1做成⽹游才⾏。
特意找了⼀个完整的带服务器端和客户端的源码。这套东西很多都是10年前的,太⽼了,但是作为⼀个⼈做⼀款⽹游来讲,复杂度尚可。当然了,这些东西要时间去研究。
你们会问,我为什么要这么做?我思前想后,都是为了兄弟们啊,很多做单机游戏的最后都饿死了,就算去公司,最后也得被开除,毕竟技术落后了,年纪⼤了。但是做⽹络游戏就不⼀样了,⼀个主程,配2个美⼯,就能做⼀款⽹游。将来⽹游会⼤爆发。
我们都不傻,时下的主流媒体都在⿎吹⼤家去做独⽴游戏,靠创意挣⼤钱。其实成功的可能就是千分之⼀,这概率太⼩了,百分之⼀都太⼩了。但是⽹游则不⼀样嘛。就算做失败了,因为有⽹络编程技术,多线程技术,可以⽴马到bat ⾥,继续韬光养晦。如果bat把我开除了,我就在家继续做⽹游,⽹游跟单
机不同,服务器端⼤致都相同,如果数量很⼤的⽹游程序员集结在⼀起,很容易合得来,因为⽹络技术和多线程技术就那么⼏种。如果bat敢把⼤量的⽹游⼈才放在民间不管。肯定会被别有⽤⼼的⼈利⽤,造⼀个区块链⽹游出来。
区块链⽹游才是未来,那么你连⽹游都不会做,你⽤什么谈区块链⽹游呢。所以说,兄弟们,既然看到了未来,⼼动不如⾏动。
我接下来的⽂章,全部都在为sdlpal⽹络化服务。今年⼀年的时间侧重sdlpal的源码的翻译和研究,以及转化。明年,就是sdlpal⽹游化。
进展,已经攻克了图像存储和读取的部分。
这部分,找个bmp的save库,然后通过sdlpal的⽅法就可以保存下来。
这种可以⼀次保存⼀个场景的。当然也可以保存所有场景的。只需要修改wNumScene即可。
有了这些精灵图⽚,就可以把事件object 显⽰到屏幕上⾯了。
这样的话,tagEventOject的可视化就做的差不多了。
然后则是把结构体数据发送给另外⼀台电脑
lua的表转成c结构体
将所有当前场景中的事件物体的数据,发送给服务器
ndToRemote源码
服务器端的接收函数
⾄此,游戏数据,就已经被服务器接收了。
显⽰的部分使⽤ 5 个层次
1全部场景总管(分场景的宣传)
2分场景总管(当前数据分发给指定区域管理)
3区域管理(把数据按组均分给项⽬带头⼈)
4项⽬带头⼈(指定⼀列表格显⽰⼀个事件对象的数据,指定精灵显⽰当前帧,指定xxx显⽰⾎条等等)
5⼯作者(⼯作,使⽤带头⼈给的数据,然后做⾃⼰该做的事。)
⾄此,就有了开始的gif动图显⽰效果。联机已经有了雏形。
预告:下⼀篇,应该是通过sdlpal,深⼊了解仙剑奇侠传的数据结构和算法。⽹络化呢,则是⼀个辅助。毕竟玩法是灵魂嘛。先有灵魂,再有协作。
02.源码解析
说点纯⼲货吧。我本来还想蓄势铺垫的。
⼈对未知的内容都很恐慌。就⽐如说,我打算复刻⼀下仙剑奇侠传的源码。也就是纯c版本的sdlpal的源码。我要翻译成c++,lua+qt的版本。
你说,这么多⽂件,凡是带h的c的,cpp的,都是要处理的。
这个游戏我玩过,但是到了⾄于怎么制造的时候,都是摸⽯头过河的感觉。我从game_main函数开始,⼀路顺藤摸⽠,先从菜单着⼿
原理就是现学现⽤,很多函数,我不懂,我就改数字,改流程。我在屏幕上⾯加字。不懂的部分,就暂时使⽤c语⾔的原版。说⽩了就是跳过不懂的部分,去进⾏其他部分内容。
我原来好⼤喜功,上来就要搞懂数据结构和算法,结果现实教育了我。慢慢的我改成了顺藤摸⽠。
在主循环⾥⾯有⼀个start frame函数。ME系统
⽽在start frame函数中,分两部分函数,⼀部分是gameupdate,这个是核⼼部分,我们这些新⼿,是不能上来就动它的。那么柿⼦挑软的捏,就处理下⾯的那些各种窗⼝操作。
因为这些东西所见即所得,所有源码虽然看不懂,但是我们可以通过修改坐标,就知道,这段代码写的是什么地⽅的图。
今天主要讲的就是⽃争经验和⽅法。
⽬标就是先翻译成lua的脚本,这样的话,修改起来就容易了,光是lua+sdl,是不⾏的,缺少编辑器。所以要把sdl换成qt,借qt的东风。最终做成仙剑数据可视化编辑器。
流程由写死的代码,更换成⾏为树。现在的⾏为树都有图形化⼯具。
今天剩下的时间,我要做
对就是从物品到装备选项,
再到装备整个过程。
在play。c中,调⽤部分其实很少
敬礼图片这个翻译起来很简单,下⾯的两个menu函数,可都是⼤家伙。待我下⼀篇慢慢到来。
翻译过来了。PAL_EquipItemMenuV2(d,lect_opt) 真的好长
localfunctionName ='PAL_EquipItemMenuV2'
class_t[functionName] =function(lf,d,small_env)
localt =small_env or{}
localwItem =t.wItem
localpalcommon =d.palcommon
localutil =d.util
localbit =d.bit
郑重其事-------------------------
localfpBALL =d.fpBALL
localfpFBP =d.fpFBP
localg_InputState =d.g_InputState
-----------------------------
localgpScreen =d.gpScreen
localgpGlobals =d.gpGlobals
localgameData =gpGlobals:getGameData
localgameData =gpGlobals:getGameData
localplayerRoles =gameData:getPlayerRoles
localrgParty =gpGlobals:getParty
gpGlobals.wLastUnequippedItem =wItem
-
-------------------------------
localbg_w,bg_h =d.bg_w,d.bg_h
localsize =bg_w *bg_h
bufBackground =ByteVector(size)
palcommon:MKFDecompressChunk(bufBackground,size, EQUIPMENU_BACKGROUND_FBPNUM,fpFBP) localbufImage =ByteVector( 2048)
--------------------------------
localiCurrentPlayer =0
localbSelectedColor =MENUITEM_COLOR_SELECTED_FIRST
localdwColorChangeTime =lua_GetTicks +( 600/MENUITEM_COLOR_SELECTED_TOTALNUM)
------------------------------------------------------------------------------------
localdwKeyPress
-------------------------
localdst,item,obj
localw,item_id,text,curr_flag
localbColor
whiletruedo
wItem =gpGlobals.wLastUnequippedItem
item =gameData:getObject(wItem):getItem
palcommon:FBPBlitToSurface(bufBackground,gpScreen)
员工请假
dst =palcommon:MKFReadChunk(bufImage, 2048,item.wBitmap,fpBALL)
ifdst >0then
palcommon:RLEBlitToSurface(bufImage,gpScreen,palcommon:pal_XY( 16, 16))
end
end
--VIDEO_UpdateScreen(nil)
--print('stop')
--util:delay(1000000000)
obj =rgParty:at(iCurrentPlayer)
w =obj.wPlayerRole小混沌
fori =0,MAX_PLAYER_EQUIPMENTS do
item_id =playerRoles:getEquipmentItem(i,w)
ifitem_id ==0then
el
text =PAL_GetWord(item_id)
PAL_DrawText(text,palcommon:pal_XY( 130, 11+i *22),MENUITEM_COLOR, TRUE, FALSE) end
卫生标语end
----------------------------
PAL_DrawNumber(PAL_GetPlayerAttackStrength(w), 4, palcommon:pal_XY( 260, 14), kNumColorCyan, kNumAlignRight)
PAL_DrawNumber(PAL_GetPlayerMagicStrength(w), 4, palcommon:pal_XY( 260, 36), kNumColorCyan, kNumAlignRight)
儿童简易灯笼制作方法PAL_DrawNumber(PAL_GetPlayerDefen(w), 4, palcommon:pal_XY( 260, 58), kNumColorCyan, kNumAlignRight)
PAL_DrawNumber(PAL_GetPlayerDexterity(w), 4, palcommon:pal_XY( 260, 80), kNumColorCyan, kNumAlignRight)
PAL_DrawNumber(PAL_GetPlayerFleeRate(w), 4, palcommon:pal_XY( 260, 102), kNumColorCyan, kNumAlignRight)
-----------------------------------
PAL_CreateBox(palcommon:pal_XY( 2, 95), gpGlobals.wMaxPartyMemberIndex, 2, 0, FALSE)

本文发布于:2023-07-08 05:57:25,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1084965.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   源码   仙剑   场景   部分   指定   就算   算法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图