Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pygame中循环移动对象_Python_Pygame - Fatal编程技术网

Python 在pygame中循环移动对象

Python 在pygame中循环移动对象,python,pygame,Python,Pygame,正如你在这张照片上看到的 这是我控制的矩形(红色)和我不控制的绿色。我希望这些绿色矩形不断地从左向右移动(每秒钟一个都朝相反的方向移动)。我试着这么做,但我只让他们走到一边,然后他们停了下来。我不知道如何让他们回到另一边,然后不断地这样做。下面是我的if语句结束后的图片 import pygame pygame.init() win = pygame.display.set_mode((1200, 600)) clock = pygame.time.Clock() BLACK = (0, 0

正如你在这张照片上看到的

这是我控制的矩形(红色)和我不控制的绿色。我希望这些绿色矩形不断地从左向右移动(每秒钟一个都朝相反的方向移动)。我试着这么做,但我只让他们走到一边,然后他们停了下来。我不知道如何让他们回到另一边,然后不断地这样做。下面是我的
if
语句结束后的图片

import pygame


pygame.init()
win = pygame.display.set_mode((1200, 600))
clock = pygame.time.Clock()
BLACK = (0, 0, 0)
WHITE = (255,255,255)
RED = (255, 0, 0)
GREEN = (13, 255, 0)

player = pygame.Rect(40, 45, 30, 30)
vel = 4


walls = [
pygame.Rect(0, 0, 1200, 20), pygame.Rect(0, 0, 20, 600),
pygame.Rect(0, 580, 1200, 20), pygame.Rect(1180, 0, 20, 600),
pygame.Rect(300, 0, 20, 530), pygame.Rect(20, 100, 230, 20),
pygame.Rect(70, 200, 230, 20), pygame.Rect(20, 300, 230, 20),
pygame.Rect(70, 400, 230, 20), pygame.Rect(600, 100, 20, 500),
]

movingobjectsleft = [
pygame.Rect(320, 120, 30, 30),
pygame.Rect(320, 240, 30, 30),
pygame.Rect(320, 360, 30, 30),
]

movingobjectsright = [
pygame.Rect(570, 180, 30, 30),
pygame.Rect(570, 300, 30, 30),
pygame.Rect(570, 420, 30, 30)
]

run = True
while run:
# Handle the events.
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        run = False

keys = pygame.key.get_pressed()

# Update the player coordinates.
if keys[pygame.K_LEFT] and player.x > 0:
    player.x -= vel
if keys[pygame.K_RIGHT] and player.x < 1200 - player.width:
    player.x += vel
if keys[pygame.K_UP] and player.y > 0:
    player.y -= vel
if keys[pygame.K_DOWN] and player.y < 600 - player.height:
    player.y += vel

# Game logic for walls and moving objects
for wall in walls:
    # Check if the player rect collides with a wall rect.
    if player.colliderect(wall):
        print("Game over")

for object in movingobjectsleft:
    if player.colliderect(object):
        print("Game over")
    if object.x < 570:
        object.x += vel


for object in movingobjectsright:
    if player.colliderect(object):
        print("Game over")
    if object.x > 320:
        object.x -= vel

# Draw everything.
win.fill(WHITE)
pygame.draw.rect(win, RED, player)
# Drawing walls and moving objects
for wall in walls:
    pygame.draw.rect(win, BLACK, wall)

for object in movingobjectsright:
    pygame.draw.rect(win, GREEN, object)

for object in movingobjectsleft:
    pygame.draw.rect(win, GREEN, object)

pygame.display.update()
clock.tick(60)

pygame.quit()

导入pygame
pygame.init()
win=pygame.display.set_模式((1200600))
clock=pygame.time.clock()
黑色=(0,0,0)
白色=(255255)
红色=(255,0,0)
绿色=(13255,0)
player=pygame.Rect(40,45,30,30)
水平=4
墙=[
pygame.Rect(0,0,1200,20),pygame.Rect(0,0,20600),
pygame.Rect(0580120020),pygame.Rect(118060600),
pygame.Rect(300,0,20530),pygame.Rect(20100230,20),
pygame.Rect(70200230,20),pygame.Rect(2030230,20),
pygame.Rect(7040023020),pygame.Rect(60010020500),
]
movingobjectsleft=[
pygame.Rect(320、120、30、30),
pygame.Rect(320、240、30、30),
pygame.Rect(320,360,30,30),
]
移动对象右=[
pygame.Rect(570180,30,30),
pygame.Rect(5703030),
pygame.Rect(570420,30,30)
]
运行=真
运行时:
#处理事件。
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
#更新玩家坐标。
如果键[pygame.K_LEFT]和player.x>0:
player.x-=vel
如果键[pygame.K_RIGHT]和player.x<1200-player.width:
player.x+=vel
如果键[pygame.K_UP]和player.y>0:
player.y-=vel
如果键[pygame.K_DOWN]和player.y<600-player.height:
player.y+=vel
#墙和移动物体的博弈逻辑
对于墙中墙:
#检查玩家矩形是否与墙矩形碰撞。
如果player.collide rect(墙):
打印(“游戏结束”)
对于movingobjectsleft中的对象:
如果player.collide rect(对象):
打印(“游戏结束”)
如果object.x<570:
object.x+=vel
对于移动对象右侧中的对象:
如果player.collide rect(对象):
打印(“游戏结束”)
如果object.x>320:
object.x-=vel
#画所有的东西。
win.fill(白色)
pygame.draw.rect(赢,红,玩家)
#绘制墙和移动对象
对于墙中墙:
pygame.draw.rect(赢、黑、墙)
对于移动对象右侧中的对象:
pygame.draw.rect(赢、绿、对象)
对于movingobjectsleft中的对象:
pygame.draw.rect(赢、绿、对象)
pygame.display.update()
时钟滴答(60)
pygame.quit()
我认为这里需要做点什么

for object in movingobjectsleft:
    if player.colliderect(object):
        print("Game over")
    if object.x < 570:
        object.x += vel


for object in movingobjectsright:
    if player.colliderect(object):
        print("Game over")
    if object.x > 320:
        object.x -= vel
移动对象中的对象的
:
如果player.collide rect(对象):
打印(“游戏结束”)
如果object.x<570:
object.x+=vel
对于移动对象右侧中的对象:
如果player.collide rect(对象):
打印(“游戏结束”)
如果object.x>320:
object.x-=vel

您可以创建一个
pygame.Rect
子类,该子类具有一个附加的
vel
属性和一个
update
方法,在该方法中,您可以移动Rect并执行边界检查(或创建一个具有
Rect
vel
属性的类):

如果您需要计时器,请查看以下答案:


如果您还不知道类是如何工作的,那么可以定义一个布尔标志(
invert_direction
),并在其中一个矩形离开指定区域时将其设置为
True
。如果
for
循环后的
True
,则反转
vel_left
/
vel_right
变量

vel_left = 4
vel_right = -4

run = True
while run:
    # Handle the events.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

    # Update the player coordinates.
    if keys[pygame.K_LEFT] and player.left > 0:
        player.x -= vel
    if keys[pygame.K_RIGHT] and player.right < 1200:
        player.x += vel
    if keys[pygame.K_UP] and player.top > 0:
        player.y -= vel
    if keys[pygame.K_DOWN] and player.bottom < 600:
        player.y += vel

    # Game logic for walls and moving objects
    for wall in walls:
        # Check if the player rect collides with a wall rect.
        if player.colliderect(wall):
            print("Game over")

    # Set this variable to True if the direction should be inverted.
    invert_left = False
    for object in movingobjectsleft:
        if player.colliderect(object):
            print("Game over")

        object.x += vel_left  # Move the object.

        # Check if the object has left the area.
        if object.right > 600 or object.left < 320:
            # Invert the direction after the loop.
            invert_left = True

    if invert_left:  # Invert the direction.
        vel_left = -vel_left

    # Now do the same for the right objects.
    invert_right = False
    for object in movingobjectsright:
        if player.colliderect(object):
            print("Game over")

        object.x += vel_right

        if object.right > 600 or object.left < 320:
            invert_right = True

    if invert_right:
        vel_right = -vel_right
vel_left=4
右电平=-4
运行=真
运行时:
#处理事件。
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
#更新玩家坐标。
如果键[pygame.K_LEFT]和player.LEFT>0:
player.x-=vel
如果键[pygame.K_RIGHT]和player.RIGHT<1200:
player.x+=vel
如果键[pygame.K_UP]和player.top>0:
player.y-=vel
如果键[pygame.K_DOWN]和player.bottom<600:
player.y+=vel
#墙和移动物体的博弈逻辑
对于墙中墙:
#检查玩家矩形是否与墙矩形碰撞。
如果player.collide rect(墙):
打印(“游戏结束”)
#如果方向应反转,则将此变量设置为True。
反转左=假
对于movingobjectsleft中的对象:
如果player.collide rect(对象):
打印(“游戏结束”)
object.x+=vel_left#移动对象。
#检查对象是否已离开该区域。
如果object.right>600或object.left<320:
#反转循环后的方向。
反转左=真
如果向左反转:#反转方向。
左水平=-左水平
#现在对正确的对象执行相同的操作。
反转右=假
对于移动对象右侧中的对象:
如果player.collide rect(对象):
打印(“游戏结束”)
object.x+=vel_right
如果object.right>600或object.left<320:
反转右=真
如果向右反转:
右水平=-右水平

旁注:最好不要为变量使用内置名称,如
object
。如果您想学习如何使用类和pygame精灵,请查看(第12章和第13章)。再次感谢您的帮助。我已经阅读了关于类的章节,现在事情更清楚了,但我仍然对您编写的代码有一些疑问。我不明白‘super()。uu init_uuu(x,y,w,h)’做什么。如果我使用特殊的速度来移动矩形,为什么在矩形类中需要
self.vel=vel
。vel仅用于我控制的矩形,或者?当您创建实例时,会自动调用类的
\uuuu init\uuu
方法。在
MovingRect
类中,必须调用
\uuuu init\uuuufor movingrect in movingrects:
    movingrect.update()  # Movement and bounds checking.
    if player.colliderect(movingrect):
        print("Game over")

# Draw everything.
# ...
for movingrect in movingrects:
    pygame.draw.rect(win, GREEN, movingrect)
vel_left = 4
vel_right = -4

run = True
while run:
    # Handle the events.
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

    # Update the player coordinates.
    if keys[pygame.K_LEFT] and player.left > 0:
        player.x -= vel
    if keys[pygame.K_RIGHT] and player.right < 1200:
        player.x += vel
    if keys[pygame.K_UP] and player.top > 0:
        player.y -= vel
    if keys[pygame.K_DOWN] and player.bottom < 600:
        player.y += vel

    # Game logic for walls and moving objects
    for wall in walls:
        # Check if the player rect collides with a wall rect.
        if player.colliderect(wall):
            print("Game over")

    # Set this variable to True if the direction should be inverted.
    invert_left = False
    for object in movingobjectsleft:
        if player.colliderect(object):
            print("Game over")

        object.x += vel_left  # Move the object.

        # Check if the object has left the area.
        if object.right > 600 or object.left < 320:
            # Invert the direction after the loop.
            invert_left = True

    if invert_left:  # Invert the direction.
        vel_left = -vel_left

    # Now do the same for the right objects.
    invert_right = False
    for object in movingobjectsright:
        if player.colliderect(object):
            print("Game over")

        object.x += vel_right

        if object.right > 600 or object.left < 320:
            invert_right = True

    if invert_right:
        vel_right = -vel_right