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