Pygame. как сделать все через 'from pygame imort *'

R_M

Новичок
Пользователь
Янв 10, 2021
24
1
3
здравствуйте, помогите пожалуйста чучуть оптимизировать код, он работает как надо, но мне не нравится что в нем два раза прописана библиотека pygame, как можно избавиться от 'import pygame' и сделать все через 'from pygame import *'?
Python:
from pygame import *
import pygame

import random
import time
import math

win_width = 1650
win_height = 950
display.set_caption('Waiting for sunrise')
window = display.set_mode((win_width, win_height))
background = transform.scale(image.load('background.png'), (win_width, win_height))

class GameSprite(sprite.Sprite):
    def __init__(self, img, pos):
        super().__init__()
        self.image = transform.scale(image.load(img), (60, 60))
        self.image.set_colorkey([0, 255, 255])
        self.rect = self.image.get_rect()
    def reset(self):
        window.blit(self.image, (self.rect.x, self.rect.y))

class Player(GameSprite):
    def __init__(self, img, pos, speed):
        GameSprite.__init__(self, img, pos)
        self.image = transform.scale(image.load(img), (60, 60))
        self.image.set_colorkey([0, 255, 255])
        self.rect = self.image.get_rect()
        self.speed = speed      
    def update(self):
        keys = key.get_pressed()
        if keys[K_LEFT] and self.rect.x > 20:
            self.rect.x -= self.speed
        if keys[K_RIGHT] and self.rect.x < 1140:
            self.rect.x += self.speed
        if keys[K_UP] and self.rect.y > 20:
            self.rect.y -= self.speed
        if keys[K_DOWN] and self.rect.y < 870:
            self.rect.y += self.speed

class Enemy(sprite.Sprite):
    def __init__(self, img, pos, speed):
        super().__init__()
        self.image = transform.scale(image.load(img), (60, 60))
        self.image.set_colorkey([0, 255, 255])
        self.rect = self.image.get_rect()
        self.speed = speed
        self.pos = pygame.Vector2(pos[0], pos[1])
    def Chassing(self, Player):
        deltaVec = pygame.Vector2(Player.rect.center) - self.pos
        len = deltaVec.length()
        if len > 0:
            self.pos += deltaVec/len * min(len, self.speed)

    def update(self):
        self.rect.center = (int(round(self.pos.x)), int(round(self.pos.y)))
        window.blit(self.image, self.rect)

       


all_sprites_list = pygame.sprite.Group()

player = Player('q.png', [350, 350], 5)
player.rect.x = 960
player.rect.y = 505
all_sprites_list.add(player)
clock = pygame.time.Clock()
enemy_list = []
enemy_rad = 15  
enemy_dist = (200, 900)
next_enemy_time = 1000


game = True
while game:
    window.blit(background,(0, 0))

    player.reset()
    player.update()

    for i in event.get():
        if i.type == QUIT:
            game = False



    current_time = pygame.time.get_ticks()
    if current_time > next_enemy_time:
        next_enemy_time = current_time + 2000

        on_screen_rect = pygame.Rect(enemy_rad, enemy_rad, win_width-2*enemy_rad, win_height-2*enemy_rad)
        enemy_pos = (-1, -1)
        while not on_screen_rect.collidepoint(enemy_pos):
            dist  = random.randint(*enemy_dist)
            angle = random.random() * math.pi * 2
            p_pos = (player.rect.centerx, player.rect.centery)
            enemy_pos = (p_pos[0] + dist * math.sin(angle), p_pos[1] + dist * math.cos(angle))

        new_pos = (random.randrange(0, win_width), random.randrange(0, win_height))
        new_enemy = Enemy('k.png', enemy_pos, 2.75)
        enemy_list.append(new_enemy)

    for enemy in enemy_list:
        enemy.Chassing(player)

    window.blit(player.image,player.rect)

    for enemy in enemy_list:
        enemy.update()

    pygame.display.flip()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
как можно избавиться от 'import pygame' и сделать все через 'from pygame import *
Обычно делают наоборот (импортируют модуль вместо использования from модуль import *).
Вот пример без import pygame:
Python:
from pygame import *

import random
import math

win_width = 1650
win_height = 950
display.set_caption('Waiting for sunrise')
window = display.set_mode((win_width, win_height))
background = transform.scale(image.load('background.png'), (win_width, win_height))

class GameSprite(sprite.Sprite):
    def __init__(self, img, pos):
        super().__init__()
        self.image = transform.scale(image.load(img), (60, 60))
        self.image.set_colorkey([0, 255, 255])
        self.rect = self.image.get_rect()
    def reset(self):
        window.blit(self.image, (self.rect.x, self.rect.y))

class Player(GameSprite):
    def __init__(self, img, pos, speed):
        GameSprite.__init__(self, img, pos)
        self.image = transform.scale(image.load(img), (60, 60))
        self.image.set_colorkey([0, 255, 255])
        self.rect = self.image.get_rect()
        self.speed = speed     
    def update(self):
        keys = key.get_pressed()
        if keys[K_LEFT] and self.rect.x > 20:
            self.rect.x -= self.speed
        if keys[K_RIGHT] and self.rect.x < 1140:
            self.rect.x += self.speed
        if keys[K_UP] and self.rect.y > 20:
            self.rect.y -= self.speed
        if keys[K_DOWN] and self.rect.y < 870:
            self.rect.y += self.speed

class Enemy(sprite.Sprite):
    def __init__(self, img, pos, speed):
        super().__init__()
        self.image = transform.scale(image.load(img), (60, 60))
        self.image.set_colorkey([0, 255, 255])
        self.rect = self.image.get_rect()
        self.speed = speed
        self.pos = Vector2(pos[0], pos[1])
    def Chassing(self, Player):
        deltaVec = Vector2(Player.rect.center) - self.pos
        len = deltaVec.length()
        if len > 0:
            self.pos += deltaVec/len * min(len, self.speed)

    def update(self):
        self.rect.center = (int(round(self.pos.x)), int(round(self.pos.y)))
        window.blit(self.image, self.rect)

      


all_sprites_list = sprite.Group()

player = Player('q.png', [350, 350], 5)
player.rect.x = 960
player.rect.y = 505
all_sprites_list.add(player)
clock = time.Clock()
enemy_list = []
enemy_rad = 15 
enemy_dist = (200, 900)
next_enemy_time = 1000


game = True
while game:
    window.blit(background,(0, 0))

    player.reset()
    player.update()

    for i in event.get():
        if i.type == QUIT:
            game = False



    current_time = time.get_ticks()
    if current_time > next_enemy_time:
        next_enemy_time = current_time + 2000

        on_screen_rect = Rect(enemy_rad, enemy_rad, win_width-2*enemy_rad, win_height-2*enemy_rad)
        enemy_pos = (-1, -1)
        while not on_screen_rect.collidepoint(enemy_pos):
            dist  = random.randint(*enemy_dist)
            angle = random.random() * math.pi * 2
            p_pos = (player.rect.centerx, player.rect.centery)
            enemy_pos = (p_pos[0] + dist * math.sin(angle), p_pos[1] + dist * math.cos(angle))

        new_pos = (random.randrange(0, win_width), random.randrange(0, win_height))
        new_enemy = Enemy('k.png', enemy_pos, 2.75)
        enemy_list.append(new_enemy)

    for enemy in enemy_list:
        enemy.Chassing(player)

    window.blit(player.image,player.rect)

    for enemy in enemy_list:
        enemy.update()

    display.flip()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
через import pygame удобнее что ли получается?
from модуль import * - считает плохой практикой потому что возможно перекрытие имен функций.
Например, в вашем коде если дополнительно использовать модуль time можно получить ошибку:

Python:
from pygame import *

import random
import math
import time

...
# в этой строке вызов функции time.Clock() из модуля pygame перекроется
# вызовом функции Clock() из модуля time
# а так как такой функции в модуле time нет - будет ошибка
# AttributeError: module 'time' has no attribute 'Clock'
clock = time.Clock()
...
 

R_M

Новичок
Пользователь
Янв 10, 2021
24
1
3
Обычно делают наоборот (импортируют модуль вместо использования from модуль import *)
спасибо!, а можете пожалуйста сказать, через import pygame удобнее что ли получается?
 

Форум IT Специалистов