Python Pygame';s collide rect不是';注意不到的碰撞
在此之前,我使用代码说“每个按钮按下它都会移动”,但现在我将其更改为“当你按下按钮时,它会朝一个方向移动,直到进一步的指示”,但现在colliderect不起作用。它以前工作过,我还是新来的Python Pygame';s collide rect不是';注意不到的碰撞,python,python-3.x,pygame,Python,Python 3.x,Pygame,在此之前,我使用代码说“每个按钮按下它都会移动”,但现在我将其更改为“当你按下按钮时,它会朝一个方向移动,直到进一步的指示”,但现在colliderect不起作用。它以前工作过,我还是新来的pygame。我发现了一些类似的问题,但我认为我已经做到了提问者所做的事情。任何帮助都可以接受 import pygame, sys, random from pygame.locals import * from time import sleep pygame.init() def render():
pygame
。我发现了一些类似的问题,但我认为我已经做到了提问者所做的事情。任何帮助都可以接受
import pygame, sys, random
from pygame.locals import *
from time import sleep
pygame.init()
def render():
windowSurface.fill(black)
player = pygame.Rect(225 + xmod,450 - ymod,30,30)
pygame.draw.rect(windowSurface,white,player)
pygame.draw.rect(windowSurface,white,wall_1)
pygame.draw.rect(windowSurface,white,wall_2)
pygame.display.update()
black = (0,0,0)
white = (255,255,255)
windowSurface = pygame.display.set_mode((500, 500),0,32)
windowSurface.fill(black)
xmod = 0
ymod = 0
direction = 'none'
player = pygame.Rect(225 + xmod,450 - ymod,30,30)
wall_1 = pygame.Rect(0,225,250,50)
wall_2 = pygame.Rect(300,250,200,50)
render()
while True:
render()
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_LEFT:
direction = 'left'
if event.key == K_RIGHT:
direction = 'right'
if event.key == K_UP:
direction = 'up'
if event.key == K_DOWN:
direction = 'down'
if event.type == QUIT:
pygame.quit()
sys.exit()
if player.colliderect(wall_1) or player.colliderect(wall_2):
xmod = 0
ymod = 0
player = pygame.Rect(225 + xmod,450 - ymod,30,30)
render()
print('again')
if direction == 'left':
xmod -= 1
sleep(0.004)
if direction == 'right':
xmod += 1
sleep(0.004)
if direction == 'up':
ymod += 1
sleep(0.004)
if direction == 'down':
ymod -= 1
sleep(0.004)
您从不更新全局
player
变量,因此它将保持在其原始坐标。在render
函数中,创建一个新的rect并将其分配给本地player
变量,但它与用于碰撞检测的全局player
不同
我建议为速度speed\ux,speed\uy
添加变量,并将它们添加到player.x
和.y
属性的每一帧中,以直接移动矩形
可以删除render
函数中的本地player
rect
import sys
import pygame
from pygame.locals import *
pygame.init()
def render():
windowSurface.fill(black)
pygame.draw.rect(windowSurface, white, wall_1)
pygame.draw.rect(windowSurface, white, wall_2)
pygame.draw.rect(windowSurface, white, player)
pygame.display.update()
black = (0,0,0)
white = (255,255,255)
windowSurface = pygame.display.set_mode((500, 500),0,32)
clock = pygame.time.Clock() # A clock to limit the frame rate.
player = pygame.Rect(225, 450, 30, 30)
wall_1 = pygame.Rect(0,225,250,50)
wall_2 = pygame.Rect(300,250,200,50)
speed_x = 0
speed_y = 0
while True:
# Handle events.
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_LEFT:
speed_x = -5
speed_y = 0
elif event.key == K_RIGHT:
speed_x = 5
speed_y = 0
elif event.key == K_UP:
speed_y = -5
speed_x = 0
elif event.key == K_DOWN:
speed_y = 5
speed_x = 0
# Add the speed to the x and y attributes to move the rect.
player.x += speed_x
player.y += speed_y
# Game logic.
if player.colliderect(wall_1) or player.colliderect(wall_2):
player = pygame.Rect(225, 450, 30, 30)
print('again')
# Render everything.
render()
clock.tick(60) # Limit the frame rate to 60 FPS.
首先,对不起,我是pygame新手,我不知道如何更新全局玩家变量,而且,我不想要你的keyup函数,因为它应该很难通过墙中的间隙。我的印象是你想要避免自动移动。我已经编辑了答案。谢谢!这很有帮助。