之前為了測(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)哈