Menu
CoddyTech

Pygame Kopya Kağıdı

Son güncelleme

Kurulum ve oyun döngüsü

Her pygame programı bir pencere açar, sonra oyuncu çıkana kadar tek bir döngüyü tekrarlar.

İşlemKod
pygame-ce'yi kurpython3 -m pip install pygame-ce
pygame'i içe aktar ve başlatimport pygame pygame.init()
Pencere açscreen = pygame.display.set_mode((640, 480))
Pencere başlığını ayarlapygame.display.set_caption("My Game")
Saat oluşturclock = pygame.time.Clock()
Oyun döngüsürunning = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill("black") pygame.display.flip() clock.tick(60)
Döngüden sonra kapatpygame.quit()

Ekran

Ekran bir Surface'tir; flip çağırana kadar hiçbir şey görünmez.

İşlemKod
Hazır kareyi gösterpygame.display.flip()
Yalnızca bazı alanları güncellepygame.display.update([rect1, rect2])
Ekranı temizlescreen.fill((30, 30, 46))
Pencere boyutuscreen.get_size(), screen.get_width()
Rect olarak ekranscreen.get_rect()
Boyutu değiştirilebilen pencerepygame.display.set_mode((640, 480), pygame.RESIZABLE)
Masaüstü boyutunda tam ekranpygame.display.set_mode((0, 0), pygame.FULLSCREEN)

Renkler ve çizim

pygame.draw fonksiyonları bir yüzey, bir renk ve bir konum alır. width=0 şekli doldurur.

İşlemKod
RGB olarak renk(255, 140, 0)
Adıyla ya da hex ile renk"tomato", "#ff8c00", pygame.Color("gold")
Dikdörtgenpygame.draw.rect(screen, "red", (x, y, w, h))
Kenar çizgisi ve yuvarlak köşelerpygame.draw.rect(screen, "red", rect, width=2, border_radius=8)
Daire (merkezine göre)pygame.draw.circle(screen, "blue", (cx, cy), radius)
Çizgipygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3)
Çokgenpygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)])
Kutu içinde elipspygame.draw.ellipse(screen, "purple", (x, y, w, h))

Rect

Bir Rect, konumu ve boyutu tam sayılar olarak saklar.

İşlemKod
Rect oluşturplayer = pygame.Rect(x, y, width, height)
Herhangi bir noktaya göre konumlandırplayer.center = (320, 240), player.bottom = 400
Kenarlar ve köşelerleft, right, top, bottom, topleft, midbottom
Yerinde taşıplayer.move_ip(dx, dy)
Taşınmış kopyamoved = player.move(dx, dy)
Ekranın içinde tutplayer.clamp_ip(screen.get_rect())
Merkez etrafında büyütbigger = player.inflate(20, 20)
Ondalıklı konumlar (pygame-ce)pygame.FRect(10.5, 20.25, 40, 40)

Görseller, Surface ve blit

Görselleri döngüden önce bir kez yükle, sonra her karede blit ile çiz.

İşlemKod
Saydamlığı olan bir görsel yükleimg = pygame.image.load("player.png").convert_alpha()
Saydamlığı olmayan bir görsel yüklebg = pygame.image.load("sky.png").convert()
Görsel çizscreen.blit(img, (x, y))
Ortalayarak çizscreen.blit(img, img.get_rect(center=(320, 240)))
Yeni boş Surfacepanel = pygame.Surface((200, 100))
Saydam Surfacelayer = pygame.Surface((200, 100), pygame.SRCALPHA)
Tüm Surface'i yarı saydam yapimg.set_alpha(128)
Sprite sheet'ten kare kesframe = sheet.subsurface((0, 0, 32, 32))
Ekran görüntüsü kaydetpygame.image.save(screen, "shot.png")

Dönüştürme

Her fonksiyon yeni bir Surface döndürür; son sonucu değil, orijinali dönüştür.

İşlemKod
Yeniden boyutlandırpygame.transform.scale(img, (64, 64))
Bir katsayıyla ölçeklepygame.transform.scale_by(img, 2)
Yumuşak yeniden boyutlandırmapygame.transform.smoothscale(img, (64, 64))
Döndür (saat yönünün tersine, derece)pygame.transform.rotate(img, 45)
Merkez etrafında döndürrotated = pygame.transform.rotate(original, angle) rect = rotated.get_rect(center=rect.center)
Yatay olarak aynalapygame.transform.flip(img, True, False)

Olaylar ve klavye

Tek basışlar için olayları, basılı tutulan tuşlar için get_pressed() kullan.

İşlemKod
Bu karenin olaylarını okufor event in pygame.event.get():
Pencere kapatıldıevent.type == pygame.QUIT
Bir tuşa basıldıevent.type == pygame.KEYDOWN and event.key == pygame.K_SPACE
Bir tuş bırakıldıevent.type == pygame.KEYUP
Yazılan karakterevent.unicode
Şu an basılı tuşlarkeys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= 5
İki tuştan yöndx = keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]
Bu karede basılan tuşlar (pygame-ce)pygame.key.get_just_pressed()[pygame.K_SPACE]
Tuş sabitleriK_a...K_z, K_0...K_9, K_UP, K_RETURN, K_ESCAPE, K_LSHIFT
Bir tuşun adıpygame.key.name(event.key)
Özel olayHIT = pygame.event.custom_type() pygame.event.post(pygame.event.Event(HIT))

Fare

Tuşlar: 1 sol, 2 orta, 3 sağ.

İşlemKod
Bir fare tuşuna basıldıevent.type == pygame.MOUSEBUTTONDOWN and event.button == 1
Nereye basıldığıevent.pos
Şu anki imleç konumux, y = pygame.mouse.get_pos()
Şu an basılı fare tuşlarıleft, middle, right = pygame.mouse.get_pressed()
Fare hareket ettievent.type == pygame.MOUSEMOTION, event.rel
Tekerlek döndüevent.type == pygame.MOUSEWHEEL, event.y
Bir butonun içine tıklandıbutton_rect.collidepoint(event.pos)
İmleci gizlepygame.mouse.set_visible(False)

Sprite'lar ve gruplar

Bir sprite bir image ve bir rect tutar; bir grup birçok sprite'ı birlikte günceller ve çizer.

İşlemKod
Sprite sınıfıclass Coin(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = coin_img self.rect = self.image.get_rect(center=pos)
Grup oluşturcoins = pygame.sprite.Group()
Gruba eklecoins.add(Coin((100, 50)))
Her sprite'ı güncellecoins.update()
Her sprite'ı çizcoins.draw(screen)
Bir sprite'ı tüm gruplardan çıkarcoin.kill()
Tek sprite tutan grupplayer = pygame.sprite.GroupSingle(Player())

Çarpışmalar

Rect'ler üst üste bindiğinde çarpışır; kenarların yalnızca değmesi sayılmaz.

İşlemKod
İki dikdörtgena.colliderect(b)
Nokta içeride mirect.collidepoint(x, y)
Birçoğu içinden ilkirect.collidelist(walls) # index or -1
Gruba karşı spritehits = pygame.sprite.spritecollide(player, coins, True)
Herhangi bir çarpışma var mıpygame.sprite.spritecollideany(player, enemies)
Gruba karşı gruppygame.sprite.groupcollide(bullets, enemies, True, True)
Piksel hassasiyetindepygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask)
Dairelerpygame.Vector2(a).distance_to(b) < r1 + r2

Metin ve yazı tipleri

Metni bir Surface'e render et, sonra blit ile çiz.

İşlemKod
Varsayılan yazı tipifont = pygame.font.Font(None, 36)
Sistem yazı tipifont = pygame.font.SysFont("arial", 24)
Yazı tipi dosyasıfont = pygame.font.Font("pixel.ttf", 32)
Metni render ettext = font.render("Score: 10", True, "white")
Ortalayarak çizscreen.blit(text, text.get_rect(center=(320, 40)))
Uzun metni satırlara böl (pygame-ce)font.render(story, True, "white", None, 400)
Render etmeden boyutfont.size("Hello")
Yüklü yazı tipleripygame.font.get_fonts()

Ses ve müzik

Sesleri bir kez yükle. Müzik, tek bir parçayı doğrudan dosyasından akış olarak çalar.

İşlemKod
Ses yüklejump = pygame.mixer.Sound("jump.ogg")
Çaljump.play()
Ses seviyesijump.set_volume(0.5)
Müzik yüklepygame.mixer.music.load("theme.ogg")
Müziği sonsuz döngüde çalpygame.mixer.music.play(-1)
Duraklat ve devam ettirpygame.mixer.music.pause(), pygame.mixer.music.unpause()
Müziği durdurpygame.mixer.music.stop()

Zaman ve zamanlayıcılar

Tick değerleri milisaniye cinsindendir.

İşlemKod
Kare hızını sınırlaclock.tick(60)
Saniye cinsinden delta zamandt = clock.tick(60) / 1000
Anlık kare hızıclock.get_fps()
init'ten bu yana geçen milisaniyepygame.time.get_ticks()
Tekrarlayan zamanlayıcı olayıSPAWN = pygame.event.custom_type() pygame.time.set_timer(SPAWN, 1000)
Tek seferlik zamanlayıcıpygame.time.set_timer(SPAWN, 2000, loops=1)
Zamanlayıcıyı durdurpygame.time.set_timer(SPAWN, 0)

Vector2

Konumlar ve hızlar için ondalıklı sayılar.

İşlemKod
Vektör oluşturpos = pygame.Vector2(100, 200)
Hıza göre hareket ettirpos += velocity * dt
Uzunlukvelocity.length()
Çaprazda aynı hızif direction.length() > 0: direction = direction.normalize()
Noktalar arası mesafepos.distance_to(target)
Döndürvelocity.rotate(90)
Bir noktaya doğru adım at (pygame-ce)pos.move_towards_ip(target, 5)

Python ile 2D oyun yaparken sık başvurduğun pygame kodları, işe göre gruplanmış halde: oyun döngüsü, ekran, renkler ve çizim, Rect, görseller ve blit, ölçekleme ve döndürme, klavye ve fare girdisi, sprite'lar ve gruplar, çarpışmalar, metin, ses, zamanlayıcılar ve Vector2. Her satırda yapıştırabileceğin kısa bir kod parçası ve yanında ne yaptığı var.

Buradaki her şey, pygame'in topluluk sürümü olan ve hâlâ import pygame ile içe aktardığın pygame-ce 2.5 için yazıldı. pygame-ce olarak işaretlenen satırlar onun eklediği özellikleri kullanır; diğer tüm satırlar orijinal pygame'de de çalışır. Herhangi bir kod parçasını, pygame'i kurulum gerektirmeden tarayıcında çalıştıran pygame playground üzerinde dene. Python'a yeni mi başlıyorsun? Python kopya kağıdı ile başla.

Pygame kopya kağıdı hakkında sık sorulan sorular

Bu pygame kopya kağıdı ücretsiz mi?

Evet. Ücretsizdir ve kayıt gerektirmez. Yer imlerine ekle ya da tarayıcından PDF olarak yazdır; bir sprite grubu, bir ses ya da bir çarpışma kontrolü için tam çağrıya ihtiyaç duyduğunda geri gel.

Bu kopya kağıdı pygame ve pygame-ce ile çalışır mı?
Evet. İkisi de import pygame ile içe aktarılır ve API'nin neredeyse tamamı ortaktır. pygame-ce olarak işaretlenen satırlar (FRect, scale_by, get_just_pressed, metin kaydırma ve move_towards_ip) pygame-ce gerektirir, geri kalan her şey ikisinde de çalışır.
pygame pencerem neden yanıt vermiyor?
Oyun döngüsü olayları okumuyor. Olayları yok saysan bile her karede bir kez pygame.event.get() çağır ve her kareyi pygame.display.flip() ve clock.tick(60) ile bitir.
Girdi için olayları mı yoksa key.get_pressed() mi kullanmalıyım?
Zıplamak ya da menü açmak gibi her basışta bir kez olan eylemler için KEYDOWN olayını kullan. Yürümek gibi tuş basılı tutulduğu sürece devam eden eylemler için pygame.key.get_pressed() kullan.
Coddy programlama dilleri çizimi

Coddy ile Pygame öğren

Başla