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\uuuu
for 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