Pygame oyun içi dükkan ekranı

ben oyunuma bir dükkan eklemek istiyorum ama nasıl yapıcam sadece karakteri ve konuşmasını yaptım kodum

class Store(pg.sprite.Sprite):
    def __init__(self, x, y, screen, textList = None):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.image.load("standing.png")
        self.rect = self.image.get_rect(topleft = (x, y))
        self.textList = textList
        self.screen = screen
        self.Collide = False
        self.Bubble = False
        self.press = True
    def draw_QuestionMark(self, rect):
        if self.Collide == True and self.Bubble == False:
            self.screen.blit(pg.image.load("StoreQuestion.png"), (rect.x + 20, rect.top - 25))
        

    def CheckSpeech(self):
        key = pg.key.get_pressed()



        if key[pg.K_j] and  self.press:

            if not self.Bubble:
                self.sb = SpeechBubble(self.rect.x + 45, self.rect.top - 40, self.textList)
                all_sprites.add(self.sb) 
                self.Bubble = True
            else:
                # if itertools loop end,Bubble = False
                self.Bubble = self.sb.nextText()

            self.press = False
        elif not key[pg.K_j]:
            self.press = True

''Question Mark" karakter dükkanın yanına yaklaştığında soru işareti yapıcak ve eğer karakter “J” tuşuna basarsa etkileşime geçecek yani SpeechBubble (konuşma balonu) aktif olucak ve sonunda da market menu’sunun gelmesini istiyorum menu dizaynını bile yaptım

nasıl yapıcağım bana yardım edermisiniz
ekranı kaplamasını istemiyorum.

ekrana basitçe blit metodu ile bastığımızda biraz performans sorunu yaşıyorum
onuda nasıl yapacağız.

Kodunuzun tamamını veya market menüsünü çalıştırmamıza yetecek kadar bir kısmını atarsanız işimiz kolaylaşır. Şu anda kodunuzu deneyemiyoruz, çünkü tek başına bir anlam ifade etmiyor.

def draw_QuestionMark(self, rect):
        if self.Collide == True and self.Bubble == False:
            self.screen.blit(pg.image.load("StoreQuestion.png"), (rect.x + 20, rect.top - 25))

Burada her seferinde resmi pg.image.load fonksiyonu ile tekrar diskten okuyup oluşturuyorsunuz. Performans kaybının sebebi bu olabilir. Okuma işlemini bütün program içerisine bir defa yapmanız da yeterli olacaktır. Eğer resimlerin ekrana daha hızlı çizilmesini istiyorsanız convert metodunu kullanabilirsiniz. 10000 sprite ile denediğimde FPS 13’den 20’ye çıkmıştı. Deneme için bu kodu kullanabilirsiniz:

import pygame as pg
from random import randint
from timeit import default_timer as timer

pg.init()

ekran = pg.display.set_mode((600,400))

resim = pg.image.load("resim.png")  #.convert()  ## bir de convert ile deneyin

clock = pg.time.Clock()

frame = 0
time = timer()
while True:
    ekran.fill((255,255,255))
    
    pg.event.get()

    for i in range(1000):
        ekran.blit(resim, (randint(0,600),randint(0,400)))


    pg.display.flip()

    frame += 1
    now = timer()
    if now > time+1:
        print(frame)
        frame = 0
        time = now

market menusunu yapamadım o yüzden bu konuyu açtım

aslında menu:

key = pg.key.get_pressed()
if key[pg.K_n] and self.collide:
   #menu açılacak 
self.Bubble = self.sb.nextText()

Çıkıcak yazılar bittiğinde bu fonksiyon ne döndürüyor veya bir hata yükseltiyor mu? Bu yüzden sizden kodunuzu rica etmiştim, SpeechBubble sınıfını bilmiyoruz.

class SpeechBubble(pg.sprite.Sprite):
    def __init__(self, x, y, dialogList):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.image.load("SpeechBubble.png")
        self.rect = self.image.get_rect(topleft=(x, y))
        self.dialogList = chain(dialogList)
        self.textList = next(self.dialogList)
        

        

       
    def nextText(self,):
        
        try:
            self.textList = next(self.dialogList)
        except StopIteration:
            self.kill()
            return False
        return True   
            
              
        
        
    def drawText(self, rect, screen):
        textcounter = 0
        pos = rect.y + 2
        for x in range(len(self.textList)):
            MyFont = pg.font.Font("Fonts\\Typecast-Bold.ttf", 15)
            Mytext = MyFont.render("{}".format(self.textList[x]), True, (255, 0, 0))
            screen.blit(Mytext, (rect.x + 13, pos))
            pos += 12 # moves the following line down 10 pixels

menu tasarımı yaptım isterseniz atayım

            else:
                # if itertools loop end,Bubble = False
                self.Bubble = self.sb.nextText()
                if not self.Bubble: 
                  ... buraya girildi ise yazı baloncuğu bitmiş demek ...

evet öyle çalışıyor eğer loop bitmiş ise bubble False oluyor yani her şey başa dönüyor ------------------------------------------------------------------------------------------ peki ben dükkan menusunun gui’sini nasıl yapıcam o konudada yardım etseniz yani demek istediğim şu şekilde sprite classı içinde yapamazmıyım

class StoreMenu(pygame.sprite.Sprite):
         def__init__(self,x,y):
                pass

Yapabilirsiniz. Ancak burada asıl zor olan GUI’yi kodlamak zaten. Buton gibi bolca kullanacağınız nesneler için kendi sınıfınızı yazmanız kolaylık sağlar.

peki sırf Store için ayrı bir python dosyası kullanmama gerek varmı

yada bir menu classı içinde bütün widget ları toplamam mümkünmü
zaten sadece buton lazım

Bunu bana sormanıza gerek yok ki :slightly_smiling_face: Eğer ihtiyaç duyuyorsanız programınızı modüllere ayırabilirsiniz.

Eğer oyununuzun başka yerlerinde de GUI kullanacak iseniz bir UI modülü oluşturup gerekli sınıfları orada oluşturmanız iyi olabilir.

peki ana döngüde nerde çizdirilecek bunun içinde yardım edebilirmisiniz

döngü taslağı:

class Game:
   def__init__(self,):
          pass
  def new(self):
       pass
  def update(self):
        pass
  def run(self):
      pass
  def draw(self):
       pass

yani draw’da nasıl şöylemi

if self.store.menu == True:
   #menu çizdir

ve konuyla alakasız ama forum kodları yazarken ki tırnak işareti farklı onu nasıl klavyede
yapabilirim zorlanıyorumda.

sürekli forumun o konusuna dönüyorum.
kopyalıyorum :smile:

Ctrl + Alt + , ve AltGr + , bende çalışıyor. Sizde çalışmaz ise buraya bakabilirsiniz.

O şekilde de yapabilirsiniz. Bu size kalmış. Şahsen be çok fazla sprite içeren bir oyun yaptığımda bir liste içerisinde çizilecek bütün spriteları tutmayı tercih ediyorum. Gerektiğinde de sprite ekleyebiliyorum veya silebiliyorum.

bende all_sprites diye grup oluşturdum ama o grup oyunun kamerasına
bağlı yani eğer menuyu o gruba eklersem menu de hareket etmeye başlar
nasıl yapacağım

çünkü eğer menuyu yanlış yerde basarsam screen.fill() metodu ile ekranı temizlediğimizde hepsi gitmiş olacak