> 游戏中充值平台是一个很重要的环节,基于77访问文件及数据库的功能,通过变通处理能支持任何的充值平台,对于充值平台本身就是写文件或数据库的模式则更是易如反掌。 > 在示范版本中我们只做了基于写文件的充值模式,下面则是玩家充值后领取元宝的核心代码: ``` unit Q4; { 充值模块说明: 本模块适用于在"Mir200\Envir\QuestDiary\充值积分"文件夹里对应的文本中写入充值账号信息的充值方式 } interface uses Classes, SysUtils, DefiniensConst, ExtendFuns; procedure DoObtainGold(Npc: TNormNpc; Player: TPlayObject; Args: TArgs); //领取元宝入口函数 implementation //检查账号在指定充值文件中存在的行数,并删除,返回行数*比例 function CheckAccount(const TxtFile, Account: String; Rate: Double): Double; var LS: TStrings; Idx: Integer; ASum: Integer; begin Result := 0; //检查是否存在文件 if FileExists(TxtFile) then begin LS := TStringList.Create; ASum:= 0; //初始取到的行数为0 try //将文件加载到TStrings对象 LS.LoadFromFile(TxtFile); while true do begin Idx := LS.IndexOf(Account); //取出一条账号记录 if Idx <> -1 then begin //如果取到了记录,则删除这条记录,并增加取到的行数 LS.Delete(Idx); Inc(ASum); end else //没取到则直接跳出循环 Break; end; if ASum > 0 then //如果取到的行数大于0,则说明对列表有做过更新,需要保存 LS.SaveToFile(TxtFile); //返回元宝数量(取到的行数x比例) Result:= ASum * Rate; finally LS.Free; end; end; end; //领取充值元宝 procedure DoObtainGold(Npc: TNormNpc; Player: TPlayObject; Args: TArgs); var AGoldSum: Double; begin if G_GoldLocked then begin //如果G_GoldLocked为True,则表示正在为其他玩家发放元宝,为了不引起并发读写问题,当前此次请求无效 //此类处理方法可有效避免并发文本读写造成的数据错乱 Player.SendCenterMessage('我正在为其他玩家发放元宝,请稍后!!!', 0); Exit; end; //将G_GoldLocked置为True G_GoldLocked := True; try //初始化当前领取到的元宝总数为0,然后从每个文件中去读取元宝数量 //示范版本中以常见的充值方式处理元宝处理,如果是读取数据库充值记录,则可以采用Gamelib.DBEngine对象来处理 AGoldSum := 0; AGoldSum := AGoldSum + CheckAccount('Envir\QuestDiary\充值积分\yb01.txt', Player.Account, 0.1); AGoldSum := AGoldSum + CheckAccount('Envir\QuestDiary\充值积分\yb02.txt', Player.Account, 0.2); AGoldSum := AGoldSum + CheckAccount('Envir\QuestDiary\充值积分\yb1.txt', Player.Account, 1); AGoldSum := AGoldSum + CheckAccount('Envir\QuestDiary\充值积分\yb2.txt', Player.Account, 2); AGoldSum := AGoldSum + CheckAccount('Envir\QuestDiary\充值积分\yb6.txt', Player.Account, 6); //作为演示,这里省略更多的元宝比例文件 if AGoldSum > 0 then begin //如果玩家领取到的元宝数量大于0 AGoldSum := AGoldSum * 100; Player.GameGold := Player.GameGold + Round(AGoldSum); Player.GoldChanged; Player.SendCenterMessage('元宝领取成功,一共领取元宝'+IntToStr(Round(AGoldSum))+'个!!!', 0); end else Player.SendCenterMessage('元宝领取失败,暂时没有你的充值信息!!!', 0); finally //领取结束,将G_GoldLocked置为False,此时其他玩家可执行元宝领取了 G_GoldLocked := False; end; end; end. ``` > 上面代码中,CheckAccount函数就是检查文本文件中是否存在某账号记录,如果存在则全部取出来,算出对应的元宝数量并返回。 > DoObtainGold函数则是一个普通的入口函数,即玩家点击客户端界面可触发的函数,这个函数先是提取出玩家有多少元宝,然后将元宝发放给玩家