Почему не изменяется значение переменной в python?

Не могу понять, почему переменная x_mob не прибавляется, она достигает 25 и не изменяется, хотя self.rect.x должен прибавляться по +3, код сделан на библиотеке pygame
Вот классы:
class Enemy(pygame.sprite.Sprite):
	def __init__(self, hp_mob, speed_mob, x, y):
		pygame.sprite.Sprite.__init__(self)
		self.hp_mob = hp_mob
		self.speed_mob = speed_mob
		self.image = pygame.Surface((50, 50))
		self.x = x
		self.y = y
		self.image.fill(Green)
		self.rect = self.image.get_rect()
		self.rect.center = (x, y)
	def update(self): #передвижение 
		self.rect.y -=5
		if self.rect.y <=700:
			self.rect.y  =700
			self.rect.x +=3 #увеличение по x координате(не показывается в переменной x_mob)
	def mobReturn(self): #функция, которая должна вернуть значение self.rect.x в переменную x_mob
		self.x_mob = self.rect.x
		return self.x_mob

class Bullet(pygame.sprite.Sprite): #класс для проверки
	def update(self):
		if x_mob>=100:
			sys.exit() #Код, который должен выключать игру, если переменная x_mob больше ста, а x_mob не изменяется...
Mob = Enemy(10,20, 50,1300)
But = Bullet()

Вот упрощенный вариант всего кода:
spoiler
#прототип Rush Royale
import pygame, sys, time
last_mob = time.time()-1000
WIDTH = 700
HEIGHT = 1400
FPS = 30
x, y = 50, 1300
Black = (0,0,0)
Green = (0, 255, 0)
Aqua = (90,90,205)
LightGreen = (50,240,70)
x_mob = 0
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
surf = pygame.Surface((800,1400))
surfGame = pygame.Surface((800,1400))
f = pygame.font.SysFont('calibri',60)
f1 = pygame.font.SysFont ('calibri', 60)

group = pygame.sprite.Group()
group.update()
class Enemy(pygame.sprite.Sprite): #сам противник, который движется	
	def __init__(self, hp_mob, speed_mob, x, y):
		pygame.sprite.Sprite.__init__(self)
		self.hp_mob = hp_mob
		self.speed_mob = speed_mob
		self.image = pygame.Surface((50, 50))
		self.x = x
		self.y = y
		self.image.fill(Green)
		self.rect = self.image.get_rect()
		self.rect.center = (x, y)		
	def update(self): #передвижение
		self.rect.y -=5
		if self.rect.y <=700:
			self.rect.y  =700
			self.rect.x +=3 #перемещение противника по x(не показывается в x_mob)
	def mobReturn(self): #функция, которая должна вернуть значение self.rect.x в переменную x_mob
		self.x_mob = self.rect.x
		return self.x_mob
class Bullet(pygame.sprite.Sprite):
	def update(self):
		if x_mob>=100:
			sys.exit()		#проверка(если переменная x_mob больше 100, то игра закрывается)
Mob = Enemy(10,20, 50,950)
while 1:
	textBuy = f.render('30',1, Black)
	testBut = f.render(f'x_Mob: {x_mob}', 1, Black)
	x_mob = Mob.mobReturn()
	fin1 = pygame.mouse.get_pos()
	screen.fill(Aqua)
	screen.blit(testBut, (350, 600))
	clock.tick(FPS)
	group.add(Mob)
	if time.time()-last_mob >0.9:
		last_mob = time.time()
		Mob = Enemy(10,20,50,950)
	pygame.draw.rect(screen, LightGreen,(80,800,630,400))
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			pygame.exit()
			sys.exit()
	group.draw(screen)
	group.update()
	pygame.display.flip()
pygame.quit()
  • Вопрос задан
  • 240 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
class Enemy:
    ...
    def mobReturn(self): 
        self.x_mob = self.rect.x

class Bullet(pygame.sprite.Sprite):
    def update(self):
        if x_mob>=100:

В первом случае ты изменяешь атрибут экземпляра класса Enemy.
Во втором случае ты читаешь локальную переменную метода update() класса Bullet.
Это совершенно разные области видимости, они друг о друге ничего не знают.

Если ты пытаешься решить задачу обнаружения коллизий (т.е. пересечений двух объектов), тебе как-то придётся их "познакомить".
Или сделай метод у противника, в который передаёшь пулю, и спрашиваешь "вот это в тебя попало?".
Или сделай метод у пули, в который передаёшь противника, и спрашиваешь "ты вот в это попала?"
Или вообще сделай отдельную функцию, куда передаёшь врага и пулю, если не хочешь нагружать их этой обязанностью.

Во всех случаях проверку коллизии нужно будет делать каждый кадр. Так что в главном цикле игры надо будет перебирать активных врагов и активные пули, и проверять их. В простейшем случае - всех со всеми.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы