Hello everybody,
since a couple of weeks, I am trying to add armour into my game. But it not seems to be working.
The damage that the mob does, should get subtracted my the armour protection number. But this is not happening.
Here's the necessary code:
The whole thing is in the update section:
# zombies hit player
hits = pg.sprite.spritecollide(self.player, self.zombies, False, collide_hit_rect)
for hit in hits:
hit.vel = vec(0, 0)
if self.player.health <= 0:
self.playing = False
if hits:
self.player.hit()
self.player.pos += vec(ZOMBIE_KNOCKBACK, 0).rotate(-hits[0].rot)
if self.player.leather_chest_plate_on == True:
self.leather_chest_plate_protection -= ZOMBIE_DAMAGE
if self.leather_chest_plate_protection < 1:
self.player.health -= ZOMBIE_DAMAGE
else:
self.player.health -= ZOMBIE_DAMAGE
Do you have any idea, why it is not working as it should?
Thanks for your help.
Piethon
1) It's possible there's a typo somewhere, or that self.player.leather_chest_plate_on
isn't set to True.
2) It looks like the armor takes the full damage, and then if the armor hasn't been destroyed (it's >1), the full damage is applied to the player. I imagine if the zombie damage was higher than the leather armor, then the full damage would always hit the player (since self.leather_chest_plate_protection
would immediately be <1).
3) The leather armor protection doesn't look like it regenerates, so maybe only the first one or two hits are prevented, and any further hits deal full damage?
And I think if that doesn't help, we'll need to see more code (all of it? do you have it on github?) to try to see where the issue is.
Here:
if self.player.leather_chest_plate_on == True:
self.leather_chest_plate_protection -= ZOMBIE_DAMAGE
I would expect to see this:
if self.player.leather_chest_plate_on == True:
self.player.health -= ZOMBIE_DAMAGE - self.leather_chest_plate_protection
Your code doesn't show any place where the player gets hit and armor reduces damage each hit. It's the value of self.leather_chest_plate_protection that gets reduced to 0 then the player takes all subsequent damage.
(Dec-10-2019, 07:09 PM)michael1789 Wrote: [ -> ]Here:
if self.player.leather_chest_plate_on == True:
self.leather_chest_plate_protection -= ZOMBIE_DAMAGE
I would expect to see this:
if self.player.leather_chest_plate_on == True:
self.player.health -= ZOMBIE_DAMAGE - self.leather_chest_plate_protection
Your code doesn't show any place where the player gets hit and armor reduces damage each hit. It's the value of self.leather_chest_plate_protection that gets reduced to 0 then the player takes all subsequent damage.
Hmm...seem's logic but it doesn't work.

If it doesn't work, maybe this will tell us why.
if self.player.leather_chest_plate_on == True:
print(self.player.leather_chest_plate_on)
print(self.player.health)
self.player.health -= ZOMBIE_DAMAGE - self.leather_chest_plate_protection
print(self.player.health, ZOMBIE_DAMAGE, self.leather_chest_plate_protection)
Then the leather chest plate is never on.
(Dec-12-2019, 05:38 PM)nilamo Wrote: [ -> ]Then the leather chest plate is never on.
In the event section I have this:
#event stuff
#...
if event.key == pg.K_SPACE:
if self.player.leather_chest_plate == True:
self.show_armour_on_screen = True
self.player.leather_chest_plate_on = True
if self.player.leather_chest_plate_on == True:
self.player.leather_chest_plate_on = False
self.player.leather_chest_plate is always true. My armour is getting displayed on the screen, when I press space.
EDIT: It is not that much extended, that happened when posting.
#event stuff
#...
if event.key == pg.K_SPACE:
if self.player.leather_chest_plate == True:
self.show_armour_on_screen = True
self.player.leather_chest_plate_on = True
if self.player.leather_chest_plate_on == True: <------ if true
self.player.leather_chest_plate_on = False <------ make it false
there it is.
(Dec-13-2019, 03:58 PM)michael1789 Wrote: [ -> ]#event stuff
#...
if event.key == pg.K_SPACE:
if self.player.leather_chest_plate == True:
self.show_armour_on_screen = True
self.player.leather_chest_plate_on = True
if self.player.leather_chest_plate_on == True: <------ if true
self.player.leather_chest_plate_on = False <------ make it false
there it is.
Eh...I don't really understand what you mean. It is True and False. Shall I set the True one to False and the False one to True?