for event in pygame.event.get():
if event.type == MOUSEBUTTONDOWN:
mouse = pygame.mouse.get_pos()
if button.pressed(mouse): #Button's pressed method is called
print ('button hit')
şeklinde yapmış ama ben bunu istemiyorum başka türlü nasıl yaparım
yani başka türlü mouse’a basıldığında bilgisayarın tepki vermesini nasıl sağlarım
Bu şekilde yapmak istememenizin sebebi tam olarak ne? Pygame’in kendi arayüz sınıfları bulunmadığı için butonu kendimiz yazıyoruz. Butonların asıl amacı zaten farenin belli bir yere basılıp basılmadığını anlamak. Verdiğiniz örnekte de bu yapılıyor. İstiyorsanız bu kodu da inceleyebilirsiniz:
import pygame as pg
display = pg.display.set_mode((500,500))
class Button():
butonlar = []
def __init__(self, *, command, image_path, pos):
self.command = command
self.sprite = pg.image.load(image_path)
self.rect = self.sprite.get_rect(topleft= pos)
self.butonlar.append(self)
def delete(self):
self.butonlar.remove(self)
buton1 = Button(command = lambda event: print("1. buton basıldı"), image_path="1.png", pos=(100,100))
buton2 = Button(command = lambda event: print("2. buton basıldı"), image_path="2.png", pos=(200,200))
while True:
display.fill((255,255,255))
for event in pg.event.get():
if event.type == pg.MOUSEBUTTONDOWN:
mouse = pg.mouse.get_pos()
for buton in Button.butonlar:
if buton.rect.collidepoint(mouse):
buton.command(mouse)
for buton in Button.butonlar:
display.blit(buton.sprite,buton.rect)
pg.display.update()
Evet, global namespace’i kirletmemek ve bir sınıf değişkeni yapmak daha uygun olur.
Benim kodum bir örnekti zaten. İnceleyerek istediği gibi kullanabilir.
Yine burada da aynı şey geçerli. Eğer butona basılıp basılmadığı sadece rect’e göre belirlenmeyecekse veya butondan butona değişecek ise gereken değişimler yapılabilir. Mouse koordinatları zaten buton.command(mouse) kısmında veriliyor. Bunu yazarken aklıma tkinter’deki buton sistemi gelmişti.
Doğru. self değişkeni unmutable bir nesneyi sakladığı için bu satır onu silecekmiş gibi düşünmüşüm. Oysaki sadece değişken ismini serbest bırakıyor. refcount 0 olmazsa bir anlamı yok. Ama zaten fonksiyon bittiğinde silinecek.
Öğrenmek için çok kaynak olmasa da pyglet var. Çoğu işi de sizin için hallediyor.
Eğer python için oyun kütüphanelerinin listesini görmek istiyorsanız buraya bakabilirsiniz.
Üç elemana sahip bir tuple döndürüyor. Elemanlar ya 1 ya da 0. 1 tuşun basılı olduğu, 0 ise basılı olmadığı anlamına geliyor. İlk eleman sol click, ikinci eleman scrool, üçüncü eleman ise sağ click için. Fonksiyonların ne işe yaradığını bize sormak yerine pygame belgelerine de başvurabilirsiniz: Pygame Front Page — pygame v2.6.0 documentation
dediğinize göre event döngüsü olmadan olmaz
ama pygame.mouse.get_pressed() metodu ile basma olayının olup olmadığını öğrenebiliyoruz neden öyle dediniz
hem döngü dediğinizi anlamadım benim yapacağım
şöyle olmazmı:
def update(self, *args):
self.pos = pg.mouse.get_pos()
self.click = pg.mouse.get_pressed()
if self.rect.collidepoint(self.pos):
#eğer cursor buton üstünde ise butonun üstünde değişiklik
if self.click[0] :
#tıklama olayı
bu olmazmı sizce eğer yanlışım varsa lütfen düzeltin
Tamam ama bizim demek istediğimiz bu update metodunu her buton için kendinizin çağırmanız gerektiği.
Sanırım burada bir event hook kullanmak istiyorum dediniz. Ama bu pygame’de bulunmuyor diye biliyorum. Az önce pygame böyle bir hooka sahip mi diye araştırırken buraya denk geldim. Pygame üzerine kurulu sizin istediğiniz gibi bazı kolaylıklar sağlayan bir kütüphane.