Pygame Sprite (Hareket ederken) Takılıyor

Arkadaşlar pygame de oluşturduğum sprite hareket ettiğinde takılıyor onu düzeltmemin bir imkanı varmı

Neden takıldığını anlamamız için kodunuzu görmemiz lazım.

class Bullet(pg.sprite.Sprite):
    def __init__(self, plyrrect, facing, speed):
        pg.sprite.Sprite.__init__(self)
        self.facing=facing
        self.plyrrect= plyrrect
        self.speed = speed*facing
        self.timer = 0
        left = "FireBallLeft.png"
        right = "FireBallRight.png"
        self.image =  pg.image.load(left).convert_alpha() if self.facing == -1 else pg.image.load(right).convert_alpha

        self.rect = self.image.get_rect(topleft=((self.plyrrect.x + 5), (self.plyrrect.y + 25)))




    def update(self, *args):
        self.rect.x += self.speed
        self.timer += abs(self.speed)
        Bullethit_list = pg.sprite.spritecollide(self, Platforms, False)

        if Bullethit_list:
            self.kill()
            exp = Explosive(self.rect.center, "small")
            all_sprites.add(exp)
            Bullets.remove(self)
            all_sprites.remove(self)
        if self.timer >= 500:
            self.kill()
            exp = Explosive(self.rect.center, "small")
            all_sprites.add(exp)
            Bullets.remove(self)
            all_sprites.remove(self)
        BulletHitList2 = pg.sprite.spritecollide(self, Enemys, False)

        for hit in BulletHitList2:
            hit.Health -= 25

            self.kill()
            exp = Explosive(self.rect.center, "small")
            all_sprites.add(exp)


NameError: name ‘pg’ is not defined

import pygame as pg

@Emerald_Gamer

Bullet sınıfından bir örnek oluştururken 3 adet parametre girmemiz gerekiyor.

def __init__(self, plyrrect, facing, speed)

Bu parametrelere hangi değerleri yazıyorsunuz?
Ayrıca, aşağıdaki png dosyalarını da paylaşabilir misiniz?

        left = "FireBallLeft.png"
        right = "FireBallRight.png"

plyrrect oyunun içindeki karakterin rect ini gönderiyoruz parametre olarak
facing sağmı solmu onu belirler speed de merminin hızını belirler

alın:FireBallRight ve FireBallLeft

Betik dosyasındaki bütün kodları attınız mı?

sorunum hakkındaki hepsini attım bullet classı hakkında başka kod yok
ama:
yazdırma:
screen.blit()
update:

for i in bullets:
        i.update()

Buradaki speed için hangi değeri veriyorsunuz? Bir de facing 1 veya -1 sanırım, doğru mu?

evet ve 7 koyuyorum.

sizce takılmanın sebebi nedir

Takılmadan kastınızı tam anlamadım ama merminiz çok hızlı gidiyor sanırım?

fazla hızlı değil 7 olduğuna bakmayın normal mermi hızında gidiyo
ve takılmadan kastım giderken kesintisiz gitmiyo hafif takılıyo ara sıra

Sadece mermi mi takılıyor yoksa oyun mu kasıyor? Ben kodda bir hata göremedim.

sadece mermi takılıyor acaba hız ile alakalımı? oyunu fazla etkilemiyor takılması ama genede mükemmel olmasını istiyorum siz ne düşünüyorsunuz bu konuda?

Merminizin hızını son döngünün üzerinden geçen zaman ile çarparsanız sabit bir sürat elde edersiniz. Kodunuzunda clock nesnesi kullanıyorsunuzdur diye tahmin ediyorum, şöyle bir kullanım sabit sürat sağlar:

deltaTime = clock.tick(60) / 1000
mermi.position.x += mermi.velocity.x * deltaTime

Burada rect.x kullanamazsınız çünkü sadece int değerlerini kabul ediyor. pygame.Vector2 sınıfını kullanmanız daha iyi olur. velocity'yi de saniyede kaç piksel hareket edeceğine göre belirlersiniz.

Saolun ama vektorler ile ilgili veya velocity nasil kullaniliyorsa anlatirmisiniz ayrica cok tesekkur ederim bu arastirma icin

Önemli değil ama bunun için bir araştırma yapmadım. Ben bunu oyunlarımda haraket eden her şey için kullanıyorum. Oyun motorları da bunu yapar.

Velocity sürat anlamına geliyor. Ben orada öylesine onu yazmıştım. Siz onu kendiniz de tanımlayıp değer olarak karakterinizin saniyede kaç pixel gideceğini atayacaksınız.


Vector konusuna gelince, pygame.Vector2 sınıfını kullanabilirsiniz. Aslında liste kullanmak ile bunu kullanmanız arasındaki en büyük fark kullanım kolaylığı olacaktır. Örneğin siz konumlarınızı şu şekilde saklıyorsunuz:

self.position = [1,2]

Vector ile şu şekilde yapacaksınız:

position = pygame.Vector2(1,2)
position.x # 1
position.y # 2
position[0] # 1
position[1] # 2

Oyunumuzun iki boyutlu analitik düzlemde geçtiğini düşünürsek vector örneğinin x ve y nitelikleri karakterimizin x ve y koordinatları oluyor. Vector kullanmamızın asıl sebebi önemli geometrik metotlara ve ihtiyacımız olan operator overloadinglere sahip olması:

>>> Vector2(2, 1) + Vector2(5, 2)
<Vector2(7, 3)>
>>> Vector2(3, 2) * 2
<Vector2(6, 4)>
>>> v = Vector2(3, 4)
>>> v.length()
5.0
>>> v.distance_to( Vector2(3, 5) )
1.0

Peki yaptiginiz her oyunda objelerin hareket etmesi icn kullaniyorum demissiniz basit bir block örneği ile yapabilir misiniz lutfen :slight_smile: