首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Pygame中与两个精灵进行碰撞?如何继续Sprite循环?

如何在Pygame中与两个精灵进行碰撞?如何继续Sprite循环?
EN

Stack Overflow用户
提问于 2018-12-09 11:59:55
回答 1查看 58关注 0票数 0

我在pygame中尝试与精灵发生冲突(以及其他一些问题)时遇到了一点麻烦。我尝试做的是当一个小的分支(精灵被命名为mini1,mini2等)击中土豆,一颗心就会消失。我甚至不知道如何开始碰撞。当我查找它的时候,有提到使用一个类,但我没有学习到这一点,所以我没有使用那个方法。

这就是我到目前为止所知道的:

代码语言:javascript
复制
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()

我还有另一个问题,我的一些小的fork不能循环。我不太确定为什么会发生这种情况。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2018-12-18 13:57:54

这不是一个完整的答案,但是使用一些基本的类,OP的代码会简单得多:

代码语言:javascript
复制
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 )

这在开始的时候需要更多的工作,但是在你的代码中:

代码语言:javascript
复制
# 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

能够依次迭代调用相同函数的对象列表,从而节省了大量的输入。在代码中只有一次边界检查也节省了bug检查,因为检查是在一个地方进行的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53689256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档