Re: Bagaimana cara mendeteksi dan mengakhiri permainan ketika sprite pygame mengenai ekornya?

Saya membuat permainan seperti ular di mana pengguna menggerakkan sprite, dan sprite meninggalkan jejak. Jika pengguna menemukan jejak yang dibuatnya, saya ingin permainan berakhir, dan pemain tersebut kalah.

Salah satu ide yang saya miliki adalah melacak posisi sprite sebelumnya (mungkin dalam daftar), dan kemudian membuat pernyataan if yang akan menyebabkan kekalahan game (Namun, saya agak tidak jelas tentang cara melakukannya).

Saya menerima jawaban atas pertanyaan ini yang dikodekan untuk daftar ini:

"Saya pikir Anda bisa mendeklarasikan daftar dua dimensi seperti ini: pastPositions = [[400, 300]] Lalu setiap kali posisi pemain berpindah, periksa daftarnya:
untuk baris di masa laluPosisi: If (player.rect.x == pastPositions[row][0] and player.rect.y == pastPositions[row][1]): done = true # game over Jika pemain belum pernah ke sana, tambahkan posisi itu ke daftarnya.pastPositions.append([player.rect.x, player.rect.y])

Sepertinya ini akan berhasil, tetapi ketika saya mencoba menjalankan kode (dengan Python Interactive), saya mendapatkan pesan kesalahan yang berbunyi: "line 86, in <module> if player.rect.x == astPositions[row][0] and player.rect.y == pastPositions[row][1]: IndexError: list index out of range"

Apa saran Anda agar saya mengubah rentangnya agar hal ini tidak terjadi? Saya mencoba mengaturnya ke lebar dan tinggi jendela pygame.

import pygame

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

class Player(pygame.sprite.Sprite):

   def __init__(self, x, y):
       super().__init__()

       self.image = pygame.Surface([15, 15])
       self.image.fill(WHITE)

       self.rect = self.image.get_rect()
       self.rect.x = x
       self.rect.y = y

       self.change_x = 0
       self.change_y = 0


   def changespeed(self, x, y):
       self.change_x += x
       self.change_y += y


   def update(self):
       self.rect.x += self.change_x
       self.rect.y += self.change_y

pygame.init()

screen = pygame.display.set_mode([800, 600])

pygame.display.set_caption('The Etch-a-Sketch Game')

myfont = pygame.font.SysFont('Times', 20)
textsurface = myfont.render('This is the Etch-a-Sketch Game', False, (255, 255, 255))
screen.blit(textsurface,(0,0))

myfont = pygame.font.SysFont('Times', 15)
textsurface = myfont.render('Feel free to draw, but if you cross your own    path, you will die.', False, (255, 255, 255))
screen.blit(textsurface,(0,20))


player = Player(400, 300)
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(player)

clock = pygame.time.Clock()
done = False

while not done:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.changespeed(-3, 0)
            elif event.key == pygame.K_RIGHT:
                player.changespeed(3, 0)
            elif event.key == pygame.K_UP:
                player.changespeed(0, -3)
            elif event.key == pygame.K_DOWN:
                player.changespeed(0, 3)

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                player.changespeed(3, 0)
            elif event.key == pygame.K_RIGHT:
                player.changespeed(-3, 0)
            elif event.key == pygame.K_UP:
                player.changespeed(0, 3)
            elif event.key == pygame.K_DOWN:
                player.changespeed(0, -3)

    player.update()

    all_sprites_list.draw(screen)

    pygame.display.flip()
    clock.tick(75)

pygame.quit ()

person Gal    schedule 14.01.2019    source sumber


Jawaban (1)


Mencatat titik-titik dari jalur yang sangat panjang sepertinya merupakan cara yang lambat untuk memeriksa apakah Anda sudah mengenai ekor Anda sendiri.

Jika latar belakang adalah warna yang diketahui, mungkin memeriksa warna piksel non-latar belakang di area tempat pemain akan pindah.

Dimungkinkan untuk mengambil satu warna piksel dengan Surface.get_at( ) fungsi. Ini mengembalikan warna RGBA, warna ini dapat dibandingkan dengan satu warna latar belakang (atau warna latar belakang yang diketahui dari bitmap pada saat itu), sehingga tabrakan dapat ditentukan.

Di player.update():

if (screen.get_at((player_next_x, player_next_y)) != BACKGROUND_COLOUR):
    # player hit tail

Tentu saja mungkin perlu untuk memeriksa kedua sudut sprite pemain (ke arah perjalanan).

person Kingsley    schedule 15.01.2019
comment
Terima kasih banyak atas jawaban Anda! Sepertinya ini akan berhasil, tapi saya punya beberapa pertanyaan: - person Gal; 15.01.2019
comment
#1 - Bagaimana Anda mendefinisikan (player_next_x) dan (player_next_y), dengan mempertimbangkan input pengguna pada tombol arah? - person Gal; 15.01.2019
comment
#2 - Saya bertanya karena saya mencobanya hanya menggunakan (player.rect.x) dan (player.rect.y), yang sudah saya definisikan, dan tentu saja sistem langsung ditutup karena mendeteksi tabrakan dengan posisinya saat ini. - person Gal; 15.01.2019
comment
Saat kode akan menggambar posisi pemain berikutnya, kode tersebut menggunakan koordinat berikut. Jadi periksa saja sebelum melukis di bitmap. - person Kingsley; 16.01.2019