Pygame çarpışma ayarlamak

sadad

Merhabalar yukarıdaki resimdeki arı ve sinek benim oyunumdaki objeler. arı ve sinek çarpışınca oyun bitecek. Bunu (çarpışmayı) hesaplamak için aralarındaki uzaklığı hesaplayıp eğer bir değerden küçük ise oyunu bitir diyorum. Ama kırmızı ile işaretlediklerim objelerin merkez noktaları. böyle olunca da aralarındaki mesafe geçersiz kılnıyor. bazen üst üste geliyorlar ve oyun bitiyor bazen de üst üste gelmeden oyun bitiyor.

Sorum şu: ben bu merkezleri nasıl resimlerin tam ortasına taşıyabilirim?

Rect.colliderect niye kullanmiyorsun?

Merkezleri arasindaki mesafe carpisma icin uygun degil. Carpisma mesafesi, aralarindaki aciya gore degisiyor. (Yanyana gecebildikleri mesafeden kose koseye carpisabilirler.)

X ve Y menzillerinin birbirlerini icerip icermedigine bakman lazim. 1D iki cizgi carpisma algoritmasini X ve Y eksenleri icin ayri ayri yapip and’lerini alabilirsin.

1 Beğeni

Merkezi taşımanıza gerek yok. Dörtgenlerin 4 köşesi vardır. Bu 4 köşeyi belirli aralıkları oluştururak koşul cümlesi/cümleleri içerisinde kullanacak olursanız sorunu çözebilirsiniz. Hatta yeri gelmişken bir örnek paylaşayım.

import pygame
import time

res_x, res_y = 1000, 500
screen = pygame.display.set_mode((res_x, res_y))
pygame.init()

class SariDortgen:
    def __init__(self):
        self.x, self.y = 0, 0
        self.width, self.height = 100, 100

class MaviDortgen:
    def __init__(self):
        self.x, self.y = 1000, 50
        self.width, self.height = 100, 100


SD = SariDortgen()
MD = MaviDortgen()

def check_for_collision():
    if (SD.x <= MD.x <= SD.x + SD.width or SD.x <= MD.x + SD.width <= SD.x + SD.width) and (SD.y <= MD.y <= SD.y + SD.height or SD.y <= MD.y + MD.height <= SD.y + SD.height):
        return True
    else:
        return False


def main():
    while True:
        screen.fill((0, 0, 0))
        SD.x += 1
        MD.x -= 1
        pygame.draw.rect(screen, (0, 0, 255), [SD.x, SD.y, SD.width, SD.height])
        pygame.draw.rect(screen, (255, 255, 0), [MD.x, MD.y, MD.width, MD.height])
        pygame.display.update()
        if check_for_collision():
            while True:
                time.sleep(1)




main()

Bahsini ettiğim koşul cümlesi check_for_collision isimli fonksiyonun hemen altında yer alan kısım.

1 Beğeni

Şu ana kadar yazdığım kodlar biraz karmaşıktı ilk olarak bunu denedim ama çok fazla bug oluşunca ben de merkezi hareket ettirmek gibi bir fikir geliştirdim ama araştırınca bulamayıp buraya yazdım. Kodları en baştan yazmaya karar verdim, teşekkürler.