为什么在执行滚动时,“如果触摸墙向后移动5,则移动5”逻辑不起作用?

2024-09-22 16:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这种墙检测逻辑在大多数游戏中都能很好地工作,但我想要更多的比萨饼。所以,我实现了滚动,玩家总是在中间,而背景移动。p>

keys=pygame.key.get_pressed()
if keys[pygame.K_w]:
    y-=5
    if rect.colliderect(wall):
        y+=5

我的滚动工作方式是相对于变量scrollxscrolly绘制所有对象。按下键时,scrollxscrolly会发生变化。然而,当碰撞实际发生时,玩家似乎被物体卡住了。这是完整的代码

import pygame
import random
pygame.init()
win_height=600
win_width=600
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("YourCraft")
white=(255,255,255)
black=(0,0,0)
green=(0,255,0)
clock=pygame.time.Clock()
debris_list=[]

player=pygame.Rect(win_width/2,win_height/2,20,20)
scrolly=0
scrollx=0

size=1000
speed=5

class debris_class():
    def __init__(self):
        self.x=random.randrange(0,size-20)
        self.y=random.randrange(0,size-20)
        self.rect=pygame.Rect(self.x,self.y,20,20)
    def update(self):
        pygame.draw.rect(win,white,self.rect)
        self.rect.y=scrolly+self.y
        self.rect.x=scrollx+self.x

for i in range(10):
    debris=debris_class()
    debris_list.append(debris)

def collision():
    for i in debris_list:
        if i.rect.colliderect(player):
            return 1
    return 0

while True:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()

    key=pygame.key.get_pressed()
    if key[pygame.K_s]:
        scrolly-=speed
        collide=collision()
        if collide==1:
            scrolly+=speed

    if key[pygame.K_w]:
        scrolly+=speed
        collide=collision()
        if collide==1:
            scrolly-=speed

    if key[pygame.K_d]:
        scrollx-=speed
        collide=collision()
        if collide==1:
            scrollx+=speed

    if key[pygame.K_a]:
        scrollx+=speed
        collide=collision()
        if collide==1:
            scrollx-=speed


    win.fill(black)
    pygame.draw.rect(win,green,(scrollx,scrolly,size,size)) #background
    pygame.draw.rect(win,white,player)

    for i in debris_list:
        i.update()

    pygame.display.update()

Tags: keyrectselfforsizeifpygamewin
1条回答
网友
1楼 · 发布于 2024-09-22 16:26:39

您执行碰撞测试太早了。运行碰撞测试时,对象和贴图尚未滚动

在类debris_class中分隔updatedraw

class debris_class():
    def __init__(self):
        self.x=random.randrange(0,size-20)
        self.y=random.randrange(0,size-20)
        self.rect=pygame.Rect(self.x,self.y,20,20)
    def update(self):
        self.rect.y=scrolly+self.y
        self.rect.x=scrollx+self.x
    def draw(self):
        pygame.draw.rect(win,white,self.rect)

根据按下的键和速度获得移动:

key=pygame.key.get_pressed()
move_x = (key[pygame.K_d] - key[pygame.K_a]) * speed
move_y = (key[pygame.K_s] - key[pygame.K_w]) * speed

复制plyer并移动播放机:

player_copy = player.copy()
player.x += move_x
player.y += move_y

执行碰撞测试并撤消播放机的移动:

collide = collision()
player = player_copy

如果未检测到碰撞,请滚动地图和对象:

if collide == 0:
    scrollx -= move_x
    scrolly -= move_y
    for i in debris_list:
        i.update()     

在循环中绘制对象:

for i in debris_list:
    i.draw()

完整代码:

import pygame
import random

pygame.init()
win_height=600
win_width=600
win=pygame.display.set_mode((win_width,win_height))
pygame.display.set_caption("YourCraft")
white=(255,255,255)
black=(0,0,0)
green=(0,255,0)
clock=pygame.time.Clock()
debris_list=[]

player=pygame.Rect(win_width/2,win_height/2,20,20)
scrolly=0
scrollx=0

size=1000
speed=5

class debris_class():
    def __init__(self):
        self.x=random.randrange(0,size-20)
        self.y=random.randrange(0,size-20)
        self.rect=pygame.Rect(self.x,self.y,20,20)
    def update(self):
        self.rect.y=scrolly+self.y
        self.rect.x=scrollx+self.x
    def draw(self):
        pygame.draw.rect(win,white,self.rect)

for i in range(10):
    debris=debris_class()
    debris_list.append(debris)

def collision():
    for i in debris_list:
        if i.rect.colliderect(player):
            return 1
    return 0

while True:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()

    key=pygame.key.get_pressed()
    move_x = (key[pygame.K_d] - key[pygame.K_a]) * speed
    move_y = (key[pygame.K_s] - key[pygame.K_w]) * speed
    
    player_copy = player.copy()
    player.x += move_x
    player.y += move_y

    collide = collision()
    player = player_copy
    if collide == 0:
        scrollx -= move_x
        scrolly -= move_y
        for i in debris_list:
            i.update()
           
    win.fill(black)
    pygame.draw.rect(win,green,(scrollx,scrolly,size,size)) #background
    pygame.draw.rect(win,white,player)
    for i in debris_list:
        i.draw()
    pygame.display.update()

相关问题 更多 >