Дублирование спрайтов с той же функцией - PullRequest
0 голосов
/ 28 сентября 2018

Я делаю игру pygame, в которой 2 игрока пытаются забить мяч в сетку (упрощенная версия кода ниже).Я добавил бустеры, где ваши секунды повышаются, когда вы собираете буст.Я хочу, чтобы несколько из них были по всей карте в разных местах, но без копирования и вставки кода несколько раз.Мой предыдущий вопрос ( Как реализовать тайм-аут / время восстановления после столкновения ) показывает, как это сделать с self, но при использовании classes.Я не очень разбираюсь в Python и не научил себя, как делать некоторые менее интересные вещи (например, для меня), как правильно использовать классы.Я хотел бы, чтобы кто-то продублировал бустпад, сохранив код в том же формате, в котором он находится сейчас (без классов, потому что я мусор на python :() и не копирую и psting код несколько раз. Возможно ли это?

import pygame
from pygame.math import Vector2
import time, datetime
import sys

pygame.font.init()
pygame.init()


WIDTH = 1150
HEIGHT = 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()


REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
pygame.draw.polygon(
    REDCAR_ORIGINAL, (255, 0, 0), [(0, 30), (50, 20), (50, 10), (0, 0)])
redangle = 180
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
redangle = 180
booster = pygame.Surface((50, 150), pygame.SRCALPHA)
booster.fill(pygame.color.Color("yellow"))
booster1 = booster.get_rect(topleft=(0, 340))
boostermask = pygame.mask.from_surface(booster)


redspeed = 5

dx = 0
dy = 0
x = 800
y = 500
redscore = 0
boostpadtimer = 3


pos_red = Vector2(x,y)
vel_red = Vector2(-redspeed,0)
redrect = redcar.get_rect(center=pos_red)
redangle = 180
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
pos_blue = Vector2(275,300)


# Masks.
mask_red = pygame.mask.from_surface(redcar)


def redboosts():
    global vel_red
    global timer
    global dt
    if timer > 0:
        vel_red.scale_to_length(10)
        timer -= dt



def slowdown():
    vel_red.scale_to_length(5)






timer = 3
dt = 1
boost_recieved = False
timerr = False









run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == pygame.KEYDOWN:
          if event.key == pygame.K_r:
              # Reset the car to the start position.
              redangle = 180
              redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
              pos_red = Vector2(800, 500)
              vel_red = Vector2(-redspeed, 0)
              redrect = redcar.get_rect(center=pos_red)
              mask_red = pygame.mask.from_surface(redcar)
          #elif event.key == pygame.K_s:
          #    vel_blue.scale_to_length(2)
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                vel_red.scale_to_length(5)
            elif event.key == pygame.K_DOWN:
              vel_red.scale_to_length(5)


    #print(boostpadtimer)
    print(timer)

    if boost_recieved:
        if boostpadtimer == 3:
            timer += 3
            booster.fill(pygame.color.Color("grey"))
            boost_recieved = False
    if timerr:
        boostpadtimer -= dt

    if boostpadtimer <= 0:
        timerr = False
        boostpadtimer = 3

    if boostpadtimer == 3:
        booster.fill(pygame.color.Color("yellow"))




    #if timer < 0:
    #    timer = 3


    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
              redangle += 5
              vel_red.rotate_ip(-5)
              redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
              redrect = redcar.get_rect(center=redrect.center)
              # We need a new mask after the rotation.
              mask_red = pygame.mask.from_surface(redcar)
    elif keys[pygame.K_RIGHT]:
              redangle -= 5
              vel_red.rotate_ip(5)
              redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
              redrect = redcar.get_rect(center=redrect.center)
              mask_red = pygame.mask.from_surface(redcar)


    if keys[pygame.K_UP]:
              redboosts()
    if keys[pygame.K_DOWN]:
              vel_red.scale_to_length(2)
    if keys[pygame.K_s]:
              vel_blue.scale_to_length(2)

    if y <0:
        y = 10
    if y > 450:
        y = 440
    if x > 480:
        x = 470


    if redrect.top < 0 and vel_red.y < 0:
        redrect.top = 0
        pos_red = Vector2(redrect.center)
    elif redrect.bottom > screen.get_height() and vel_red.y > 0:
        redrect.bottom = screen.get_height()
        pos_red = Vector2(redrect.center)
    if redrect.left < 0 and vel_red.x < 0:
        redrect.left = 0
        pos_red = Vector2(redrect.center)
    elif redrect.right > screen.get_width() and vel_red.x > 0:
        redrect.right = screen.get_width()
        pos_red = Vector2(redrect.center)


    pos_red += vel_red
    redrect.center = pos_red


    offset = booster1[0] - redrect[0], booster1[1] - redrect[1]
    collectboost = mask_red.overlap(boostermask, offset)

    if timer <= 0:
        timer = 0
        vel_red.scale_to_length(5)
        slowdown()

    if collectboost:
        boost_recieved = True
        timerr = True


    screen.fill((50,200,50))
    screen.blit(redcar, redrect)
    screen.blit(booster, booster1)


    pygame.display.flip()
    dt = clock.tick(60)/1000
pygame.quit()

1 Ответ

0 голосов
/ 29 сентября 2018

Чтобы ответить на ваш вопрос: я не думаю, что то, что вы хотите, возможно без использования классов.

Это отличный способ реализовать такие вещи, как ваш boostpad.

Простой пример:

class BoostPad(pygame.Surface):

    def __init__(color='red',time_value=3,x_size=0,y_size=0,size_or_position=(0,0)):
        self.color = color
        self.time_value=time_value
        self.time = time_value

        super(pygame.Surface, self).__init__((x_size, y_size, pygame.SRCALPHA)
        self.fill(pygame.color.Color(color))
        # Not sure if this is a size or position
        self.size_or_position = self.get_rect(topleft=size_or_position)
        self.mask = pygame.mask.from_surface(booster)


    def set_color(color):
        self.fill(pygame.color.Color(color))


    def boost_triggered(self):
        if self.time is self.time_value:
            self.time = 0
            self.set_color('grey')
            return self.time_value


    def add_time(self, dt):
        self.time += dt
        if self.time is self.time_value:
            self.set_color(self.color)

и т. Д. И т. П.

Я не совсем уверен, что могу понять, как работает ваша игра, поскольку я никогда не использовал pygame, но приложение должно быть похожим.

...