Как сделать столкновение с двумя спрайтами в Pygame?Как продолжить циклы спрайтов? - PullRequest
0 голосов
/ 09 декабря 2018

У меня возникли проблемы с попыткой столкновения (и нескольких других проблем) с моими спрайтами в Pygame.То, что я пытаюсь сделать, это когда маленькая вилка (спрайты с именами mini1, mini2 и т. Д.) Попадает в картофель, сердце должно исчезнуть.Я даже не уверен, как начать столкновение.Когда я искал его, было упоминание об использовании класса, но я не узнал об этом, поэтому я не использовал этот метод.

Это то, что я имею до сих пор:

import pygame, sys
from pygame_functions import * 

pygame.mixer.pre_init(44100,16,2,4096)
pygame.init()

width = 1200
height = 750
screen = pygame.display.set_mode((480, 320))
pygame.display.set_caption('Space Potato')
screenSize(width, height)                            
setBackgroundImage("space.bmp")              
pygame.mixer.music.load("bgmusic.wav")

pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.play(-1)

door = makeSprite("door.png")
moveSprite(door, 570, 30)
showSprite(door)

potato = makeSprite("potato.bmp") 
moveSprite(potato, 550, 650)                    
showSprite(potato)

mini1 = makeSprite("minifork.bmp")
showSprite(mini1)
mini1x = 590
mini1y = 150

mini2 = makeSprite("minifork.bmp")
showSprite(mini2)
mini2x = 590
mini2y = 150

mini3 = makeSprite("minifork.bmp")
showSprite(mini3)
mini3x = 590
mini3y = 150

mini4 = makeSprite("minifork.bmp")
showSprite(mini4)
mini4x = 590
mini4y = 150

mini5 = makeSprite("minifork.bmp")
showSprite(mini5)
mini5x = 590
mini5y = 150

mini6 = makeSprite("minifork.bmp")
showSprite(mini6)
mini6x = 590
mini6y = 150

mini7 = makeSprite("minifork.bmp")
showSprite(mini7)
mini7x = 590
mini7y = 150

mini8 = makeSprite("minifork.bmp")
showSprite(mini8)
mini8x = 590
mini8y = 150

mini9 = makeSprite("minifork.bmp")
showSprite(mini9)
mini9x = 590
mini9y = 150

mini10 = makeSprite("minifork.bmp")
showSprite(mini10)
mini10x = 590
mini10y = 150

mini11 = makeSprite("minifork.bmp")
showSprite(mini11)
mini11x = 590
mini11y = 150

fork = makeSprite("fork.bmp")
moveSprite(fork, 570, 100)
showSprite(fork)

heart1 = makeSprite("heart.bmp")
moveSprite(heart1, 10, 10)
showSprite(heart1)

heart2 = makeSprite("heart.bmp")
moveSprite(heart2, 60, 10)
showSprite(heart2)

heart3 = makeSprite("heart.bmp")
moveSprite(heart3, 110, 10)
showSprite(heart3)


xPos = 550                                     
yPos = 650 
xSpeed = 0 
ySpeed = 0
moveSprite(potato,xPos, yPos)

while True:
    mini1y += 10
    if mini1y == height - 10:
        mini1y = 150
        mini1x = 590
    moveSprite(mini1, mini1x, mini1y)

    mini2x -= 10
    mini2y += 5
    if mini2y == height - 10:
        mini2y = 150
        mini2x = 590
    moveSprite(mini2, mini2x, mini2y)

    mini3x += 2
    mini3y += 10
    if mini3y == height - 10:
        mini3y = 150
        mini3x = 590
    moveSprite(mini3, mini3x, mini3y)

    mini4x += 15
    mini4y += 2
    if mini4y == height - 10:
        mini4y = 150
        mini4x = 590
    moveSprite(mini4, mini4x, mini4y)

    mini5x -= 5
    mini5y += 10
    if mini5y == height - 10:
        mini5y = 150
        mini5x = 590
    moveSprite(mini5, mini5x, mini5y)

    mini6x -= 10
    mini6y += 7
    if mini6y == height - 10:
        mini6y = 150
        mini6x = 590
    moveSprite(mini6, mini6x, mini6y)

    mini7x += 10
    mini7y -= 2
    if mini7y == height - 10:
        mini7y = 150
        mini7x = 590
    moveSprite(mini7, mini7x, mini7y)

    mini8x -= 5
    mini8y += 10
    if mini8y == height - 10:
        mini8y = 150
        mini8x = 590
    moveSprite(mini8, mini8x, mini8y)

    mini9x += 5
    mini9y -= 10
    if mini9y == height - 10:
        mini9y = 150
        mini9x = 590
    moveSprite(mini9, mini9x, mini9y)

    mini10x -= 10
    mini10y -= 7
    if mini10x == width - 10:
        mini10y = 150
        mini10x = 590
    moveSprite(mini10, mini10x, mini10y)

    mini11x -= 10
    mini11y -= 7
    if mini11x == width - 10:
        mini11y = 150
        mini11x = 590
    moveSprite(mini11, mini11x, mini11y)

    if keyPressed("up"):
        transformSprite(potato, 0, 1)
        yPos -= 7
    elif keyPressed("down"):
        transformSprite(potato, 0, 1)
        yPos += 7
    elif keyPressed("right"):
        transformSprite(potato, 0, 1)
        xPos += 7
    elif keyPressed("left"):
        transformSprite(potato, 0, 1)
        xPos -= 7
    moveSprite(potato, xPos, yPos)

    tick(30)


endWait()

У меня также есть другая проблема, когда некоторые из моих маленьких вилок не зацикливаются.Я не слишком уверен, почему это происходит также.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 18 декабря 2018

Это не полный ответ, но код OP был бы намного проще с некоторыми базовыми классами:

class MetaSprite:
    def __init__( self, filename, _x, _y ):
        self.sprite = makeSprite( filename )
        self.x = _x;
        self.y = _y;

    def moveBy( self, _x, _y ):
        self.x += _x;
        self.y += _y;

        # check out of bounds
        if ( self.x >= WINDOW_WIDTH - 10 ):
            self.x = WINDOW_WIDTH
        elif ( self.x <= 10 ):
            self.x = WINDOW_WIDTH - 10
        if ( self.y >= WINDOW_HEIGHT - 10 ):
            self.y = 10
        elif ( self.y <= 10 ):
            self.y = WINDOW_HEIGHT - 10

    def draw( self ):
        moveSprite( self.sprite, self.x, self.y )

    def collidedWith(self, other_sprite):
        return self.sprite.rect.colliderect( other_sprite.rect )

Что немного больше работы изначально, но потом в вашем коде:

# create the game objects
potato = MetaSprite( "silver_potatoe.bmp", 400, 200 )

fork_count = 10
all_forks = []
for i in range( fork_count ):
    new_fork = MetaSprite( "minifork.bmp", 590, 150 )
    new_fork.draw()
    all_forks.append( new_fork )
...

# move all the forks a little
all_forks[0].moveBy(  1, 2 )
all_forks[1].moveBy( -1, -1 )
all_forks[2].moveBy( -5, 3 )

...

# Did any fork hit the potato?
for i in range( len( all_forks ) ):
    if ( all_forks[i].collidedWith( potato ) ):
        # TODO - handle fork hitting potatoe

Возможность перебирать список объектов, вызывающих одну и ту же функцию, в свою очередь, экономит много времени на печатание.Наличие таких вещей, как проверка границ только один раз в коде, также экономит проверку ошибок, поскольку проверка включена в одном месте.

Другие игровые объекты также в основном одинаковы.Все они разделяют правило на границах положения экрана, у всех есть спрайт и т. Д. Этот единственный класс может почти обрабатывать все объекты с несколькими дополнительными правилами перемещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...