如何在Pygame中与两个精灵发生碰撞?如何继续精灵循环



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

我还有一个问题,我的一些小叉子无法循环。我不太清楚为什么会发生这种情况。感谢您的帮助。

这不是一个完整的答案,但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

能够遍历调用同一函数的对象列表,从而节省了大量的键入。在代码中只进行一次边界检查也可以节省错误检查,因为检查是在一个地方进行的。

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

最新更新