【问题标题】:How to Make a Collision with Two Sprites in Pygame? How to Continue Sprite Loops?如何在 Pygame 中与两个精灵发生碰撞?如何继续 Sprite 循环?
【发布时间】:2018-12-09 03:59:54
【问题描述】:

我在尝试与我在 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()

我还有另一个问题,我的一些小叉子不会循环。我不太确定为什么会这样。任何帮助表示赞赏。

【问题讨论】:

  • 欢迎来到 Stack Overflow,请分享minimal reproducible example,以便其他人可以运行您的代码并帮助您解决问题。在您的代码中,没有 makeSprite 函数的定义。也许this question 会帮助你。使用sprite groups 将使您更轻松地处理冲突和更新。

标签: loops pygame collision


【解决方案1】:

这不是一个完整的答案,但是使用一些基本类,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

能够循环访问依次调用相同函数的对象列表可以节省大量输入。在代码中只进行一次边界检查之类的东西也可以节省错误检查,因为检查是在一个地方进行的。

其他游戏对象也基本相同。它们都共享屏幕位置边界的规则,都有一个精灵,等等。这个单一的类可以处理所有对象,还有一些额外的移动规则。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2015-04-13
    • 2023-03-05
    • 2023-03-25
    • 2021-08-29
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多