这段代码有点疯狂,但我更关心的是概念,而不是明确的代码响应。我正在为游戏制作战斗系统。我有一个"攻击" npc字符。环。一旦玩家将npc坏人的生命值降低到零,我想从地图/ DOM /范围等中移除该实体......某些代码(有问题的代码将朝向末尾) -
从database..an数组加载npc字符数据,所有相同的属性,但不同的值。 $ scope.encounters在HTML中重复ng并在屏幕上构建字符。然后将该数据发送到$ scope.encounter_a()函数以执行更多操作。
db.getNpcCombat(npc_combat_set).success(function(data){
$scope.encounters = [];
$scope.encounters = data;
angular.forEach(data, function(value, key){
console.log(value);
$scope.encounter_a(value);
});
这为不同的npcs设置不同速率的进度条的计时器,一旦时间命中100,取消计时器然后运行攻击功能...这是循环的,所以它运行的每个npc的时间不同根据他们的数据。所以value是来自一个npc实体的数据。
$scope.encounter_a = function(value){
value.attack_count = 0;
$timeout(function(){
var set_timer = $interval(function() {
value.attack_count += 1;
if(value.attack_count >= 100){
$interval.cancel(set_timer);
$scope.attack(value);
}
}, value.attack_rate);
}, 500);
}
这部分看起来有点疯狂,但是做了它的工作。这仍然是接收一个npc实体的数据。每个敌人都有不同的攻击,所以基本上,这是从某个NPC攻击数据库中的数据,然后随机化使用哪个攻击,然后计算攻击是否会击中玩家角色。无论攻击是命中还是未命中,它都会循环回到encounter_a()。
$scope.attack = function(data){
$timeout(function(){
db.getNpcFeats(data.feats).success(function(feat_data){
//randomize which feat is used ...get amount of feats
var count = feat_data.length;
//randomize number
count = getRandomInt(1, count);
count = count - 1;
//get feat_hit success - gets random number between 1-10
feat_success = getRandomInt(1, 10);
$('#enemy_'+data.id+' ul li .attack_text h5').html(feat_data[count].feat_name + '!');
$('.attack_text').removeClass('fadeOut').addClass('fadeIn');
$timeout(function(){
$('.attack_text').removeClass('fadeIn').addClass('fadeOut');
}, 1000);
if(feat_data[count].feat_chance >= feat_success){
$scope.damage_amount= getRandomInt(parseInt(feat_data[count].feat_min_damage), parseInt(feat_data[count].feat_max_damage));
$scope.$watch('damage_amount', function() {
$('.feat_name').html(feat_data[count].feat_name);
$('.feat_damage').html('Damage - ' +$scope.damage_amount);
$('.feat_hit .text-danger').html("You've been hit!!");
$('.outer-container').addClass('tada');
$('.feat_hit').removeClass('fadeOutDown').addClass('fadeInUp');
$scope.player_hp = $scope.player_hp - $scope.damage_amount;
if($scope.player_hp >= 0){
//future player death function
}
$timeout(function(){
$('.feat_hit').removeClass('fadeInUp').addClass('fadeOutDown');
}, 2000);
});
}
});
$scope.encounter_a(data);
}, data.attack_delay);
}
最后,这是给我带来麻烦的代码。此代码基本上与上述代码断开连接。这是攻击NPC的玩家的攻击代码。哪个有效,除了NPC的生命值达到零,不知道该怎么办。
$scope.playerFeatAttack = function(player_feat){
//if player has not selected npc to attack, show message and prevent attack then remove message else allow attack
if (!$('.enemy_container').hasClass('attack_selected')){
$('.helper_dialog_area').removeClass('lightSpeedOut');
$('.helper_dialog_area').removeClass('hide');
$('.helper_dialog_area h4').html('CLICK AN ENEMY TO ATTACK!!!');
$('.helper_dialog_area').addClass('lightSpeedIn');
$timeout(function() {
$('.helper_dialog_area').removeClass('lightSpeedIn');
$('.helper_dialog_area').addClass('lightSpeedOut');
}, 2500);
}else{
//calculate hit damage
var hit_damage = getRandomInt(parseInt(player_feat.feat_min_damage), parseInt(player_feat.feat_max_damage));
//calculate attack success
var attack_success_roll = getRandomInt(1, 10);
//if attack passes, run attack
if(player_feat.feat_chance >= attack_success_roll){
//determine which NPC to attack based on the .attack_selected class
//not sure if this is a good way but this is how getting the specific NPC hitpoints
var elem = angular.element($(".attack_selected .npc_hp")).scope();
$scope.npc_hp = $('.attack_selected .npc_hp').html();
//watch for changes in the hitpoints
$scope.$watch('npc_hp', function(){
//change the hitpoints on the screen using jquery..probably not ideal way
var npc_hp = parseInt($scope.npc_hp) - parseInt(hit_damage);
$('.attack_selected .npc_hp').html(npc_hp);
var hp_after_attack = $('.attack_selected .npc_hp').html();
这个主要代码有问题 -
if(hp_after_attack <= 0){
$('.attack_selected').addClass('flipOutX');
var what = angular.element($('.attack_selected')).scope();
}
});
}
}
}
最后一部分是有问题的代码。如果NPC的生命值低于0,首先计划添加一个CSS类来做动画,然后想要从游戏中删除该角色。如果我控制台记录这个 -
var what = angular.element($('.attack_selected')).scope();
我要删除的元素是哪个,我可以看到主要范围中的遇到对象是NPC实体数据。我试图将其更改为NULL,认为它会消除实体的数据,因此无法执行任何操作。还尝试从DOM中删除元素,当然,它会将其从屏幕中删除,但随后它会继续运行攻击。 在范围的$ parent中,我可以看到$ scope.attack()函数..我将其更改为NULL,但随后阻止所有NPC受到攻击。
我需要做的是杀死特定NPC的attack()函数...但是当我控制$ scope时,它看起来像范围内只有1个攻击函数,而不是每个& #34;遭遇&#34;实体/ NPC。
我是否有某种方法可以将attack()函数编码为攻击每个元素的主要范围?也许是一个孤立的范围(我不明白它是什么)?
这是我学习的AngularJS项目......所以任何关于更好地完成上述任务的建议,以及在被杀之后消灭NPC的任何建议都会非常棒。如果您需要我的更多信息,请告诉我。