使用pygame方形移动图像

1 投票
3 回答
578 浏览
提问于 2025-04-18 11:41

大家好,我一直在尝试用pygame让一个球的图像在屏幕上以方形的方式移动。我试了很多次,但都没有成功。请看我下面的代码。

import time                                              
import pygame, sys
from pygame.locals import *
pygame.init()
clocks = pygame.time.Clock()  
surfaceObject = pygame.display.set_mode((640, 480))  
pygame.display.set_caption('Bounce')   

mousey,mousex = 0,0  
imgx = 10 
imgy = 10 
pixmove = 60
tiger = [2,2]
movement = 'down' 
background = pygame.image.load('bg.jpg').convert()
ball = pygame.image.load('ball.jpg').convert_alpha()
pygame.mixer.music.load('yeah.mp3')
while True: 
  time.sleep(1)                                        
if movement == 'down':                              
    imgx += pixmove                                  
if imgx < 640:                                      
    tiger[0] - tiger[1]                              

elif movement  == 'right':                          
    imgx += pixmove                                  
if imgx < 0:                                      
    movement = 'up'                                  


elif movement == 'up':                              
    imgy -= pixmove                                  
if imgy < 0:                                        
    movement = 'left'                                


elif movement == 'left':                            
    imgx -= pixmove                                  
if imgx < 0:                                        
    movement = 'down'                                


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

surfaceObject.blit(background,(mousex,mousey))      
surfaceObject.blit(ball,(imgx,imgy))                
pygame.mixer.music.play()
pygame.display.update()                              
clocks.tick(50)

当我运行这段代码时,球是直线移动的,而且当球碰到边缘时并不会反弹回来。

我的目标是让这个球在屏幕上以方形的方式旋转。我尝试过改变pixmove这个变量,但这并没有解决我的问题。

希望大家能帮帮我,谢谢!

3 个回答

0

你真的需要好好调整一下你的代码缩进,因为不规范的缩进会让你的代码变得非常难以理解。

如果你想让某个东西,比如一个圆形,按照方形的方式移动,那其实是很简单的:

import pygame, sys
from pygame.locals import *
pygame.init()

DISPLAYSURF = pygame.display.set_mode((1200, 600))

x, y = (100, 100)
dir = 'right'

while True:
        for event in pygame.event.get():
                if event.type == QUIT:
                        pygame.quit()
                        sys.exit()
        DISPLAYSURF.fill((0, 0, 0))
        pygame.draw.circle(DISPLAYSURF, (255, 255, 255), (x, y), 10)
        if dir == 'right':
                x+=14
                if x >= 1100:
                        dir = 'down'
        elif dir == 'down':
                y+=14
                if y >= 500:
                        dir = 'left'
        elif dir == 'left':
                x-=14
                if x <= 100:
                        dir = 'up'
        elif dir == 'up':
                y-=14
                if y <= 100:
                        dir = 'right'
        pygame.display.flip()

在这里输入图片描述

0

因为我们已经确定你想要的是让球在边缘反弹,所以请看这里: 为什么球没有反弹?

简单来说,你需要做的是记录球的运动方向(也就是它上下和左右的移动),当球碰到墙壁时,就要改变这些方向。

0

你的代码缩进完全乱了,所以我看不出发生了什么。

不过,让图像在一个方形区域内移动其实很简单。只需要创建一个 Rect(矩形),让物体在这个矩形里移动,一旦物体离开了这个 Rect,就改变它的移动方向。

看看下面这个例子:

import pygame
from itertools import cycle

pygame.init() 

screen = pygame.display.set_mode((300, 300)) 
# move inside the screen (or any other Rect)
s_r = screen.get_rect()
player = pygame.Rect((100, 100, 50, 50))
timer = pygame.time.Clock()

speed = 5
up, down, left, right = (0, -speed), (0, speed), (-speed, 0), (speed, 0)
dirs = cycle([up, right, down, left])
dir = next(dirs)

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            raise

    # move player
    player.move_ip(dir)
    # if it's outside the screen
    if not s_r.contains(player):
        # put it back inside
        player.clamp_ip(s_r)
        # and switch to next direction
        dir = next(dirs)

    screen.fill(pygame.color.Color('Black'))
    pygame.draw.rect(screen, pygame.color.Color('Grey'), player)

    pygame.display.flip()
    timer.tick(25)

在这里输入图片描述

撰写回答