python - 我可以从一个类获取 rect.x 以在另一类中使用吗?

标签 python class pygame

所以基本上我希望我的道路类(class)始终知道我的汽车(玩家1)类(class)在哪里,这样道路就知道是否在汽车离开道路时减速(或者当汽车返回道路区域时能够加速)。

由于汽车仅向左/向右移动,并且道路会加速从屏幕上下来,因此我想出了一种方法来在相同的起始位置使用“self.where_player”来模仿汽车,然后添加/减去x位置并跟随按下键(a,d),但过了一会儿,它可能会失去汽车的位置,因为汽车可以在冰上向左或向右滑动时添加或减去x值,或者如果在油上旋转,则暂时禁用它的键(a,d) ,而路不知道这些事……

如果我能弄清楚 Road 类如何“总是”知道 Car 类 rect.x 的位置,那就太棒了!

import pygame

W = 1000
H = 800
pygame.init()
pygame.display.set_mode((W, H))

class Road1(pygame.sprite.Sprite):
    def __init__(self, top, player):
        pygame.sprite.Sprite.__init__(self)
        bkgrnd = pygame.image.load("Images/Road.png").convert_alpha()
        self.image = pygame.transform.scale(bkgrnd, (300, 100))
        self.rect = self.image.get_rect(topleft = (120, top))
        self.top = top
        self.speedy = 0
        self.player = player
        self.out_of_bounds = False

    def update(self):
        self.top += self.speedy
        if self.top >= 800:
            self.top = self.top - 900
        self.rect.top = self.top
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w]:
            self.speedy = min(20, self.speedy + 0.25)
        if keys[pygame.K_s]:
            self.speedy = max(0, self.speedy - 0.25)

        if keys[pygame.K_a]:
            self.player -= 5
        if self.player <= 120:
            self.player = 120
            self.out_of_bounds = True
            if self.out_of_bounds and self.speedy > 5:
                self.speedy -= 0.35
            else:
                self.out_of_bounds = False

        if keys[pygame.K_d]:
            self.player += 5
        if self.player >= 420:
            self.player = 420
            self.out_of_bounds = True
            if self.out_of_bounds and self.speedy > 5:
                self.speedy -= 0.35
            else:
                self.out_of_bounds = False

以下是主页的一部分,足以使道路正常工作:

import pygame
import random
import sys
# from Ice_Patch import Ice1, Ice2
# from Oil_Slick import Oil1, Oil2
from Player1 import Player1, car1_image
# from Player2 import Player2, car2_image
from Roads import Road1, # Road2

W, H = 1000, 800
HW, HH = W / 2, H / 2
AREA = W * H
FPS = 30
GREEN = (0, 200, 0)
pygame.init()
CLOCK = pygame.time.Clock()
DS = pygame.display.set_mode((W, H))
pygame.display.set_caption("Racing Fury")


def events():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

player = Player1()

all_sprites = pygame.sprite.Group()
road = pygame.sprite.Group()
for i in range(9):
    rd = Road1((i - 1) * 100, player)
    all_sprites.add(rd)
    road.add(rd)

while True:
    CLOCK.tick(FPS)
    events()
    all_sprites.update()
    DS.fill(GREEN)
    all_sprites.draw(DS)
    pygame.display.flip()

玩家 1 等级:

import pygame
W = 1000
H = 800
pygame.init()
pygame.display.set_mode((W, H))
car1_image = pygame.image.load("Images/GalardB.png").convert_alpha()
car1_image = pygame.transform.scale(car1_image, (40, 70))
GREY = (211, 211, 211)
ANIM_DELAY = 50
POWERUP_TIME = 5000
SPIN_TIME = 1950

class Player1(pygame.sprite.Sprite):
    def __init__(self, car1_image, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = car1_image
        self.image.set_colorkey(GREY)
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.radius = 25
        self.speedx = 0
        self.rotations = [self.image]
        self.spinning_since = 0
        self.rotate()
        self.damage = 100
        self.shoot_delay = 250
        self.last_shot = pygame.time.get_ticks()
        self.lives = 3
        self.hidden = False
        self.hide_timer = pygame.time.get_ticks()
        self.score = 0
        self.crashx = 0
        self.crashy = 0
        self.power = 0
        self.power_time = pygame.time.get_ticks()
        self.not_spinning = True

    def update(self):
        if self.power >= 1 and pygame.time.get_ticks() - self.power_time > POWERUP_TIME:
            self.power -= 1
            self.power_time = pygame.time.get_ticks()
        if self.hidden and pygame.time.get_ticks() - self.hide_timer > 1500:
            self.hidden = False
            self.rect.center = (300, 700)
        self.speedx = 0
        keystate1 = pygame.key.get_pressed()
        if keystate1[pygame.K_SPACE]:
            self.shoot()
        if self.not_spinning:
            if keystate1[pygame.K_a]:
                self.speedx = -5
            if keystate1[pygame.K_d]:
                self.speedx = 5
        self.rect.x += self.speedx
        if self.rect.right > 420:
            self.rect.right = 420
        if self.rect.left < 120:
            self.rect.left = 120
        if self.spinning_since > 0:
            time_spinning = pygame.time.get_ticks() - self.spinning_since
            if time_spinning >= SPIN_TIME:
                self.spinning_since = 0
                index = 0
                self.not_spinning = True
            else:
                index = int(time_spinning / ANIM_DELAY)
                index %= len(self.rotations)
                self.not_spinning = False
            cx, cy = self.rect.center
            self.image = self.rotations[index]
            self.rect = self.image.get_rect()
            self.rect.centerx = cx
            self.rect.centery = cy

    def powerup(self):
        self.power += 1
        self.power_time = pygame.time.get_ticks()

    def shoot(self):
        now = pygame.time.get_ticks()
        if now - self.last_shot > self.shoot_delay:
            self.last_shot = now
            if self.power == 0:
                pass
            if self.power >= 1:
                bullet1 = Bullet(self.rect.centerx, self.rect.top)
                all_sprites.add(bullet1)
                bullets1.add(bullet1)

    def rotate(self):
        ROT_FRAMES = 36
        for i in range(ROT_FRAMES):
            angle = i * (720 / ROT_FRAMES)
            rotated_image = pygame.transform.rotozoom(self.image, angle, 1)
            self.rotations.append(rotated_image)

    def spin(self):
        if self.spinning_since == 0:
            self.spinning_since = pygame.time.get_ticks()
        else:
            pass

    def slide(self):
        keystate1 = pygame.key.get_pressed()
        if keystate1[pygame.K_a]:
            self.rect.x -= 2
            self.rect.x -= 1.5
            self.rect.x -= 1
            self.rect.x -= 0.5
            self.rect.x -= 0.25
        if keystate1[pygame.K_d]:
            self.rect.x += 2
            self.rect.x += 1.5
            self.rect.x += 1
            self.rect.x += 0.5
            self.rect.x += 0.25

    def hide(self):
        self.crashx = self.rect.x
        self.crashy = self.rect.y
        self.hidden = True
        self.hide_timer = pygame.time.get_ticks()
        self.rect.center = (W * 2, H * 2)

最佳答案

最简单的解决方案是让“道路”了解玩家。在类 Road1 中添加属性 player:

class Road1(pygame.sprite.Sprite):
    def __init__(self, top, player):
        pygame.sprite.Sprite.__init__(self)

        self.player = player

        # [...]

您可以直接向 self.player 询问其位置,而不是 self.where_player

当道路对象构建时,将玩家传递给它们。例如:

player = Player1(?????)

all_sprites = pygame.sprite.Group()
road = pygame.sprite.Group()
for i in range(9):
    rd = Road1((i - 1) * 100, player)
    all_sprites.add(rd)
    road.add(rd)
<小时/>

另一种选择是将参数player添加到方法update:

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

    def update(self, player):
        # [...]

当然你必须把道路和球员的更新分开。例如:

player.update()
road.update(player)

关于python - 我可以从一个类获取 rect.x 以在另一类中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59605978/

相关文章:

python - Python 中的单引号与双引号

java - 在方法/函数中使用类变量会创建对源的引用而不是重复它?

java - 如何重构超过 50000 行的 Java 文件?

python - 在 Python 中从父类调用方法

python - Pygame,旋转图像而无需在每次迭代中加载图像

python - 为什么在这种情况下事件总是 pygame.MOUSEBUTTONDOWN ?

python - Pygame只检测鼠标事件,不检测KEYDOWN事件

python - mock psycopg2 - 如何引发异常?

python - 列出同一类中的静态属性时 Python 中的 NameError

python - 如果超过变化的行索引,则将 numpy 矩阵元素设置为零