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 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
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