Pythonda Pygame İle Oyun Yaparken Bir Yer Loopa giriyor

Merhaba altta oyunun sorun veren yerinin kodları bulunuyor sorun şu ki ben bir pencere tasarladım ve bu pencere bir tuşa basınca açılıyor açılan pencerede de iksir kullanmamızı sağlayan bir buton var bu butona basınca bir tane iksir kullanması gerekirken iksir bitene kadar kullanıyor. Bunu düzeltemedim.

import pygame
import random

pygame.init()

# Ekran Bilgileri
width = 500
height = 500
anaPencere = pygame.display.set_mode((width,height))
pygame.display.set_caption("Zindanlar ve Zindanlar V3")

# Global Değişkenler
can = 100
anaHasar = 5
hasar = 5
zırh = 20
iksirCan = 3
iksirGuc = 3
büyüAlev = ["Öğrenilmedi",50]
büyüBuz = ["Öğrenilmedi",30]
büyüZehir = ["Öğrenilmedi",10]
zehirEtki = "Yok"
sinif1 = "Wemy"
sinif2 = "Pacus"
sinif3 = "Canus"
sinif4 = "Forcus"
tur = 1 
secenekler ="""
---------------
Ne yapacaksın ?
1. Saldır
2. İksirler ve Büyüler
3. Kaç
---------------
"""
canavar = "Hiçbir şey"
dusmanHasar = 0
dusmanCan = 0
dusmanDurum = ["diri"," "]
iksirPencere = " "
zar = 1
font = pygame.font.SysFont("arialblack", 13)

# Resimler
cikis_dugme = pygame.image.load("Zindanlar ve Zindanlar//assets//cikis_dugme.png")
kullan_dugme = pygame.image.load("Zindanlar ve Zindanlar//assets//kullan_dugme.png")

# Gömülü Sınıflar
class Button():
	def __init__(self, x, y, image, scale):
		width = image.get_width()
		height = image.get_height()
		self.image = pygame.transform.scale(image, (int(width * scale), int(height * scale)))
		self.rect = self.image.get_rect()
		self.rect.topleft = (x, y)
		self.clicked = False

	def draw(self, surface):
		action = False
		#get mouse position
		pos = pygame.mouse.get_pos()

		#check mouseover and clicked conditions
		if self.rect.collidepoint(pos):
			if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
				self.clicked = True
				action = True

		if pygame.mouse.get_pressed()[0] == 0:
			self.clicked = False

		#draw button on screen
		surface.blit(self.image, (self.rect.x, self.rect.y))

		return action

# Düğmeler
saldirButon = Button(450,450,cikis_dugme,1)

# Gömülü Fonksiyonlar
def Yazi(text,font,renk,x,y):
    yazi = font.render(text,True,renk)
    anaPencere.blit(yazi,(x,y))

# Eylemler
def iksir():
    global iksirPencere
    global cikis_dugme
    global kullan_dugme
    
    # İKSİRLER
    
    iksirBilgi = Yazi("İKSİRLER",font,(255,255,255),95,25)
    
    # Can İksiri
    canİksiriBilgi = Yazi("Can İksiri: {} tane var. - 25 can verir.".format(iksirCan),font,(255,255,255),50,50)
    canİksiriButon = Button(8,47,kullan_dugme,0.3)
    if canİksiriButon.draw(anaPencere):
        canİksir()
    
    # Çıkış
    cikisButon = Button(450,215,cikis_dugme,1)
    if cikisButon.draw(anaPencere):
        iksirPencere = False

# İksir ve Büyü Eylemleri
def canİksir():
    global iksirCan
    global can
    
    if iksirCan > 0:
        iksirCan = iksirCan - 1
        can = can + 25
        if can > 100:
            can = 100
        geriBildirim = Yazi("Can iksirini kullandınız", font, (255,255,255), 175, 475)
    else:
        geriBildirim = Yazi("Kullanılabilecek iksiriniz yok.", font, (255,255,255), 175, 475)

iksirPencere = False
döngüDurum = True
while döngüDurum:
    
    anaPencere.fill((0,0,0))
    
    if iksirPencere == True:
        anaPencere.fill((0,0,0))
        anaPencere = pygame.display.set_mode((700,500))
        iksir()
    if iksirPencere == False: 
        anaPencere.fill((0,0,0))
        anaPencere = pygame.display.set_mode((width,height))
        secenekYazi = Yazi(secenekler, font, (255,255,255), 175, 300)
        
        if saldirButon.draw(anaPencere):
            iksirPencere = True
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            döngüDurum = False
    
    pygame.display.update()
pygame.quit()

cikis_dugme
kullan_dugme

Her frame’de yeni dugme yaratildigi icin ...and not self.clicked mekanizmasi calismiyor.


Resimleri bile icerdigi icin tamamen calisan ve bu yuzden test edip cevaplamasi cok kolay olan bu soru icin tesekkurler! “Soru nasil sorulmali” dersi gibi!

teşekkürler ama anlamadım yani bu sorunu nasıl çözebilirim

Kod alinti mi? (bkz: Soru Sorarken Sıkça Düşülen Hatalar #15) Button.clicked mekanizmasini yazan birinin neden calismadigini da anlayabilmesi lazim cunku.

canİksiriButon'u, hatta butun GUI elemanlarini sadece bir kere, döngü oncesinde yaratip döngü icerisinde sadece cizim cagrilarini (draw, blit) yapmak lazim.

yok hayır kod alıntı değil kendim yazdım ama daha bilgilerim başlangıç seviyesinde olduğu için bazı yerlerde takılabiliyorum cevabın için teşekkür edeirm.

hee özür dilerim kusura bakma buton class’ı alıntı diğer yerlerini kendim yazdım. Gerçekten teşekkür ederim hata düzeldi artık alıntı olan yerleri belirtmeye de dikkat edeceğim yardımı için sağol.

Rica ederim. Alinti mi bilemeyince hangi seviyede cevap verecegimi de bilemedim, her halukarda ise yarayacak bir sey soyledim.

Button.clicked mekanizmasini yazan birinin bu aciklama uzerine sorunu cozebilmesini bekledim, netekim oyle olmus sanirim.

GUI programlari genelde widget (GUI elemani) class’lari yapip bunlarin pahali veya ilk seferlik islemlerinin sonuclarini objelerde tutuyor, cizim esnasinda da bu objelerin tek bir “draw”/“blit” methodunu cagiriyor. Bazen input bazli state degisimleri (klavye input’u, mouse click, vs.) icin bir “process_event”/“update” fonksiyonu da oluyor, bazen de bu “draw” esnasinda hallediliyor, yukaridaki Button gibi.

Bunları anlattığın için teşekkür ederim. Oyunu yazmaya devam edebiliyorum artık buton alıntı olduğu için çözememiştim ve aklıma takılmıştı yardımın için sağol.

Bu arada eğer vaktin varsa aşağıdaki linkten açtığım aklıma takılan farklı bir konuya da bakabilir misin.

Konu: https://forum.yazbel.com/t/pygamede-haraketli-ekran-yapilabilir-mi/18500