Saya mencoba mendeteksi tabrakan antara pacman dan kotak, tetapi tidak mendeteksi tabrakan, ada bantuan atau saran? saat ini saya mencoba membuat daftar instance tetapi itu tidak berhasil, saya tidak tahu harus berbuat apa lagi. juga mengatakan kepada saya untuk menambahkan lebih banyak detail tetapi saya tidak benar-benar tahu apa yang dapat saya tambahkan jujur, maaf

import pygame
import os
import sys

#intialise the game 
pygame.init()
screen = pygame.display.set_mode((448, 576))
done = False

y = 320
x = 216

#sets up clock and loads pacman image
clock = pygame.time.Clock()
PACMANSPRITE = pygame.image.load("pacman.png").convert_alpha()

#gets pacman intro music, sets music to lower volume then plays it
pygame.mixer.music.load('pacman_beginning.WAV')
pygame.mixer.music.set_volume(0.01)
pygame.mixer.music.play(0)


#box class, used for boxes to border pacmans map
class boxcollisions(pygame.sprite.Sprite):
    def __init__(self, x, y):
        self.y = y
        self.x = x
        self.rect = pygame.Rect(self.x, self.y, 15, 15)
        self.color = (0, 128, 255)

    def draw(self, screen):
        pygame.draw.rect(screen, self.color, self.rect)



#pacmans class
class pacman(pygame.sprite.Sprite):
    def __init__(self, image, x, y):
        self.image = image
        self.y=y
        self.x=x
        self.rect = self.image.get_rect()
        self.rect.left = self.x
        self.rect.top = self.y
        self.rect.width=16
        self.rect.height=16


    # move pacman 
    def movement(self):
        pressed= pygame.key.get_pressed()
        if pressed[pygame.K_UP]:
            self.y -= 2
        if pressed[pygame.K_DOWN]:
            self.y += 2
        if pressed[pygame.K_LEFT]:
            self.x -= 2
        if pressed[pygame.K_RIGHT]:
            self.x += 2


    def draw(self, surface):
        """ Draw on surface """
        # blit yourself at your current position
        surface.blit(self.image, (self.x, self.y))

#instances the pacman class
sprite = pacman(PACMANSPRITE, x ,y)


#main game loop
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
                    done = True
                    pygame.quit()
                    sys.exit()


    screen.fill((100,0,0))

    #co-ordinates for boxes to set up map boundaries
    boundaries=[

        [],
        [],
        [],
        [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],
        [1,14,15,28], #5
        [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28],
        [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28],
        [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28],
        [1,28],
        [1,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,28], #10
        [1,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,28],
        [1,8,9,14,15,20,21,28],
        [1,2,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,27,28],
        [1,2,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,27,28],
        [6,8,9,20,21,23], #15
        [6,8,9,11,12,13,14,15,16,17,18,20,21,23],
        [1,2,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28],
        [1,11,12,13,14,15,16,17,18,28],
        [1,2,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28],
        [6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28], #20
        [6,8,9,20,21,23],
        [6,8,9,11,12,13,14,15,16,17,18,20,21,23],
        [1,2,3,4,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,25,26,27,28],
        [1,14,15,28],
        [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28], #25
        [1,3,4,5,6,8,9,10,11,12,14,15,17,18,19,20,21,23,24,25,26,28],
        [1,5,6,23,24,28],
        [1,2,3,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,26,27,28],
        [1,2,3,5,6,8,9,11,12,13,14,15,16,17,18,20,21,23,24,26,27,28],
        [1,8,9,14,15,20,21,28], # 30
        [1,3,4,5,6,7,8,9,10,11,12,14,15,17,18,19,20,21,22,23,24,25,26,28],
        [1,3,4,5,6,7,8,9,10,11,12,14,15,17,18,19,20,21,22,23,24,25,26,28],
        [1,28],
        [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],            

      ]

    #builds the boxes
    bx=0
    by=-16
    for row in boundaries:
        #y co ordinate
        by=by+16    
        for n in row:
            #x co ordinate
            n=n-1
            bx=n*16
            box = boxcollisions(bx, by)
            box.draw(screen)


    #moves pacman
    sprite.movement()
    sprite.draw(screen)

    #tests for collision
    print(pygame.sprite.collide_rect(sprite, box))



    pygame.display.flip()
    clock.tick(60)
1
cdd 19 Agustus 2017, 17:42

2 jawaban

Jawaban Terbaik

1 - Anda perlu memperbarui posisi atas dan kiri pada metode gerakan. Lihat:

# move pacman 
def movement(self):
    pressed= pygame.key.get_pressed()
    if pressed[pygame.K_UP]:
        self.y -= 2
    if pressed[pygame.K_DOWN]:
        self.y += 2
    if pressed[pygame.K_LEFT]:
        self.x -= 2
    if pressed[pygame.K_RIGHT]:
        self.x += 2
    self.rect.left = self.x
    self.rect.top = self.y

2 - Anda harus memverifikasi tabrakan ke dalam lingkaran, untuk verifikasi dengan semua kotak

for row in boundaries:
    #y co ordinate
    by=by+16    
    for n in row:
        #x co ordinate
        n=n-1
        bx=n*16
        box = boxcollisions(bx, by)
        box_list.append(box)
        box.draw(screen)
        if pygame.sprite.collide_rect(sprite, box):
            print("collided")
2
Luis Gustavo Araujo 19 Agustus 2017, 15:58

Gunakan rect.collidelist untuk menguji apakah pacman bertabrakan dengan sprite dinding di daftar sprite dinding Anda. Ini akan mengembalikan -1 selama tidak ada tabrakan yang terdeteksi

0
Axel Villalonga 19 Agustus 2017, 14:48