You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
5.0 KiB
158 lines
5.0 KiB
import pygame
|
|
|
|
from modules.sprites import tanks
|
|
from modules.sprites.bullet import Bullet
|
|
from modules.sprites.foods import Foods
|
|
from modules.sprites.home import Home
|
|
from modules.sprites import SceneElement, Ice, Brick, Tree, River, Iron
|
|
|
|
|
|
class SceneElementsGroup(object):
|
|
def __init__(self):
|
|
self.__ice_group = pygame.sprite.Group()
|
|
self.__iron_group = pygame.sprite.Group()
|
|
self.__brick_group = pygame.sprite.Group()
|
|
self.__tree_group = pygame.sprite.Group()
|
|
self.__river_group = pygame.sprite.Group()
|
|
|
|
@property
|
|
def ice_group(self):
|
|
return self.__ice_group
|
|
|
|
@property
|
|
def iron_group(self):
|
|
return self.__iron_group
|
|
|
|
@property
|
|
def brick_group(self):
|
|
return self.__brick_group
|
|
|
|
@property
|
|
def tree_group(self):
|
|
return self.__tree_group
|
|
|
|
@property
|
|
def river_group(self):
|
|
return self.__river_group
|
|
|
|
def add(self, scene_element: SceneElement):
|
|
if isinstance(scene_element, Ice):
|
|
self.ice_group.add(scene_element)
|
|
elif isinstance(scene_element, Brick):
|
|
self.brick_group.add(scene_element)
|
|
elif isinstance(scene_element, Tree):
|
|
self.tree_group.add(scene_element)
|
|
elif isinstance(scene_element, River):
|
|
self.river_group.add(scene_element)
|
|
elif isinstance(scene_element, Iron):
|
|
self.iron_group.add(scene_element)
|
|
|
|
def draw(self, screen: pygame.Surface, layer: int):
|
|
if layer == 1:
|
|
self.ice_group.draw(screen)
|
|
self.river_group.draw(screen)
|
|
elif layer == 2:
|
|
self.brick_group.draw(screen)
|
|
self.iron_group.draw(screen)
|
|
self.tree_group.draw(screen)
|
|
|
|
|
|
class EntityGroup(object):
|
|
def __init__(self):
|
|
self.__player_tanks = pygame.sprite.Group()
|
|
self.__enemy_tanks = pygame.sprite.Group()
|
|
self.__player_bullets = pygame.sprite.Group()
|
|
self.__enemy_bullets = pygame.sprite.Group()
|
|
self.__foods = pygame.sprite.Group()
|
|
|
|
@property
|
|
def player_tanks(self):
|
|
return self.__player_tanks
|
|
|
|
@property
|
|
def enemy_tanks(self):
|
|
return self.__enemy_tanks
|
|
|
|
@property
|
|
def player_bullets(self):
|
|
return self.__player_bullets
|
|
|
|
@property
|
|
def enemy_bullets(self):
|
|
return self.__enemy_bullets
|
|
|
|
@property
|
|
def foods(self):
|
|
return self.__foods
|
|
|
|
def add(self, entity: pygame.sprite):
|
|
if isinstance(entity, tanks.PlayerTank):
|
|
self.player_tanks.add(entity)
|
|
elif isinstance(entity, tanks.EnemyTank):
|
|
self.enemy_tanks.add(entity)
|
|
elif isinstance(entity, Foods):
|
|
self.foods.add(entity)
|
|
elif isinstance(entity, Bullet):
|
|
if isinstance(entity.tank, tanks.PlayerTank):
|
|
self.player_bullets.add(entity)
|
|
elif isinstance(entity.tank, tanks.EnemyTank):
|
|
self.enemy_bullets.add(entity)
|
|
else:
|
|
raise TypeError('Unknown Entity Type')
|
|
|
|
def clear_enemy_tanks(self):
|
|
self.enemy_tanks.empty()
|
|
|
|
def remove(self, entity: pygame.sprite):
|
|
if isinstance(entity, tanks.PlayerTank):
|
|
self.player_tanks.remove(entity)
|
|
elif isinstance(entity, tanks.EnemyTank):
|
|
self.enemy_tanks.remove(entity)
|
|
elif isinstance(entity, Foods):
|
|
self.foods.remove(entity)
|
|
elif isinstance(entity, Bullet):
|
|
if isinstance(entity.tank, tanks.PlayerTank):
|
|
self.player_bullets.remove(entity)
|
|
elif isinstance(entity.tank, tanks.EnemyTank):
|
|
self.enemy_bullets.remove(entity)
|
|
else:
|
|
raise TypeError('Unknown Entity Type')
|
|
|
|
def draw(self, screen: pygame.Surface, layer: int):
|
|
if layer == 1:
|
|
self.player_bullets.draw(screen)
|
|
self.enemy_bullets.draw(screen)
|
|
self.player_tanks.draw(screen)
|
|
for tank in self.player_tanks:
|
|
tank.draw(screen)
|
|
self.enemy_tanks.draw(screen)
|
|
elif layer == 2:
|
|
self.foods.draw(screen)
|
|
|
|
def update(self, scene_elements: SceneElementsGroup, home: Home):
|
|
# 更新并画我方子弹
|
|
for bullet in self.player_bullets:
|
|
if bullet.move():
|
|
bullet.kill()
|
|
# 更新并画敌方子弹
|
|
for bullet in self.enemy_bullets:
|
|
if bullet.move():
|
|
bullet.kill()
|
|
# 更新并画我方坦克
|
|
for tank in self.player_tanks:
|
|
tank.update()
|
|
# 更新并画敌方坦克
|
|
for tank in self.enemy_tanks:
|
|
self.remove(tank)
|
|
remove_flag, bullet = tank.update(
|
|
scene_elements, self.player_tanks, self.enemy_tanks, home
|
|
)
|
|
self.add(tank)
|
|
if isinstance(bullet, Bullet):
|
|
self.add(bullet)
|
|
if remove_flag:
|
|
self.remove(tank)
|
|
# 更新食物
|
|
for food in self.foods:
|
|
if food.update():
|
|
self.remove(food) |