81 lines
3.3 KiB
Python
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
|