如何解决如何在Pygame的屏幕内区域上添加边界
我一直在尝试创建游戏屏幕,但似乎无法在屏幕上的房屋周围添加边界,以使玩家不会越过房屋。下面是我的代码
import pygame
import sys
from pygame import mixer
pygame.init()
playerImg = pygame.image.load('player.png')
WalkFront = [pygame.image.load('B1.png'),pygame.image.load('B2.png'),pygame.image.load('B3.png'),pygame.image.load('B4.png')]
WalkBack = [pygame.image.load('F1.png'),pygame.image.load('F2.png'),pygame.image.load('F3.png'),pygame.image.load('F4.png')]
WalkRight = [pygame.image.load('R1.png'),pygame.image.load('R2.png'),pygame.image.load('R3.png'),pygame.image.load('R4.png')]
WalkLeft = [pygame.image.load('L1.png'),pygame.image.load('L2.png'),pygame.image.load('L3.png'),pygame.image.load('L4.png')]
walkcount = 0
clock = pygame.time.Clock()
scr = pygame.display.set_mode((800,600))
pygame.display.set_caption('Pokemon: Red')
logo = pygame.image.load('logo.png')
pygame.display.set_icon(logo)
background = pygame.image.load('BG.png')
pallet = pygame.image.load('pallet town.png')
mixer.music.load('Start menu.mp3')
mixer.music.play(100,0)
playerX = 200
playerY = 200
up = False
down = False
left = False
right = False
def redrawgamewindow():
global walkcount
scr.fill((0,0))
scr.blit(pallet,(60,0))
if walkcount + 1 >= 29:
walkcount = 0
if up:
scr.blit(WalkFront[walkcount // 7],(playerX,playerY))
walkcount += 1
elif down:
scr.blit(WalkBack[walkcount // 7],playerY))
walkcount += 1
elif left:
scr.blit(WalkLeft[walkcount // 7],playerY))
walkcount += 1
elif right:
scr.blit(WalkRight[walkcount // 7],playerY))
walkcount += 1
else:
player(playerX,playerY)
pygame.display.update()
def player(x,y):
scr.blit(playerImg,(x,y))
def start_menu():
while True:
scr.fill((255,255,255))
scr.blit(background,(0,0))
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
game()
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
pygame.display.update()
def game():
global playerX
global playerY
clock.tick(12)
mixer.music.pause()
mixer.music.load('pallet_music.mp3')
mixer.music.play(100)
playerX_change = 0
playerY_change = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
global up
global down
global left
global right
up = True
down = False
playerY_change = -0.8
elif event.key == pygame.K_DOWN:
up = False
down = True
playerY_change = 0.8
else:
up = False
down = False
walkcount = 0
if event.key == pygame.K_LEFT:
playerX_change = -1
left = True
right = False
elif event.key == pygame.K_RIGHT:
playerX_change = 1
right = True
left = False
else:
left = False
right = False
walkcount = 0
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
playerY_change = 0
up = False
down = False
left = False
right = False
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
up = False
down = False
left = False
right = False
playerX += playerX_change
playerY += playerY_change
if playerX <= 90:
playerX = 90
elif playerX >= 670:
playerX = 670
if playerY <= 40:
playerY = 40
elif playerY >= 540:
playerY = 540
redrawgamewindow()
start_menu()
背景图片上有一个区域,左上方有一个房子。请参阅下面的背景图片,以便您有更好的主意。我想要的是让玩家无法在房屋上行走,因此他被边缘挡住了。
解决方法
我建议为房屋定义一个矩形区域。使用pygame.Rect
。您必须找到hx
,hy
,hw
和hh
的值:
house_rect = pygame.Rect(hx,hy,hw,hh)
在更改播放器位置后为播放器创建一个矩形。矩形的大小可以从pygame.Surface
代表玩家的get_rect()
对象中获取。该位置必须由关键字参数(topleft = (playerX,playerY)
)设置。
使用pygame.Rect.colliderect
来评估玩家是否与房屋相撞并将玩家的位置限制在房屋以外的区域:
playerX += playerX_change
player_rect = playerImg.get_rect(topleft = (playerX,playerY))
if player_rect.colliderect(house_rect):
if playerX_change > 0:
player_rect.right = house_rect.left
elif playerX_change < 0:
player_rect.left = house_rect.right
playerX = player_rect.x
playerY += playerY_change
player_rect = playerImg.get_rect(topleft = (playerX,playerY))
if player_rect.colliderect(house_rect):
if playerY_change < 0:
player_rect.top = house_rect.bottom
elif playerY_change > 0:
player_rect.bottom = house_rect.top
playerY = player_rect.y
,
我想您必须耐心地像这样用x和y来划分边界:
if x > boundaryX and y > boundaryY:
xOfThePlayer -= moving
这是一个示例,您必须根据需要进行更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。