如何在pygame中让精灵在窗口边缘反弹

1 投票
2 回答
4264 浏览
提问于 2025-04-18 03:46

到目前为止,我的程序已经可以让物体在左右之间弹跳了,但现在我想让它在墙壁上也能弹跳。该怎么做呢?

delta = 5
u = 1 # x coordinate

u += delta
if u >= 440: #480 is the window size, I have it stopping at 440
   delta = -5 #Go back by 5
elif u < 0:
   delta = 5 #Go up by 5

这是更大一段代码,它包含了解决方案,但这个小鸟的图像会跑出屏幕外。要运行这段代码,确保你有一张叫做“bird.png”的图片,或者你可以换成其他的图片:

import pygame
import random

class mySprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bird.png")
        self.rect = self.image.get_rect()
##        slef.rect(50,50,self.image.get_width(), self.image.get_height())

    def update(self,x,y):
        self.rect.x = x
        self.rect.y = y

class newSprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("ball.png")
        self.rect = self.image.get_rect()

    def update(self,x,y):
        self.rect.x = x
        self.rect.y = y

class otherSprite(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bird.png")
        self.rect = self.image.get_rect()

    def update(self,x,y):
        self.rect.x = x
        self.rect.y = y

def main():
    """ Set up the game and run the main game loop """
    pygame.init() # prepare the pygame module for use
    surfaceSz = 480 # Desired physical surface size, in pixels.
    # Create surface of (width, height), and its window.
    main_surface = pygame.display.set_mode((surfaceSz, surfaceSz))

    small_rect = (300, 200, 150, 90)
    some_color = (255,0,0)
    main_surface.fill((0,200,255))

    s = mySprite()
    all_sprites = pygame.sprite.Group()

    s.add(all_sprites)

    delta_x = 5
    delta_y = 5
    u = 1 # x coord
    v = 1 # y coord

    clock = pygame.time.Clock()
    while True:
        ev = pygame.event.poll() # look for any event
        if ev.type == pygame.QUIT: # window close button clicked?
            break # ... leave game loop

        main_surface.fill((0,200,255))

        #u += delta
        #if u >= 440:
        #    delta = -5
        #elif u < 0:
        #    delta = 5

        u += delta_x
        v += delta_y
        if (v >=440): #assuming your y axis is 440 pixels
            delta_y = -5
        elif v<=0 :
            delta_y = 5

        if u >= 440: #440 pixels u have
            delta = -5
        elif u < 0:
            delta = 5 #Go up by 5


        all_sprites.update(u,50)
        pos =(random.randint(0, surfaceSz), random.randint(0, surfaceSz))
        all_sprites.draw(main_surface)

        # Now the surface is ready, tell pygame to display it!
        pygame.display.flip()
        clock.tick(60)

    pygame.quit() # once we leave the loop, close the window.

main()

2 个回答

1

也要设置一个y坐标

delta_y = 5
delta_x = 5
u = 1 # the x coordinate
v = 1 # the y coordinate

u +=delta_x    
v +=delta_y

if (v >=300): #assuming your y axis is 300 pixels 
    delta_y = -5
elif v<=0 :
    delta_y = 5

if u >= 440: #440 pixels u have
    delta_x = -5 
elif u < 0:
    delta_x = 5 #Go up by 5
1

这里有一只会动的鸟/球,它在墙壁上反弹。首先,你只需要一种类型的类来表示这些小精灵(sprite),然后用不同的图片创建不同的实例。希望这对你有帮助。

import sys, pygame, random

SIZE = width, height = 640, 480
SPEED = [2, 2]
black = 0, 0, 0

class mySprite(pygame.sprite.Sprite):
    def __init__(self, image="ball.bmp", speed=[2,2]):

        pygame.sprite.Sprite.__init__(self)
        self.speed = speed
        self.image = pygame.image.load(image)
        self.rect = self.image.get_rect()

    def update(self):
        global SIZE
        #i used 110 px because it's the size of the image, but it's better to use the rect property of the pygame
        if (self.rect.x <0) or (self.rect.x > 640-110):
            self.speed[0] *= -1
        if (self.rect.y<0) or (self.rect.y > 480-110):
            self.speed[1] *= -1

        self.rect.x =self.rect.x + self.speed[0]
        self.rect.y =self.rect.y + self.speed[1]

#OR:        self.rect = self.rect.move(self.speed)

    def draw(self, screen):
        screen.blit(self.image, self.rect)


#    
pygame.init()
screen = pygame.display.set_mode(SIZE)

iaka = mySprite()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    screen.fill(black)
    iaka.draw(screen)
    iaka.update()
    pygame.display.flip()

撰写回答