Не могу интегрировать класс с другого кода игры.

ruivit

Новичок
Пользователь
Дек 13, 2021
3
0
1
Весь вечер мучаюсь с тем что не получается перенести класс Bullet с одного кода игры в другой. Вот сам код класса игры.
Python:
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((4, 20))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = -10
    #полёт пуль
    def update(self):
        self.rect.y += self.speedy
        # убить, если он заходит за верхнюю часть экрана
        if self.rect.bottom < 0:
            self.kill()

Вот есть у нас сам класс перса у него есть обработчик свойства функция shoot. Ну и вот код класса самого персонажа
Python:
#Класс персонажа
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        #self.image = pygame.image.load("character.png")
        self.surf = pygame.Surface((40, 60))
        self.surf.fill((128,255,40))
        self.rect = self.surf.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 200
        self.pos = vec((300, 360))
        self.vel = vec(0,0)
        self.acc = vec(0,0)
 
    def move(self):
        self.acc = vec(0,0.5)
    
        pressed_keys = pygame.key.get_pressed()
                
        if pressed_keys[K_LEFT]:
            self.acc.x = -ACC
        if pressed_keys[K_RIGHT]:
            self.acc.x = ACC
                
        self.acc.x += self.vel.x * FRIC
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        
        if self.pos.x > WIDTH:
            self.pos.x = 0
        if self.pos.x < 0:
            self.pos.x = WIDTH
            
        self.rect.midbottom = self.pos
 
    def jump(self):
        hits = pygame.sprite.spritecollide(self, platforms, False)
        if hits:
           self.vel.y = -15
 
 
    def update(self):
        hits = pygame.sprite.spritecollide(P1 ,platforms, False)
        if P1.vel.y > 0:       
            if hits:
                self.vel.y = 0
                self.pos.y = hits[0].rect.top + 1

    #------------------------------------------------------

     # обработка выстрела

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

    #--------------------------------------------------------
Класс прыгаете бегает при нажатие кнопок вроде как не глючит. Но вот при клики на энтере выстрел обрабатываемым кодом
Python:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            #Обработка событий
            #Событие прыжка перса
            if event.key == pygame.K_SPACE:
                P1.jump() 

            #Событие выстрела перса
            elif event.key == pygame.K_KP_ENTER:
                P1.shoot()
Не могу сообразить где именно у меня ошибка когда вроде все должно работать но оно не чего не происходит. Я уже всё поп перепробовал но вот не как событие не работает. В играх я не очень по этому тут для меня просто много чего непонятного особенно эти спрайты. Вот код игры ниже для полной картины как говориться да и может кому пригодится.
Python:
import pygame
from pygame.locals import *
import sys
import random
import clasiki
import array

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
 
pygame.init()
vec = pygame.math.Vector2 #2 for two dimensional
 
WIDTH = 1400  # Длина сцены
HEIGHT = 750 #Ширина сцены
ACC = 0.5
FRIC = -0.12
FPS = 60
 
FramePerSec = pygame.time.Clock()
 
displaysurface = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Палигон отработки решений")

#Класс персонажа
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        #self.image = pygame.image.load("character.png")
        self.surf = pygame.Surface((40, 60))
        self.surf.fill((128,255,40))
        self.rect = self.surf.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 200
        self.pos = vec((300, 360))
        self.vel = vec(0,0)
        self.acc = vec(0,0)
 
    def move(self):
        self.acc = vec(0,0.5)
    
        pressed_keys = pygame.key.get_pressed()
                
        if pressed_keys[K_LEFT]:
            self.acc.x = -ACC
        if pressed_keys[K_RIGHT]:
            self.acc.x = ACC
                
        self.acc.x += self.vel.x * FRIC
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        
        if self.pos.x > WIDTH:
            self.pos.x = 0
        if self.pos.x < 0:
            self.pos.x = WIDTH
            
        self.rect.midbottom = self.pos
 
    def jump(self):
        hits = pygame.sprite.spritecollide(self, platforms, False)
        if hits:
           self.vel.y = -15
 
 
    def update(self):
        hits = pygame.sprite.spritecollide(P1 ,platforms, False)
        if P1.vel.y > 0:       
            if hits:
                self.vel.y = 0
                self.pos.y = hits[0].rect.top + 1

    #------------------------------------------------------

     # обработка выстрела

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)

    #--------------------------------------------------------

 #Клас платформы
class platform(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.surf = pygame.Surface((WIDTH, 20))
        self.surf.fill((255,0,0))
        self.rect = self.surf.get_rect(center = (WIDTH/2, HEIGHT - 10))
 
    def move(self):
        pass
#Класс преграды для персанажа
class pregrada(pygame.sprite.Sprite):
    def __init__(self,zx,zy):
        super().__init__()
        self.surf = pygame.Surface((40, 40))
        self.surf.fill((BLUE))
        self.rect = self.surf.get_rect()

        self.rect.x = zx
        self.rect.y = zy
        
    def move(self):
       pass

#Лечилка   появляется в случайном месте карты игры
class hil(pygame.sprite.Sprite):
    def __init__(self,zx,zy):
        super().__init__()
        self.surf = pygame.Surface((40, 40))
        self.surf.fill((WHITE))
        self.rect = self.surf.get_rect()
        self.rect.x = zx
        self.rect.y = zy
        
    def move(self):
       pass


#Класс выстрелов

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((4, 20))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speedy = -10
    #полёт пуль
    def update(self):
        self.rect.y += self.speedy
        # убить, если он заходит за верхнюю часть экрана
        if self.rect.bottom < 0:
            self.kill()
 

PT1 = platform()
P1 = Player()
all_sprites = pygame.sprite.Group()

all_sprites.add(PT1)
all_sprites.add(P1)


platforms = pygame.sprite.Group()

hilila = pygame.sprite.Group()

pre = pygame.sprite.Group()
#Группа выстрилов
bullets = pygame.sprite.Group()

platforms.add(PT1)

#Функции и всякая ерунда
#Функция посроения платформ

def platfornome (x,y):
    K = pregrada(x,y)   #Кардинаты платформы
    all_sprites.add(K) 
    platforms.add(K)

#Функция размещение хила
def hililka (x,y):
    K = hil(x,y)   #Кардинаты платформы
    all_sprites.add(K) 
    hilila.add(K)


#####################################################

"""
        -   это платформа (реализовано)
        +   это хилилка (реализована )
        $   это враг
        #   это жуть при соприкосновение игра заканчивается

"""
    
#Карата уравня 1
lavel = [
           "-     -              -            -",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                                   ",
           "                      ----         ",
           "                                   ",
           "                                   ",
           "                                   ",
           "    -----------                    ",
           "                                   ",
           "                                   ",
           "                 ---               ",
           "                                   ",
           "                                   ",
           "-----------------------------------"]

#Построение уровня

x = 0
y = 0

for row in lavel:
    for col in row:
        if col == '-':
            platfornome (x,y) #Строим платформы в режиме онлаин
        elif col == '+':
            hililka (x,y)
        x += 40
    x = 0
    y += 40

##########################################################
 
 
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            #Обработка событий
            #Событие прыжка перса
            if event.key == pygame.K_SPACE:
                P1.jump() 

            #Событие выстрела перса
            elif event.key == pygame.K_KP_ENTER:
                P1.shoot()
            
    displaysurface.fill((0,0,0))
    all_sprites.update()

    for entity in all_sprites:
        displaysurface.blit(entity.surf, entity.rect)
        entity.move()
    pygame.display.flip()
    #pygame.display.update()
    FramePerSec.tick(FPS)
 

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