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.
| İşlem | Kod |
|---|---|
| pygame-ce'yi kur | python3 -m pip install pygame-ce |
| pygame'i içe aktar ve başlat | import pygame
pygame.init() |
| Pencere aç | screen = pygame.display.set_mode((640, 480)) |
| Pencere başlığını ayarla | pygame.display.set_caption("My Game") |
| Saat oluştur | clock = 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 kapat | pygame.quit() |
Ekran
Ekran bir Surface'tir; flip çağırana kadar hiçbir şey görünmez.
| İşlem | Kod |
|---|---|
| Hazır kareyi göster | pygame.display.flip() |
| Yalnızca bazı alanları güncelle | pygame.display.update([rect1, rect2]) |
| Ekranı temizle | screen.fill((30, 30, 46)) |
| Pencere boyutu | screen.get_size(), screen.get_width() |
| Rect olarak ekran | screen.get_rect() |
| Boyutu değiştirilebilen pencere | pygame.display.set_mode((640, 480), pygame.RESIZABLE) |
| Masaüstü boyutunda tam ekran | pygame.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.
| İşlem | Kod |
|---|---|
| RGB olarak renk | (255, 140, 0) |
| Adıyla ya da hex ile renk | "tomato", "#ff8c00", pygame.Color("gold") |
| Dikdörtgen | pygame.draw.rect(screen, "red", (x, y, w, h)) |
| Kenar çizgisi ve yuvarlak köşeler | pygame.draw.rect(screen, "red", rect, width=2, border_radius=8) |
| Daire (merkezine göre) | pygame.draw.circle(screen, "blue", (cx, cy), radius) |
| Çizgi | pygame.draw.line(screen, "white", (x1, y1), (x2, y2), 3) |
| Çokgen | pygame.draw.polygon(screen, "green", [(0, 0), (40, 0), (20, 30)]) |
| Kutu içinde elips | pygame.draw.ellipse(screen, "purple", (x, y, w, h)) |
Rect
Bir Rect, konumu ve boyutu tam sayılar olarak saklar.
| İşlem | Kod |
|---|---|
| Rect oluştur | player = pygame.Rect(x, y, width, height) |
| Herhangi bir noktaya göre konumlandır | player.center = (320, 240), player.bottom = 400 |
| Kenarlar ve köşeler | left, right, top, bottom, topleft, midbottom |
| Yerinde taşı | player.move_ip(dx, dy) |
| Taşınmış kopya | moved = player.move(dx, dy) |
| Ekranın içinde tut | player.clamp_ip(screen.get_rect()) |
| Merkez etrafında büyüt | bigger = 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.
| İşlem | Kod |
|---|---|
| Saydamlığı olan bir görsel yükle | img = pygame.image.load("player.png").convert_alpha() |
| Saydamlığı olmayan bir görsel yükle | bg = pygame.image.load("sky.png").convert() |
| Görsel çiz | screen.blit(img, (x, y)) |
| Ortalayarak çiz | screen.blit(img, img.get_rect(center=(320, 240))) |
| Yeni boş Surface | panel = pygame.Surface((200, 100)) |
| Saydam Surface | layer = pygame.Surface((200, 100), pygame.SRCALPHA) |
| Tüm Surface'i yarı saydam yap | img.set_alpha(128) |
| Sprite sheet'ten kare kes | frame = sheet.subsurface((0, 0, 32, 32)) |
| Ekran görüntüsü kaydet | pygame.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.
| İşlem | Kod |
|---|---|
| Yeniden boyutlandır | pygame.transform.scale(img, (64, 64)) |
| Bir katsayıyla ölçekle | pygame.transform.scale_by(img, 2) |
| Yumuşak yeniden boyutlandırma | pygame.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ür | rotated = pygame.transform.rotate(original, angle)
rect = rotated.get_rect(center=rect.center) |
| Yatay olarak aynala | pygame.transform.flip(img, True, False) |
Olaylar ve klavye
Tek basışlar için olayları, basılı tutulan tuşlar için get_pressed() kullan.
| İşlem | Kod |
|---|---|
| Bu karenin olaylarını oku | for 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 karakter | event.unicode |
| Şu an basılı tuşlar | keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= 5 |
| İki tuştan yön | dx = 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ş sabitleri | K_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 olay | HIT = pygame.event.custom_type()
pygame.event.post(pygame.event.Event(HIT)) |
Fare
Tuşlar: 1 sol, 2 orta, 3 sağ.
| İşlem | Kod |
|---|---|
| Bir fare tuşuna basıldı | event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 |
| Nereye basıldığı | event.pos |
| Şu anki imleç konumu | x, y = pygame.mouse.get_pos() |
| Şu an basılı fare tuşları | left, middle, right = pygame.mouse.get_pressed() |
| Fare hareket etti | event.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 gizle | pygame.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.
| İşlem | Kod |
|---|---|
| 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ştur | coins = pygame.sprite.Group() |
| Gruba ekle | coins.add(Coin((100, 50))) |
| Her sprite'ı güncelle | coins.update() |
| Her sprite'ı çiz | coins.draw(screen) |
| Bir sprite'ı tüm gruplardan çıkar | coin.kill() |
| Tek sprite tutan grup | player = pygame.sprite.GroupSingle(Player()) |
Çarpışmalar
Rect'ler üst üste bindiğinde çarpışır; kenarların yalnızca değmesi sayılmaz.
| İşlem | Kod |
|---|---|
| İki dikdörtgen | a.colliderect(b) |
| Nokta içeride mi | rect.collidepoint(x, y) |
| Birçoğu içinden ilki | rect.collidelist(walls) # index or -1 |
| Gruba karşı sprite | hits = pygame.sprite.spritecollide(player, coins, True) |
| Herhangi bir çarpışma var mı | pygame.sprite.spritecollideany(player, enemies) |
| Gruba karşı grup | pygame.sprite.groupcollide(bullets, enemies, True, True) |
| Piksel hassasiyetinde | pygame.sprite.spritecollide(a, group, False, pygame.sprite.collide_mask) |
| Daireler | pygame.Vector2(a).distance_to(b) < r1 + r2 |
Metin ve yazı tipleri
Metni bir Surface'e render et, sonra blit ile çiz.
| İşlem | Kod |
|---|---|
| Varsayılan yazı tipi | font = pygame.font.Font(None, 36) |
| Sistem yazı tipi | font = pygame.font.SysFont("arial", 24) |
| Yazı tipi dosyası | font = pygame.font.Font("pixel.ttf", 32) |
| Metni render et | text = font.render("Score: 10", True, "white") |
| Ortalayarak çiz | screen.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 boyut | font.size("Hello") |
| Yüklü yazı tipleri | pygame.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.
| İşlem | Kod |
|---|---|
| Ses yükle | jump = pygame.mixer.Sound("jump.ogg") |
| Çal | jump.play() |
| Ses seviyesi | jump.set_volume(0.5) |
| Müzik yükle | pygame.mixer.music.load("theme.ogg") |
| Müziği sonsuz döngüde çal | pygame.mixer.music.play(-1) |
| Duraklat ve devam ettir | pygame.mixer.music.pause(), pygame.mixer.music.unpause() |
| Müziği durdur | pygame.mixer.music.stop() |
Zaman ve zamanlayıcılar
Tick değerleri milisaniye cinsindendir.
| İşlem | Kod |
|---|---|
| Kare hızını sınırla | clock.tick(60) |
| Saniye cinsinden delta zaman | dt = clock.tick(60) / 1000 |
| Anlık kare hızı | clock.get_fps() |
| init'ten bu yana geçen milisaniye | pygame.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ı durdur | pygame.time.set_timer(SPAWN, 0) |
Vector2
Konumlar ve hızlar için ondalıklı sayılar.
| İşlem | Kod |
|---|---|
| Vektör oluştur | pos = pygame.Vector2(100, 200) |
| Hıza göre hareket ettir | pos += velocity * dt |
| Uzunluk | velocity.length() |
| Çaprazda aynı hız | if direction.length() > 0:
direction = direction.normalize() |
| Noktalar arası mesafe | pos.distance_to(target) |
| Döndür | velocity.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ı?
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?
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?
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.