Java游戲服務(wù)器入門09 - 重新設(shè)計(jì)攻擊消息

之前為了測(cè)試重構(gòu)的代碼添加了攻擊消息北滥,現(xiàn)在再來重新設(shè)計(jì)一下攻擊消息:UserAttkCmdHandler刚操,使代碼簡潔一下,并且添加處理死亡消息再芋,最后對(duì)攻擊消息的一個(gè)小BUG做調(diào)整:

1.對(duì)User進(jìn)行滿血調(diào)整

之前我們?cè)谔砑庸粝⒌臅r(shí)候菊霜,可以看到攻擊一下會(huì)扣除10滴血,但是并不清楚人物一共有多少血量祝闻,在這里做一個(gè)簡單的調(diào)整占卧,把人物的滿血設(shè)置為100
在User類中添加當(dāng)前血量

package com.tk.tinygame.herostory.model;

public class User {

        /**
         * 用戶 Id
         */
        public int userId;

        /**
         * 影響形象
         */
        public String heroAvatar;

        /**
         * 當(dāng)前血量
         */
        public int currHp;

        /**
         * 移動(dòng)狀態(tài)
         */
        public final MoveState moveState = new MoveState();

}

在用戶入場時(shí)添加一個(gè)當(dāng)前血量為100

 User newUser = new User();
 newUser.userId = userId;
 newUser.heroAvatar = heroAvatar;
 //新添加,類中其他都不動(dòng)
 newUser.currHp = 100;
 UserManager.addUser(newUser);
2.修改用戶攻擊指令處理器:UserAttkCmdHandler

思路:獲取攻擊者/被攻擊者ID,當(dāng)攻擊時(shí),首先推送攻擊消息写半,再推送減血消息爱榕,如果被攻擊者死亡則推送死亡消息,直接上代碼社搅,和之前差不多
注意:
1.減血的計(jì)算盡量在服務(wù)器端處理,如果在客戶端處理可能外掛的問題會(huì)比較嚴(yán)重
2.注意代碼

 if(null == targetUser){
            //如果沒打到人,也推送一下攻擊,這樣客戶端可以顯示攻擊動(dòng)作捂蕴,否則沒有譬涡,影響體驗(yàn)
            broadcastAttrResult(attkUserId,-1);
            return;
        }

因?yàn)橹挥泄粽吆捅还粽呓聿庞袦p血邏輯,但是當(dāng)角色遠(yuǎn)距離點(diǎn)攻擊鍵時(shí)啥辨,我們還是要廣播一個(gè)攻擊消息涡匀,否則其他客戶端都不會(huì)顯示角色的攻擊動(dòng)作,算是修復(fù)一個(gè)小BUG吧

package com.tk.tinygame.herostory.cmdhandler;

import com.tk.tinygame.herostory.Broadcaster;
import com.tk.tinygame.herostory.model.User;
import com.tk.tinygame.herostory.model.UserManager;
import com.tk.tinygame.herostory.msg.GameMsgProtocol;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.AttributeKey;

/**
 * 用戶攻擊指令處理器
 */

public class UserAttkCmdHandler implements ICmdHandler<GameMsgProtocol.UserAttkCmd>{
    @Override
    public void handle(ChannelHandlerContext ctx, GameMsgProtocol.UserAttkCmd cmd) {
        if (null == ctx ||
                null == cmd) {
            return;
        }

        // 獲取攻擊者 Id
        Integer attkUserId = (Integer) ctx.channel().attr(AttributeKey.valueOf("userId")).get();
        if (null == attkUserId) {
            return;
        }

        // 獲取被攻擊者 Id
        int targetUserId = cmd.getTargetUserId();
        User targetUser = UserManager.getByUserId(targetUserId);

        if(null == targetUser){
            //如果沒打到人,也推送一下攻擊溉知,這樣客戶端可以顯示攻擊動(dòng)作陨瘩,否則沒有,影響體驗(yàn)
            broadcastAttrResult(attkUserId,-1);
            return;
        }

        final int dmgPoint = 10;
        targetUser.currHp = targetUser.currHp - dmgPoint;

        //廣播攻擊結(jié)果
        broadcastAttrResult(attkUserId,targetUserId);
        //廣播減血結(jié)果
        broadcastSubtractHpResult(targetUserId,dmgPoint);

        if(targetUser.currHp <= 0){
            broadcastDieHpResult(targetUserId);
        }
    }

    /**
     * @param attkUserId
     * @param targetUserId
     * @deprecated 廣播攻擊結(jié)果
     */
    static private void broadcastAttrResult(int attkUserId,int targetUserId){
        if(attkUserId <= 0){
            return;
        }
        GameMsgProtocol.UserAttkResult.Builder resultBuilder = GameMsgProtocol.UserAttkResult.newBuilder();
        resultBuilder.setAttkUserId(attkUserId);
        resultBuilder.setTargetUserId(targetUserId);

        GameMsgProtocol.UserAttkResult newResult = resultBuilder.build();
        Broadcaster.broadcast(newResult);
    }

    /**
     * @param targetUserId
     * @param subtractHp
     * @deprecated 廣播減血結(jié)果
     */
    static private void broadcastSubtractHpResult(int targetUserId,int subtractHp){
        if(targetUserId <= 0 || subtractHp <= 0){
            return;
        }

        // 減血消息, 可以根據(jù)自己的喜好寫...
        // 例如加上裝備加成, 暴擊等等.
        // 這些都屬于游戲的業(yè)務(wù)邏輯了!
        GameMsgProtocol.UserSubtractHpResult.Builder resultBuilder2 = GameMsgProtocol.UserSubtractHpResult.newBuilder();
        resultBuilder2.setTargetUserId(targetUserId);
        //簡單的邏輯级乍,打一下減10血
        resultBuilder2.setSubtractHp(subtractHp);

        GameMsgProtocol.UserSubtractHpResult newResult = resultBuilder2.build();
        Broadcaster.broadcast(newResult);
    }

    /**
     * @param targetUserId
     * @deprecated 廣播死亡結(jié)果
     */
    static private void broadcastDieHpResult(int targetUserId){
        if(targetUserId <= 0){
            return;
        }

        GameMsgProtocol.UserDieResult.Builder resultBuilder = GameMsgProtocol.UserDieResult.newBuilder();
        resultBuilder.setTargetUserId(targetUserId);

        GameMsgProtocol.UserDieResult newResult = resultBuilder.build();
        Broadcaster.broadcast(newResult);
    }
}
3.測(cè)試地址:注意是step020哦

測(cè)試地址:http://cdn0001.afrxvk.cn/hero_story/demo/step020/index.html?serverAddr=127.0.0.1:12345&userId=1舌劳,當(dāng)被攻擊者的血量到0時(shí),人物就被砍翻在地了= =玫荣,做出這個(gè)效果就對(duì)了甚淡。

效果圖

4.思考

大家可以思考一個(gè)問題,攻擊的效果似乎實(shí)現(xiàn)了捅厂,那么攻擊還有其他問題么?應(yīng)該如何解決呢贯卦,接下來的文章會(huì)有解釋和實(shí)現(xiàn)哈

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恒傻,隨后出現(xiàn)的幾起案子脸侥,更是在濱河造成了極大的恐慌,老刑警劉巖盈厘,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睁枕,死亡現(xiàn)場離奇詭異,居然都是意外死亡沸手,警方通過查閱死者的電腦和手機(jī)外遇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來契吉,“玉大人跳仿,你說我怎么就攤上這事【杈В” “怎么了菲语?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惑灵。 經(jīng)常有香客問我山上,道長,這世上最難降的妖魔是什么英支? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任佩憾,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妄帘。我一直安慰自己楞黄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布抡驼。 她就那樣靜靜地躺著鬼廓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪致盟。 梳的紋絲不亂的頭發(fā)上桑阶,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音勾邦,去河邊找鬼。 笑死割择,一個(gè)胖子當(dāng)著我的面吹牛眷篇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荔泳,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蕉饼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了玛歌?” 一聲冷哼從身側(cè)響起昧港,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎支子,沒想到半個(gè)月后创肥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡值朋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年叹侄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昨登。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趾代,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丰辣,到底是詐尸還是另有隱情撒强,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布笙什,位于F島的核電站飘哨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏得湘。R本人自食惡果不足惜杖玲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淘正。 院中可真熱鬧摆马,春花似錦臼闻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蕉毯,卻和暖如春乓搬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背代虾。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工进肯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棉磨。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓江掩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乘瓤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子环形,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354