Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以从一个类中获取rect.x以在另一个类中使用吗?_Python_Class_Pygame - Fatal编程技术网

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

Python 我可以从一个类中获取rect.x以在另一个类中使用吗?,python,class,pygame,Python,Class,Pygame,所以基本上,我想让我的道路等级知道我的车(Player1)等级在哪里,这样道路就知道当车离开道路时是否减速(或者当车回到道路区域内时是否能够加速) 由于汽车只向左/向右移动,并且是道路加速了屏幕,我想出了一种方法,在相同的起始位置使用“self.where_player”模拟汽车,然后添加/减去x位置,然后按下键(a,d),但一段时间后,它可能会失去汽车的位置,因为汽车在冰上向左或向右滑行时,可能会增加或减少x值,或者如果在油上打滑,可能会暂时禁用钥匙(a,d),而道路不知道这些事情 如果我能弄

所以基本上,我想让我的道路等级知道我的车(Player1)等级在哪里,这样道路就知道当车离开道路时是否减速(或者当车回到道路区域内时是否能够加速)

由于汽车只向左/向右移动,并且是道路加速了屏幕,我想出了一种方法,在相同的起始位置使用“self.where_player”模拟汽车,然后添加/减去x位置,然后按下键(a,d),但一段时间后,它可能会失去汽车的位置,因为汽车在冰上向左或向右滑行时,可能会增加或减少x值,或者如果在油上打滑,可能会暂时禁用钥匙(a,d),而道路不知道这些事情

如果我能弄清楚道路类是如何“始终”知道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
玩家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)
导入pygame
W=1000
H=800
pygame.init()
pygame.display.set_模式((W,H))
car1_image=pygame.image.load(“Images/GalardB.png”).convert_alpha()
car1_image=pygame.transform.scale(car1_image,(40,70))
灰色=(211211211211)
动画延迟=50
通电时间=5000
自旋时间=1950
类玩家1(pygame.sprite.sprite):
def_uuuinit_uuuu(self,car1_图像,x,y):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=car1\u image
self.image.set_颜色键(灰色)
self.rect=self.image.get_rect()
self.rect.center=(x,y)
自半径=25
self.speedx=0
self.rotations=[self.image]
self.spining_自=0
self.rotate()
自损=100
自拍照延迟=250
self.last\u shot=pygame.time.get\u ticks()
self.lifes=3
self.hidden=False
self.hide\u timer=pygame.time.get\u ticks()
self.score=0
self.crashx=0
self.crashy=0
自功率=0
self.power\u time=pygame.time.get\u ticks()
self.not_spining=True
def更新(自我):
如果self.power>=1且pygame.time.get_ticks()-self.power\u time>POWERUP\u time:
自功率-=1
self.power\u time=pygame.time.get\u ticks()
如果self.hidden和pygame.time.get_ticks()-self.hide_timer>1500:
self.hidden=False
self.rect.center=(300700)
self.speedx=0
keystate1=pygame.key.get_pressed()
如果keystate1[pygame.K_空间]:
self.shoot()
如果self.not\u旋转:
如果keystate1[pygame.K_a]:
self.speedx=-5
如果keystate1[pygame.K_d]:
self.speedx=5
self.rect.x+=self.speedx
如果self.rect.right>420:
self.rect.right=420
如果self.rect.left<120:
self.rect.left=120
如果self.u自>0:
time\u spining=pygame.time.get\u ticks()-self.spining\u自
如果时间旋转>=旋转时间:
self.spining_自=0
索引=0
self.not_spining=True
其他:
索引=int(旋转/动画延迟时间)
索引%=透镜(自旋转)
self.not_spining=False
cx,cy=self.rect.center
self.image=self.rotations[索引]
self.rect=self.image.get_rect()
self.rect.centerx=cx
self.rect.centery=cy
def通电(自):
自功率+=1
self.power\u time=pygame.time.get\u ticks()
def喷射(自):
now=pygame.time.get_ticks()
如果现在-self.last_shot>self.shot_delay:
self.last_shot=现在
如果self.power==0:
通过
如果self.power>=1:
bullet1=Bullet(self.rect.centerx、self.rect.top)
所有精灵。添加(bullet1)
公告1.添加(公告1)
def旋转(自):
ROT_帧=36
对于范围内的i(旋转帧):
角度=i*(720帧/旋转帧)
旋转的_image=pygame.transform.rotozoom(self.image,angle,1)
self.rotations.append(旋转的图片)
def自旋(自):
如果self.spining_-since==0:
self.spining\u since=pygame.time.get\u ticks()
其他:
通过
def幻灯片(自我):
keystate1=pygame.key.get_pressed()
如果keystate1[pygame.K_a]:
自校正x-=2
自校正x-=1.5
自校正x-=1
自校正x-=0.5
自校正x-=0.25
如果keystate1[pygame.K_d]:
self.rect.x+=2
自校正x+=1.5
self.rect.x+=1
自校正x+=0.5
自校正x+=0.25
def隐藏(自我):
self.crashx=self.rect.x
self.crashy=self.rect.y
self.hidden=True
self.hide\u timer=pygame.time.get\u ticks()
self.rect.center=(W*2,H*2)

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

classroad1(pygame.sprite.sprite):
定义初始(自我、顶部、玩家):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.player=玩家
# [...]
您可以直接向
self.player
询问其位置,而不是
self.where\u player

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

player=Player1(???)
all_sprites=pygame.sprite.Group()
road=pygame.sprite.Group()
对于范围(9)内的i:
rd=Road1((i-1)*100,玩家)
所有精灵。添加(rd)
道路.加设(道路)

另一个选项是将参数
player
添加到方法
update

classroad1(pygame.sprite.sprite):
# [...]
def更新(自我、玩家):
# [...]
当然,您必须将道路和球员的更新分开。例如:

player.update()
道路。更新(玩家)
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)