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