player.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from settings import *
  2. import pygame as pg
  3. import math
  4. class Player:
  5. def __init__(self, game):
  6. self.game = game
  7. self.x, self.y = PLAYER_POS
  8. self.angle = PLAYER_ANGLE
  9. self.shot = False
  10. self.health = PLAYER_MAX_HEALTH
  11. self.rel = 0
  12. self.health_recovery_delay = 700
  13. self.time_prev = pg.time.get_ticks()
  14. # diagonal movement correction
  15. self.diag_move_corr = 1 / math.sqrt(2)
  16. def recover_health(self):
  17. if self.check_health_recovery_delay() and self.health < PLAYER_MAX_HEALTH:
  18. self.health += 1
  19. def check_health_recovery_delay(self):
  20. time_now = pg.time.get_ticks()
  21. if time_now - self.time_prev > self.health_recovery_delay:
  22. self.time_prev = time_now
  23. return True
  24. def check_game_over(self):
  25. if self.health < 1:
  26. self.game.object_renderer.game_over()
  27. pg.display.flip()
  28. pg.time.delay(1500)
  29. self.game.new_game()
  30. def get_damage(self, damage):
  31. self.health -= damage
  32. self.game.object_renderer.player_damage()
  33. self.game.sound.player_pain.play()
  34. self.check_game_over()
  35. def single_fire_event(self, event):
  36. if event.type == pg.MOUSEBUTTONDOWN:
  37. if event.button == 1 and not self.shot and not self.game.weapon.reloading:
  38. self.game.sound.shotgun.play()
  39. self.shot = True
  40. self.game.weapon.reloading = True
  41. def movement(self):
  42. sin_a = math.sin(self.angle)
  43. cos_a = math.cos(self.angle)
  44. dx, dy = 0, 0
  45. speed = PLAYER_SPEED * self.game.delta_time
  46. speed_sin = speed * sin_a
  47. speed_cos = speed * cos_a
  48. keys = pg.key.get_pressed()
  49. num_key_pressed = -1
  50. if keys[pg.K_w]:
  51. num_key_pressed += 1
  52. dx += speed_cos
  53. dy += speed_sin
  54. if keys[pg.K_s]:
  55. num_key_pressed += 1
  56. dx += -speed_cos
  57. dy += -speed_sin
  58. if keys[pg.K_a]:
  59. num_key_pressed += 1
  60. dx += speed_sin
  61. dy += -speed_cos
  62. if keys[pg.K_d]:
  63. num_key_pressed += 1
  64. dx += -speed_sin
  65. dy += speed_cos
  66. # diag move correction
  67. if num_key_pressed:
  68. dx *= self.diag_move_corr
  69. dy *= self.diag_move_corr
  70. self.check_wall_collision(dx, dy)
  71. # if keys[pg.K_LEFT]:
  72. # self.angle -= PLAYER_ROT_SPEED * self.game.delta_time
  73. # if keys[pg.K_RIGHT]:
  74. # self.angle += PLAYER_ROT_SPEED * self.game.delta_time
  75. self.angle %= math.tau
  76. def check_wall(self, x, y):
  77. return (x, y) not in self.game.map.world_map
  78. def check_wall_collision(self, dx, dy):
  79. scale = PLAYER_SIZE_SCALE / self.game.delta_time
  80. if self.check_wall(int(self.x + dx * scale), int(self.y)):
  81. self.x += dx
  82. if self.check_wall(int(self.x), int(self.y + dy * scale)):
  83. self.y += dy
  84. def draw(self):
  85. pg.draw.line(self.game.screen, 'yellow', (self.x * 100, self.y * 100),
  86. (self.x * 100 + WIDTH * math.cos(self.angle),
  87. self.y * 100 + WIDTH * math. sin(self.angle)), 2)
  88. pg.draw.circle(self.game.screen, 'green', (self.x * 100, self.y * 100), 15)
  89. def mouse_control(self):
  90. mx, my = pg.mouse.get_pos()
  91. if mx < MOUSE_BORDER_LEFT or mx > MOUSE_BORDER_RIGHT:
  92. pg.mouse.set_pos([HALF_WIDTH, HALF_HEIGHT])
  93. self.rel = pg.mouse.get_rel()[0]
  94. self.rel = max(-MOUSE_MAX_REL, min(MOUSE_MAX_REL, self.rel))
  95. self.angle += self.rel * MOUSE_SENSITIVITY * self.game.delta_time
  96. def update(self):
  97. self.movement()
  98. self.mouse_control()
  99. self.recover_health()
  100. @property
  101. def pos(self):
  102. return self.x, self.y
  103. @property
  104. def map_pos(self):
  105. return int(self.x), int(self.y)