Saya mencoba mengembangkan game sederhana yang dibuat dengan Pygame (Python library).
Saya memiliki sprite
objek yang mana player
dan saya memindahkannya menggunakan tombol panah. Jika saya tidak menggerakkan mouse, sprite bergerak secara normal, tetapi ketika saya menggerakkan mouse, sprite bergerak lebih cepat (seperti x2 atau x3). The player
objek adalah dalam charsGroup
var.
Saya sudah menjalankan game di W7 dan di Ubuntu. Hal yang sama terjadi di kedua OS.
Saya memiliki lebih banyak entitas yang bergerak seperti NPC dan peluru tetapi mereka tidak terpengaruh, hanya pemainnya. Mengingat ini, saya pikir masalahnya mungkin memiliki koneksi langsung dengan sistem pemain yang bergerak (tombol panah).
Berikut adalah update()
metode player
objek:
def update(self):
for event in pygame.event.get():
key = pygame.key.get_pressed()
mouseX, mouseY = pygame.mouse.get_pos()
if event.type == pygame.MOUSEBUTTONDOWN:
self.bulletsGroup.add(Bullet(pygame.image.load("bullet.png"),
self.rect.x + (self.image.get_width()/2),
self.rect.y + (self.image.get_height()/2),
mouseX, mouseY, 50, 50))
if key[pygame.K_RIGHT]:
if not self.checkCollision():
self.rect.x += 10
else:
self.rect.x -= 10
if key[pygame.K_LEFT]:
if not self.checkCollision():
self.rect.x -= 10
else:
self.rect.x += 10
if key[pygame.K_UP]:
if not self.checkCollision():
self.rect.y -= 10
else:
self.rect.y += 10
if key[pygame.K_DOWN]:
if not self.checkCollision():
self.rect.y += 10
else:
self.rect.y -= 10
Dan inilah loop while:
while True:
if PLAYER.healthBase <= 0:
GAMEOVER = True
if not GAMEOVER:
mapTilesGroup.draw(SCREEN)
charsGroup.update()
charsGroup.draw(SCREEN)
npcsGroup.update()
npcsGroup.draw(SCREEN)
drawBullets()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if GAMEOVER:
myfont = pygame.font.SysFont("monospace", 30)
label = myfont.render("GAME OVER!", 1, (255, 255, 0))
SCREEN.blit(label, (400, 300))
freq.tick(0)
pygame.display.flip()
Saya tidak tahu apa lagi yang bisa Anda butuhkan untuk membantu saya, tetapi apa pun yang Anda butuhkan (info lebih lanjut atau kode) minta saja!
BULLET_IMAGE = pygame.image.load("bullet.png")
dan kemudianself.bulletsGroup.add(Bullet(BULLET_IMAGE...
Jawaban:
tl; dr jangan gabungkan loop acara Anda dengan loop game Anda .
Saat Anda menggerakkan tetikus, game menerima banyak
pygame.MOUSEMOTION
acara. Anda tidak benar-benar menggunakan acara ini untuk memperbarui posisi mouse Anda, Anda mendapatkan kondisi saat ini menggunakan mousepygame.mouse.get_pos()
. Itu tidak efisien, tapi bukan itu masalahnya.Masalahnya adalah Anda memperbarui posisi pemain di dalam loop acara !
Inilah yang seharusnya terjadi:
Inilah yang dilakukan oleh kode Anda:
Ketika Anda menggerakkan mouse Anda, loop acara akan mengeksekusi berkali-kali per frame. Tetapi ketika Anda memeriksa tombol mana yang ditekan
pygame.key.get_pressed()
, mereka tetap ditekan sampai Anda melepaskannya, beberapa saat kemudian. Jadi saat loop acara Anda berputar melalui event gerakan mouse, itu akan menerapkan kembali gerakan pemain berulang kali.Solusinya sederhana: pindahkan pemain ke luar loop acara.
sumber
pygame.mouse.get_pos()
tidak efisien? Alternatif apa yang saya miliki?pygame.mouse.get_pos()
mendapatkan posisi terbaru mouse, terlepas dari antrian acara, jadi tidak perlu untuk memasukkannya ke dalam loop acara. Alternatifnya adalah mengolahpygame.MOUSEMOTION
sendiri, tetapi kecuali Anda membutuhkan setiap acara (misalnya Anda menulis program melukis), posisi terakhir akan dilakukan.Berikut adalah beberapa pemikiran untuk melengkapi jawaban yang ada .
Gaffer On Games memiliki artikel hebat tentang loop game yang telah dirujuk di mana-mana.
Putaran game Anda harus memiliki tahapan independen yang berbeda: Input, Perbarui, Render.
Misalnya Anda dapat membaca input 30 kali per detik (atau secara real-time untuk responsif yang lebih baik), melakukan 30 pembaruan per detik dan membuat 60 frame per detik, atau nilai apa pun bekerja dengan baik untuk permainan Anda.
sumber