Rumah > pembangunan bahagian belakang > Tutorial Python > helaian sprite animasi pygame

helaian sprite animasi pygame

WBOY
Lepaskan: 2024-02-12 08:12:04
ke hadapan
704 orang telah melayarinya

helaian sprite animasi pygame

Kandungan soalan

Saya ingin mencipta rpg atas ke bawah dalam pygame menggunakan helaian sprite.

Sebagai contoh, saya mahu dapat menekan bar ruang untuk menyerang, yang akan mencetuskan animasi serangan dan kemudian kembali kepada normal

import pygame
from pygame.locals import *

pygame.init()

image = pygame.image.load("sprite_sheet.png")

clock = pygame.time.Clock()

screen =  pygame.display.set_mode((400, 250))

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()

        self.current_animation = 0
        self.max_animation = 5

        self.animation_cooldown = 150
        self.last_animation = pygame.time.get_ticks()

        self.status = {"prev": "standing",
                       "now": "standing"}

    def animate_attack(self):
        time_now = pygame.time.get_ticks()

        if time_now - self.last_animation >= self.animation_cooldown:
            self.last_animation = pygame.time.get_ticks()
            if self.current_animation == self.max_animation:
                self.current_animation = 0

                joshua.status["now"] = joshua.status["prev"]
            else:
                self.current_animation += 1


joshua = Player()

while True:
    screen.fill(0)
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                joshua.status["prev"] = joshua.status["now"]
                joshua.status["now"] = "attacking"

    if joshua.status["now"] == "attacking":
        joshua.animate_attack()

    screen.blit(image, (0, 0), (joshua.current_animation * 64, 0, 64, 64))

    pygame.display.flip()

    clock.tick(60)
Salin selepas log masuk

Kod di atas adalah yang saya ada. Jika saya menekan bar ruang sekali, ia akan melalui animasi dan berhenti, tetapi jika saya menekan bar ruang dua kali, ia gelung kerana cara ia diprogramkan.

Perlukan sedikit bantuan dengan animasi, terima kasih


Jawapan betul


Masalah disebabkan oleh panggilan berikut apabila ruang ditekan untuk kali kedua:

joshua.status["prev"] = joshua.status["now"]
Salin selepas log masuk

Ini akan menetapkan status "Sebelumnya" dan "Sekarang" kepada "Serang". Akibatnya, apabila keadaan ditetapkan semula dalam kaedah animate_attack(), Ia akan kekal sebagai "Serangan":

joshua.status["now"] = joshua.status["prev"]
Salin selepas log masuk

Sebagai penyelesaian pantas, pastikan anda hanya menukar status jika ia belum ditetapkan lagi:

if event.key == pygame.k_space:
    if not joshua.status["now"] == "attacking":
        joshua.status["prev"] = joshua.status["now"]
        joshua.status["now"] = "attacking"
Salin selepas log masuk

Sebagai penyelesaian yang lebih baik anda harus merangkum keadaan, Dengan cara ini hanya kelas pemain boleh mengendalikan keadaannya sendiri, contohnya:

class player():
    def __init__(self):
        self.current_animation = 0
        self.max_animation = 5
        self.animation_cooldown = 150
        self.last_animation = pygame.time.get_ticks()
        self.status = "standing" # simplified state

    def attack(self):
        self.status = "attacking"

    def animate_attack(self):
        if self.status == "attacking":
            time_now = pygame.time.get_ticks()
            if time_now - self.last_animation >= self.animation_cooldown:
                self.last_animation = pygame.time.get_ticks()
                if self.current_animation == self.max_animation:
                    self.current_animation = 0
                    self.status = "standing" # reset state
                else:
                    self.current_animation += 1
Salin selepas log masuk

Dengan cara ini, tidak perlu tahu mana-mana negeri di luar kelas:

while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                joshua.attack()

    joshua.animate_attack()

    screen.fill(0)
    screen.blit(image, (0, 0), (joshua.current_animation * 64, 0, 64, 64))
    pygame.display.flip()
    clock.tick(60)
Salin selepas log masuk

Atas ialah kandungan terperinci helaian sprite animasi pygame. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan