Найти - Пользователи
Полная версия: удаление спрайта Pygame
Начало » Python для новичков » удаление спрайта Pygame
1 2
Rad.89
Всем доброго времени суток! В Pygame через def сделана отрисовка спрайтов при событии:

 def player_upd():
	if v_c_rand1 == 100:
		player=Player() #переменная из класса для спрайта
		all_sprites.add(player)
		player_group.add(player)
		global all_spr
		all_spr += 1 #счетчик

Не могу допетрить, как сделать удаление спрайта при щелчке мышкой. ЕСЛИ мышь нажата, то: player.kill() не решает. Пишет: нет такого имени “player”
ZerG
Ну наверное покажите больше кода - не гадат же нам как и откудова вы получаете ошибку
Rad.89
сократил, как оно идет по программе по порядку и все связанное с данным img:
 #грузим картинку
player = pygame.image.load(os.path.join(img_folder, 'player.png'))
# даем класс:
class Plyer (pygame.sprite.Sprite):	
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = player
		self.image = pygame.transform.scale(player,(25,25))
		self.rect = self.image.get_rect()
		self.rect.center=((pl_pos), (pl_x+15))
		
player = pygame.sprite.Group()
# далее в программе вызываем функцию
def player_upd():
	player = (pl_pos), (pl_x+15) #получаем координаты, где появится новый клон спрайта
	if v_c_rand1 == 100:		
		player=Player()
		all_sprites.add(player)
		player_group.add(player)
		global all_pl
		all_pl += 1
# 	клоны спрайтов создаются исправно. Теперь нужна функция, убирающая
# спрайт, если на нем нажать.
# попытка сделать это через отловку событий event:
if event.type == pygame.MOUSEBUTTONDOWN:
	m_pos_x,m_pos_y = pygame.mouse.get_pos()
	m_position=(m_pos_x,m_pos_y)
	if event.button == 1:
		if player.rect.collidepoint(m_position):
			print ('----')#индикатор, что команда сработала
# как только происходит нажатие вылетает ошибка:
	# ~ Traceback (most recent call last):
	# ~ File "тут путь до файла", line 231, in <module>
	# ~ if player.rect.collidepoint(m_position):
	# ~ NameError: name 'player' is not defined
FishHook
   
self.image = player
self.image = pygame.transform.scale(player,(25,25))

это оригинальный приём!

сократил
давайте без сокращений лучше, а то тут трудно понять, это автор по пояс деревянный или просто сократил неудачно
Rad.89
Приношу извинения, если код нафарширован визуальными ошибками. Пока только изучаю принцип работы. Если файлы нужны: могу скинуть.

 import pygame
import time
import random
import os
import sys
# ~ инициализация фона
pygame.font.init()
pygame.font.SysFont('arial', 15)
# ~ инициализация звука
pygame.mixer.init()
# ~ инициализация дисплея
pygame.display.init()
# ~ окно:
screen=pygame.display.set_mode((600,600))
# ~ фуллскрин:
# ~ screen=pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
# ~ получение размеров дисплея
sW, sH = screen.get_size()
# ~ функция сохранения пути файлов для формовки ехе
def resource_path(relative_path):
    try:    
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)
game_folder = os.path.dirname(__file__)
########################################################################
# ~ загрузка звука
kluv_sound = pygame.mixer.Sound("sound/1kick.mp3")
s_back = pygame.mixer.Sound("sound/back_sound.mp3")
chikin_voice = pygame.mixer.Sound("sound/chikin_voice.mp3")
# ~ загрузка файлов изображений
img_folder = os.path.join(game_folder, 'sprites')
player_img1 = pygame.image.load(resource_path('sprites/chikin.png'))
player_img2 = pygame.image.load(resource_path('sprites/chikin_3.png'))
player_img3 = pygame.image.load(resource_path('sprites/chikin_2.png'))
player_img_dead = pygame.image.load(resource_path('sprites/chikin_dead.png'))
btn_food = pygame.image.load(resource_path('sprites/btn_food.png'))
btn_energy = pygame.image.load(resource_path('sprites/btn_energy.png'))
bg = pygame.image.load(resource_path('sprites/background.png'))
player_poo_img = pygame.image.load(resource_path('sprites/poo.png'))
# ~ вариант загрузки файла без дампирования для компиляции
health_img = pygame.image.load(os.path.join(img_folder, 'hart1.png'))
energy_img = pygame.image.load(os.path.join(img_folder, 'energy1.png'))
food_img = pygame.image.load(os.path.join(img_folder, 'food.png'))
	# ~ Переменные:
FPS=29
BLACK=(0,0,0)
WHITE=(255,255,255)
GRAY=(192,192,192)
YELLOW=(255,255,0)
Health_point=100
Energy_point=100
Food_point=100
hourse=0
years=0
seconds=0
pl_pos=dm=sW/2
pl_x=(sH/4)*3
speed=2
dm_time=dm_time_rand=0
t=0
n=0
scale=(80,80)
s=1
v_c_rand1=0
v_c_rand2=200
all_player_poo = 0
f1 = pygame.font.Font((os.path.join(img_folder, 'vcrosdmonorusbyd.ttf')), 15)
class Player (pygame.sprite.Sprite):	
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = player_img1
		self.image = pygame.transform.scale(self.image,(scale))	
		self.rect = self.image.get_rect()		
		self.rect.center=((int(pl_pos)), (pl_x))
class Health (pygame.sprite.Sprite):
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = health_img
		self.image = pygame.transform.scale(health_img,(20,20))
		self.rect = self.image.get_rect()
		self.rect.center=(10, 85)
class Energy (pygame.sprite.Sprite):
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = energy_img
		self.image = pygame.transform.scale(energy_img,(20,20))
		self.rect = self.image.get_rect()
		self.rect.center=(10, 55)
class Food (pygame.sprite.Sprite):
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = food_img
		self.image = pygame.transform.scale(food_img,(20,20))
		self.rect = self.image.get_rect()
		self.rect.center=(10, 25)
class Btn_Food (pygame.sprite.Sprite):
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = btn_food
		self.image = pygame.transform.scale(btn_food,(50,50))
		self.rect = self.image.get_rect()
		self.rect.center=(sW-50, sH/4)
class Btn_Energy (pygame.sprite.Sprite):
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = btn_energy
		self.image = pygame.transform.scale(btn_energy,(50,50))
		self.rect = self.image.get_rect()
		self.rect.center=(sW-50, sH/4+70)
class Player_poo (pygame.sprite.Sprite):	
	def __init__(self):
		pygame.sprite.Sprite.__init__(self)
		self.image = player_poo_img
		self.image = pygame.transform.scale(player_poo_img,(25,25))
		self.rect = self.image.get_rect()
		self.rect.center=((pl_pos), (pl_x+15))
# ~ функция смены изображения во время передвижения 
def Anim_step():
	if t > 2:
		player.image = player_img1
		if n == 1:
			player.image = pygame.transform.flip(player_img1,False,False)
		else:
			player.image = pygame.transform.flip(player_img1,True,False)
		player.image = pygame.transform.scale(player.image,(scale))
	else:
		player.image = player_img2
		if n == 1:
			player.image = pygame.transform.flip(player_img2,False,False)
		else:
			player.image = pygame.transform.flip(player_img2,True,False)
		player.image = pygame.transform.scale(player.image,(scale))
# ~ функция клевания
def Klyvanie():
	
	if t > 2:
		player.image = player_img1
		if n == 1:
			player.image = pygame.transform.flip(player_img1,False,False)
		else:
			player.image = pygame.transform.flip(player_img1,True,False)
		player.image = pygame.transform.scale(player.image,(scale))
	else:
		player.image = player_img3
		if n == 1:
			player.image = pygame.transform.flip(player_img3,False,False)
		else:
			player.image = pygame.transform.flip(player_img3,True,False)
		player.image = pygame.transform.scale(player.image,(scale))
# ~ функция смерти
def Dead ():
	player.image = player_img_dead
	player.image = pygame.transform.scale(player.image,(scale))
# ~ функция появления какашек и их учет
player_poo_group = pygame.sprite.Group()
def player_poo_upd():
	player_poo_pos = (pl_pos), (pl_x+15)
	player_poo=Player_poo()
	if v_c_rand1 == 100:
		all_sprites.add(player_poo)
		player_poo_group.add(player_poo)
		global all_player_poo
		all_player_poo += 1
	
########################################################################
#инициализация и запуск программы
pygame.init()
s_back.play(-1)
s_back.set_volume(0.008)
chikin_voice.set_volume(0.05)
clock=pygame.time.Clock()
all_sprites = pygame.sprite.Group()
player = Player()
health = Health ()
energy = Energy ()
food = Food ()
btn_food = Btn_Food()
btn_energy = Btn_Energy()
all_sprites.add(player, health, energy, food, btn_food, btn_energy)
running = True
while running:
	clock.tick(FPS)
	# ~ выход из игры
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			running = False
# ~ #управление с клавиатуры
	if event.type == pygame.KEYDOWN:
		# ~ if event.key == pygame.K_UP:
			# ~ if Health_point >0:
				# ~ Food_point=100
		# ~ if event.key == pygame.K_DOWN:
			# ~ if Health_point >0:
				# ~ Energy_point=100
		
		if event.key == pygame.K_ESCAPE:
			pygame.quit()
			sys.exit()
# ~ управление с мыши:		
	if event.type == pygame.MOUSEBUTTONDOWN:
		m_pos_x,m_pos_y = pygame.mouse.get_pos()
		m_position=(m_pos_x,m_pos_y)
		print (m_position)
		if event.button == 1:
			if btn_energy.rect.collidepoint(m_position):
				if Health_point >0:
					Energy_point=100
			if btn_food.rect.collidepoint(m_position):
				if Health_point >0:
					Food_point=100
			if player_poo.rect.collidepoint(m_position):
				print ('-----')
				
			
# ~ #движение птички и разворот в направлении		
	if pl_pos > dm+1:
		pl_pos -=speed
		pl_pos=int(pl_pos)
		Anim_step()		
		player.rect.center=(pl_pos,pl_x)
		t+=1
		if t >= 7:
			t = 0
		n=1
		# ~ модуль голоса курочки
		v_c_rand1=random.randint(0,v_c_rand2)
		if v_c_rand1 == 100:
			chikin_voice.play()
			v_c_rand2=200
	if pl_pos < dm-1:
		pl_pos +=speed
		pl_pos=int(pl_pos)
		Anim_step()		
		player.rect.center=(pl_pos,pl_x)
		t+=1
		if t >= 7:
			t = 0
		n=0
		# ~ модуль голоса курочки
		v_c_rand1=random.randint(0,v_c_rand2)
		if v_c_rand1 == 200:
			chikin_voice.play()
			v_c_rand2=100
	# Дефикация курочки
	player_poo_upd()
	
	# ~ #задержка на позиции	
	if pl_pos == dm+1 or pl_pos == dm-1 or pl_pos == dm:
		dm_time+=1
		t+=1
		if t >= 10:
			t = 0
		Klyvanie()
		#звук клевка
		if t == 9:
			kluv_sound.play()
	
		if dm_time >= dm_time_rand:
			dm = int(random.randint(20, sW))
			dm_time_rand = int(random.randint(10, 70))
			dm_time=1
# ~ #зависимость здоровья от еды и энергии
	# ~ снижение еды и энергии
	if Food_point>0:
		Food_point-=0.01
	if Energy_point<=0:
		Energy_point=0
		Food_point-=0.03
	if Energy_point>0:
		Energy_point -=0.03
	if Food_point <=0:
		Food_point=0
		Energy_point -=0.05
		# ~ Снижение здоровья
	if Food_point <= 1 and Energy_point <= 1:
		Health_point -=1
		speed=1
	elif Food_point <= 1 or Energy_point <= 1 or all_player_poo > 20:
		Health_point -=0.02
		speed=1
	# ~ #восстанавливаем здоровье
	if Food_point >90 and Energy_point >90 and Health_point <= 99:
		Health_point +=1
		speed=2
	# ~ #Птичка сдохла		
	if Health_point < 1:
		Health_point=0
		dm=pl_pos		
		Dead()
		screen.blit(text5, (300, 20))		
# ~ Счетчик прожитого времени
	if Health_point > 0:
		hourse=pygame.time.get_ticks()/10000		
	else: hourse = hourse
	if hourse > 365:
		years +=1
	
	all_sprites.update()
# отрисовка фона
	bg = pygame.transform.scale(bg,(sW,sH))
	screen.blit(bg,(0,0))
# отрисовка текста на экране
	text1 = f1.render(("Жрачка: " + str(round(Food_point))), True,(180, 0, 0))
	text2 = f1.render(("Энергия: " + str(round(Energy_point))), True,(YELLOW))
	text3 = f1.render(("Здоровье: " + str(round(Health_point))), True,(180, 0, 0))
	text4 = f1.render(("прожито :" + str(round(years)) + " лет и " + str(round(hourse)) + " дней "), True,(180, 0, 0))
	text5 = f1.render("СДОХ =(" , True,(180, 0, 0))
	
	if Health_point < 1:
		screen.blit(text5, (sW/2, sH/2))
		screen.blit(text4, (300, 20))
	else:
		screen.blit(text1, (25, 20))
		screen.blit(text2, (25, 50))
		screen.blit(text3, (25, 80))
		screen.blit(text4, (sW/2, sH/30))
		
	all_sprites.draw(screen)
	pygame.display.flip()
	
pygame.quit()
Rad.89
и вот тут, когда нужно вызвать print ('—–') по щелчку мыши, вылезает ошибка:
 # ~ управление с мыши:		
	if event.type == pygame.MOUSEBUTTONDOWN:
		m_pos_x,m_pos_y = pygame.mouse.get_pos()
		m_position=(m_pos_x,m_pos_y)
		print (m_position)
		if event.button == 1:
			if btn_energy.rect.collidepoint(m_position):
				if Health_point >0:
					Energy_point=100
			if btn_food.rect.collidepoint(m_position):
				if Health_point >0:
					Food_point=100
			if player_poo.rect.collidepoint(m_position):      ###Здесь пишет, что нет 'player_poo'
				print ('-----')
FishHook
Rad.89
совершенно справедливо пишет
я тоже не нашел в какой строке кода определена переменная player_poo, её просто нет в вашем коде
Rad.89
файлы для “Курочки”:
https://disk.yandex.ru/d/edEgQKw7x1HaCg
Rad.89
FishHook
Rad.89совершенно справедливо пишетя тоже не нашел в какой строке кода определена переменная player_poo, её просто нет в вашем коде
ок. Добавил. Но тогда у нас print('—-') работает по мышке только в точке первоначального появления курочки. На рандомно-возникшие продукты жизнедеятельности реакции нет. я уже 2й день голову ломаю(( Подскажите куда искать((
FishHook
Rad.89
вы сами программу писали, скажите честно?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB