与墙壁的碰撞不会阻止物体的速度



我正在玩一个游戏,在这个游戏中,每当玩家的x是>=屏幕宽度时,我希望玩家的x速度=0。但当我尝试时,它没有起作用。冲突代码对我来说很好,我认为调用player.collision()时出现了一些问题。

PS。当对象x为<=时,对象的速度等于00,但当x>=displayW时,速度不等于0。

问题在#collision to walls

PYTHON

# IMPORTS
import pygame, random;
# GLOBALS
global screen, displayW, displayH;
global clock, FPS;
global end, food, player;
# SETGLOBALVALUES
def setGlobalValues():
global screen, displayW, displayH;
global clock, FPS;
global end, food, player;
displayW = 800;
displayH = 600;
screen = pygame.display.set_mode((displayW, displayH));
clock = pygame.time.Clock();
FPS = 60;
end = False;
food = Food();
player = Player();
# MAIN
def main():
pygame.init();
setGlobalValues();
setup();
gameLoop();
quitGame();
# GAMELOOP
def gameLoop():
global end, player;
while(not end):
for event in pygame.event.get():
# ONCLICK QUIT
if(event.type == pygame.QUIT):
end = True;
# KEYDOWN
if(event.type == pygame.KEYDOWN):
if(event.key == pygame.K_LEFT):
player.velX -= 1;
if(event.key == pygame.K_RIGHT):
player.velX += 1;
# KEYUP
if(event.type == pygame.KEYUP):
if(event.key == pygame.K_LEFT):
player.velX = 0;
if(event.key == pygame.K_RIGHT):
player.velX = 0;
draw();
animate();
collision();

# DRAW
def draw():
global screen, food, player;
# fill background
screen.fill((255, 255, 255));
player.draw();
# update
pygame.display.update();
# ANIMATE
def animate():
global food, player;
food.animate();
player.animate();
# COLLISION
def collision():
player.collision();
# CLASSES
class Food():
def __init__(self, x=0, y=0, w=0, h=0, velY=0, color=()):
global displayW;
self.x = random.randrange(0, displayW);
self.y = -100;
self.w = 20;
self.h = 20;
self.velY = 0.7;
self.color = (255, 0, 0);
def draw(self):
global screen;
pygame.draw.rect(screen, self.color, (self.x, self.y, self.w, self.h));
def animate(self):
self.y += self.velY;
def collision(self):
global displayW, displayH;
pass;
class Player():
def __init__(self, x=0, y=0, velX=0, velY=0, w=0, h=0, color=()):
global displayW, displayH;
self.w = 20;
self.h = 20;
self.x = displayW / 2 - self.w / 2;
self.y = displayH - 100;
self.velX = 0;
self.velY = 0;
self.color = (0, 0, 0);
def draw(self):
global screen;
pygame.draw.ellipse(screen, self.color, (self.x, self.y, self.w, self.h));
def animate(self):
self.x += self.velX;
self.y += self.velY;
def collision(self):
global displayW;
# collision to walls
if(self.x <= 0):
self.velX = 0;
elif(self.x >= displayW):
self.velX = 0;

# SETUP
def setup():
pygame.display.set_caption("Food Catcher");
# QUIT GAME
def quitGame():
pygame.quit();
quit();
# CALL MAIN
if(__name__ == "__main__"):
main();

逻辑是正确的,但它允许玩家在两侧慢慢"睡眠"。你之所以认为它在左侧工作,而玩家在右侧消失,是因为你确实将屏幕的宽度与玩家的角坐标进行了比较。当它为零时,玩家在屏幕上。但是当player.x==屏幕宽度时,玩家已经被拉出屏幕。

将您的条件更改为:

elif(self.x  + self.h) >= displayW:

逻辑是正确的-但你没有延迟,这意味着你的gte更新速度与你的计算机重新绘制屏幕的速度一样快-而且,新poision(player.animate)的计算发生在你因按键而更新速度(velX)之后,之前,你检查是否存在冲突,并将速度降低到0。

因此,玩家的速度实际上没有变化,即使碰撞检测将其降至零——在下一帧,连续按键将再次增加速度。我只是不知道为什么它不在左手边也消失。

无论如何,只要将调用更改为"碰撞",即可在调用动画之前进行。

更多pygame提示:在while循环中包含数十微秒的延迟。这样,游戏就不会占用你100%的CPU。只需呼叫pygame.time.delay(20)就可以了。此外,你会注意到一次移动1或2倍可能会很慢,所以,以5或10倍的倍数调整你的速度。

关于"碰撞"方法。不仅要改变速度,还要改变位置,让玩家出现在屏幕上。

更多Python提示:与其他语言不同,Python不是C-sytax的直接修改:不需要在每行使用;,也不需要在if表达式周围使用( )(它们无论如何都由:分隔)。此外,如果您只使用全局变量进行读取,或调用存储在全局变量中的对象中的方法,则无需声明它——事实上,您不需要这些global声明,而是需要setGlobalValues函数。

最新更新