paia-hw5/TankMan/src/Bullet.py

81 lines
3.3 KiB
Python

from os import path
import pygame
from mlgame.view.view_model import create_asset_init_data, create_image_view_data
from .env import WINDOW_HEIGHT, WINDOW_WIDTH, IMAGE_DIR
Vec = pygame.math.Vector2
class Bullet(pygame.sprite.Sprite):
def __init__(self, construction, **kwargs):
super().__init__()
self.id = construction["_id"]
self.no = construction["_no"]
self.rect = pygame.Rect((0, 0), construction["_init_size"])
self.rect.center = construction["_init_pos"]
self.rot = kwargs["rot"]
self.play_rect_area = kwargs["play_rect_area"]
self.speed = kwargs["bullet_speed"]
self.map_width = WINDOW_WIDTH
self.map_height = WINDOW_HEIGHT
self.angle = 3.14 / 180 * (self.rot + 90)
# Refactor
if 7 > self.angle > 6:
self.angle = 0
self.sqrt2 = 1.414
self.move = {"left_up": Vec(-self.speed/self.sqrt2, -self.speed/self.sqrt2),
"right_up": Vec(self.speed/self.sqrt2, -self.speed/self.sqrt2),
"left_down": Vec(-self.speed/self.sqrt2, self.speed/self.sqrt2),
"right_down": Vec(self.speed/self.sqrt2, self.speed)/self.sqrt2,
"left": Vec(-self.speed, 0), "right": Vec(self.speed, 0), "up": Vec(0, -self.speed),
"down": Vec(0, self.speed)}
self.max_travel_distance = (kwargs["bullet_travel_distance"] // self.speed + 1) * self.speed
self.travel_distance = 0
def update(self):
self.travel_distance += self.speed
if self.play_rect_area.top < self.rect.centery < self.play_rect_area.bottom \
and self.play_rect_area.left < self.rect.centerx < self.play_rect_area.right:
is_out = False
else:
is_out = True
if is_out or self.travel_distance >= self.max_travel_distance:
self.kill()
if self.rot == 0 or self.rot == 360:
self.rect.center += self.move["left"]
elif self.rot == 315 or self.rot == -45:
self.rect.center += self.move["left_up"]
elif self.rot == 270 or self.rot == -90:
self.rect.center += self.move["up"]
elif self.rot == 225 or self.rot == -135:
self.rect.center += self.move["right_up"]
elif self.rot == 180 or self.rot == -180:
self.rect.center += self.move["right"]
elif self.rot == 135 or self.rot == -225:
self.rect.center += self.move["right_down"]
elif self.rot == 90 or self.rot == -270:
self.rect.center += self.move["down"]
elif self.rot == 45 or self.rot == -315:
self.rect.center += self.move["left_down"]
def get_obj_progress_data(self):
img_id = "team_a_bullet" if self.id == 1 else "team_b_bullet"
return create_image_view_data(img_id, self.rect.x, self.rect.y, self.rect.width, self.rect.height,
self.angle)
def get_data_from_obj_to_game(self) -> dict:
info = {"id": f"{self.no}P_bullet",
"x": self.rect.x,
"y": self.rect.y,
"speed": self.speed,
"rot": self.rot
}
return info