python Pygame разные способы блит спрайт. Группа () на сцене - PullRequest
1 голос
/ 05 февраля 2020

Я хочу создать корабль и установить 3 символа малого корабля для жизни, поэтому я установил различный размер изображения как self.ship=pygame.transform.smoothscale(temp,(200,200)) и self.image=pygame.transform.smoothscale(temp,(70,70)) Большой размер (200,200) для движущегося корабля и маленький размер (70,70) для left_ship как символа

Я использую два способа сделать это:

  1. self.ships.draw(self.setting.screen)

    таким образом необходимо установить корабль как image и позиция как rect

  2. for left_ship in self.ships: self.setting.screen.blit(left.ship.image,left.ship.rect)

Но, наконец, когда я создаю весь код и запускаю его, на экране нет символа left_ship, что вызывает его и как я могу это исправить ?? вот коды:

#!/usr/bin/python
import sys
import pygame 

class Setting():
    def __init__(self,width,height):
        self.w=width
        self.h=height
        self.flag=pygame.RESIZABLE
        self.color=(255,255,255)
        self.screen=pygame.display.set_mode((self.w,self.h),self.flag)
        self_title=pygame.display.set_caption("Muhaha")                  
        self.ship_left = 3


class Lifes():
    '''create a Group for left_ships '''
    def __init__(self,setting):
        self.setting=setting
        self.left_ships()

    def left_ships(self):
        self.ships=pygame.sprite.Group()
        '''set the different position and add into the Group'''
        for ship_number in range(self.setting.ship_left):
            ship=Ship(self.setting)
            ship.rect.x= 100 + ship_number*ship.rect.width 
            ship.rect.y= self.setting.screen.get_rect().height  
            self.ships.add(ship)

    def blit(self):
        '''test two way to blit the left_ship on the screen but all failed'''
        self.ships.draw(self.setting.screen)
        for left_ship in self.ships:
            self.setting.screen.blit(left_ship.image,left_ship.rect)


class Ship(pygame.sprite.Sprite):
    def __init__(self,setting):
        super().__init__()
        '''set two size of ship and set the big ship postion is on the middle bottom of the screen'''
        self.setting=setting
        temp=pygame.image.load("/home/finals/python/alien/image/title.jpg").convert_alpha()
        self.ship=pygame.transform.smoothscale(temp,(200,200))
        self.image=pygame.transform.smoothscale(temp,(70,70))
        self.screen_rect=self.setting.screen.get_rect()
        self.rect=self.ship.get_rect()

        self.rect.centerx=self.screen_rect.centerx
        self.rect.bottom=self.screen_rect.bottom

    def blit(self):
        self.setting.screen.fill((255,255,255))
        self.setting.screen.blit(self.ship,self.rect)


class Check_event():
    def __init__(self):
        self.moving_up = False 
        self.moving_down = False
        self.moving_left = False
        self.moving_right = False
    def event(self):
        for event in pygame.event.get():
           if event.type == pygame.QUIT:
               sys.exit()


def game():
    pygame.init()
    setting=Setting(1200,800)
    ship=Ship(setting) 
    check_event=Check_event()
    lifes=Lifes(setting)


    while True:
        check_event.event()
        lifes.blit()
        ship.blit()
        pygame.display.flip()
game()

1 Ответ

1 голос
/ 05 февраля 2020

Есть 2 вопроса. Экран очищается в Ship.blit, поэтому все, что нарисовано до ship.blit(), не видно. Очистите экран в главном приложении l oop, прежде чем рисовать корабли:

class Ship(pygame.sprite.Sprite):
    # [...]

    def blit(self):
        self.setting.screen.blit(self.ship,self.rect)
def game():
    # [...]

    while True:
        check_event.event()
        setting.screen.fill((255,255,255))
        ship.blit()
        lifes.blit()
        pygame.display.flip()

Кроме того, небольшие корабли находятся в нижней части окна. Это вызвано ship.rect.y = self.setting.screen.get_rect().height. Измените положение кораблей. например:

class Lifes():
    # [...]

    def left_ships(self):
        self.ships=pygame.sprite.Group()
        '''set the different position and add into the Group'''
        for ship_number in range(self.setting.ship_left):
            ship=Ship(self.setting)
            ship.rect = ship.image.get_rect()
            ship.rect.x = 100 + ship_number*ship.rect.width*2 
            ship.rect.bottom = self.setting.screen.get_rect().height
            self.ships.add(ship)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...