hidegenius 发表于 2021-6-24 16:37:03

pygame地图移动

当地图大小大于窗口时,怎样让地图跟随人物移动显示?

地图和人物的代码如下:
import random , time
import pygame
print(pygame.init())

class 主角(pygame.sprite.Sprite):
    def __init__(self , 背景图 , 位置):
      pygame.sprite.Sprite.__init__(self)
      self.image = pygame.image.load(背景图)
      self.rect = self.image.get_rect()
      self.rect.center = 位置
      self.移动速度 = 3
      self.速度加倍 = 1
      self.停顿标记 = 1
class 怪物(pygame.sprite.Sprite):
    def __init__(self , 背景图 , 位置):
      pygame.sprite.Sprite.__init__(self)
      self.image = pygame.image.load(背景图)
      self.rect = self.image.get_rect()
      self.rect.center = 位置
      self.移动步数 = 0
      self.移动速度 = 5
      self.速度加倍 = 1
      self.停顿标记 = 1
      self.移动方向 =
class 石头(pygame.sprite.Sprite):
    def __init__(self , 背景图 , 位置):
      pygame.sprite.Sprite.__init__(self)
      self.image = pygame.image.load(背景图)
      self.rect = self.image.get_rect()
      self.rect.center = 位置
def 随机速度(速度倍数):
    return

窗口宽 = 450
窗口高 = 600
主角标志 = 1
怪物标志 = 2
石头标志 = 3
帧率 = 100
窗口 = pygame.display.set_mode((450, 600))
pygame.display.set_caption('外星历险')
背景资源数组 =
背景资源数组 = 主角标志
怪物数 = 16
for i in range(4):
    背景资源数组 = 怪物标志
石头数 = 160
for i in range(36 * 24, 36 * 24 - 160 , -1):
    背景资源数组 = 石头标志

窗口.fill((255 , 255 , 255))
random.shuffle(背景资源数组)
背景资源二维矩阵 = []
临时数组 = []
for i in range(len(背景资源数组)):
    临时数组.append(背景资源数组)
    if (i + 1) % 9 == 0:
      背景资源二维矩阵.append(临时数组)
      临时数组 = []
#print(背景资源二维矩阵)
主角背景图 = 'res\\主角.png'
主角组 = pygame.sprite.Group()
怪物背景图 = 'res\\怪物.png'
怪物组 = pygame.sprite.Group()
石头背景图 = 'res\\石头.png'
石头组 = pygame.sprite.Group()
所有资源数组 = []
for 行 in range(len(背景资源二维矩阵)):
    临时一维数组 = 背景资源二维矩阵[行]
    for 列 in range(len(临时一维数组)):
      if 主角标志 == 临时一维数组[列]:
            主角初始化位置 = (50 * 列 + 25 , 50 * 行 + 25)
            龙宇云 = 主角(主角背景图, 主角初始化位置)
            主角组.add(龙宇云)
            所有资源数组.append(龙宇云)
      elif 怪物标志 == 临时一维数组[列]:
            怪物初始化位置 = (50 * 列 + 25 , 50 * 行 + 25)
            临时怪物 = 怪物(怪物背景图 , 怪物初始化位置)
            怪物组.add(临时怪物)
            所有资源数组.append(临时怪物)
      elif 石头标志 == 临时一维数组[列]:
            石头初始化位置 = (50 * 列 + 25 , 50 * 行 + 25)
            临时石头 = 石头(石头背景图 , 石头初始化位置)
            石头组.add(临时石头)
            所有资源数组.append(临时石头)
主角组.draw(窗口)
怪物组.draw(窗口)
石头组.draw(窗口)
pygame.display.flip()

#screen.blit(image, (0, 0))
# pygame.draw.rect(screen, ,,0)
# pygame.draw.rect(screen, ,,0)



时钟 = pygame.time.Clock()
结束 = False
持续向左 = False
持续向右 = False
持续向上 = False
持续向下 = False
主角死亡 = False
暂停 = True
怪物延迟移动次数上限 = 2 * 帧率
怪物延迟移动次数 = 0
主角组.sprites().移动速度 = 3
主角组.sprites().速度加倍 = 1
while not 结束:
    #t1 = time.time()
    for 事件 in pygame.event.get():
      if 事件.type == pygame.QUIT:
            结束 = True
      if 事件.type == pygame.MOUSEBUTTONDOWN:
            if 事件.button == 1:
                暂停 = False
                print('开始')
            elif 事件.button == 3:
                暂停 = True
                怪物延迟移动次数 = 0
                print('暂停')
      if 事件.type == pygame.KEYDOWN:
            if 事件.key == pygame.K_LEFT:
                持续向左 = True
            if 事件.key == pygame.K_RIGHT:
                持续向右 = True
            if 事件.key == pygame.K_UP:
                持续向上 = True
            if 事件.key == pygame.K_DOWN:
                持续向下 = True
      if 事件.type == pygame.KEYUP:
            if 事件.key == pygame.K_LEFT:
                持续向左 = False
            if 事件.key == pygame.K_RIGHT:
                持续向右 = False
            if 事件.key == pygame.K_UP:
                持续向上 = False
            if 事件.key == pygame.K_DOWN:
                持续向下 = False
    时钟.tick(帧率) #每秒帧率100
    if 暂停:
      continue
    窗口.fill((255, 255, 255))


    if 怪物延迟移动次数 < 怪物延迟移动次数上限:
      怪物延迟移动次数 = 怪物延迟移动次数 + 1
    elif not 主角死亡:
      for 临时怪物 in 怪物组:
            if 临时怪物.停顿标记 != 临时怪物.移动速度:
                临时怪物.停顿标记 = 临时怪物.停顿标记 + 1
            else:
                临时怪物.停顿标记 = 1
                速度倍数 = 临时怪物.速度加倍
                if 临时怪物.移动步数 == 0:
                  临时速度 = 随机速度(速度倍数)
                  临时怪物.移动方向 = 临时速度
                if ((临时怪物.rect.left > 0 or 临时怪物.移动方向 != -1) and
                  (临时怪物.rect.right < 窗口宽 or 临时怪物.移动方向 != 1) and
                  (临时怪物.rect.top > 0 or 临时怪物.移动方向 != -1) and
                  (临时怪物.rect.bottom < 窗口高 or 临时怪物.移动方向 != 1)):
                  临时怪物.rect = 临时怪物.rect.move(临时怪物.移动方向)
                  if 临时怪物.rect.left < 0:
                        临时怪物.rect.left = 0
                  if 临时怪物.rect.right > 窗口宽:
                        临时怪物.rect.right = 窗口宽
                  if 临时怪物.rect.top < 0:
                        临时怪物.rect.top = 0
                  if 临时怪物.rect.bottom > 窗口高:
                        临时怪物.rect.bottom = 窗口高
                  临时怪物.移动步数 = 临时怪物.移动步数 + 1
                  if 临时怪物.移动步数 == 100:
                        临时怪物.移动步数 = 0
                else:
                  临时怪物.移动步数 = 0
                if pygame.sprite.spritecollide(主角组.sprites(), 怪物组, False):
                  主角死亡 = True
                  print('主角死亡')
                  break
                怪物组.remove(临时怪物)
                if pygame.sprite.spritecollide(临时怪物, 怪物组, False):
                  临时怪物.rect = 临时怪物.rect.move([-临时怪物.移动方向 , -临时怪物.移动方向])
                  临时怪物.移动步数 = 0
                if pygame.sprite.spritecollide(临时怪物, 石头组, False):
                  临时怪物.rect = 临时怪物.rect.move([-临时怪物.移动方向 , -临时怪物.移动方向])
                  临时怪物.移动步数 = 0
                怪物组.add(临时怪物)

    if not 主角死亡 and not ((持续向左 == True and 持续向右 == True) or (持续向上 == True and 持续向下 == True)):
      if 主角组.sprites().停顿标记 != 主角组.sprites().移动速度:
            主角组.sprites().停顿标记 = 主角组.sprites().停顿标记 + 1
      else:
            主角组.sprites().停顿标记 = 1
            速度倍数 = 主角组.sprites().速度加倍
            if 持续向左 == True and 主角组.sprites().rect.left > 0:
                主角组.sprites().rect = 主角组.sprites().rect.move([-速度倍数 , 0])
                碰到的石头 = pygame.sprite.spritecollide(主角组.sprites(), 石头组, False)
                if 碰到的石头:
                  主角组.sprites().rect.left = 碰到的石头.rect.right
                if pygame.sprite.spritecollide(主角组.sprites(), 怪物组, False):
                  主角死亡 = True
                  print('主角死亡')
                if 主角组.sprites().rect.left < 0:
                  主角组.sprites().rect.left = 0
            if 持续向右 == True and 主角组.sprites().rect.right < 窗口宽:
                主角组.sprites().rect = 主角组.sprites().rect.move([速度倍数 , 0])
                碰到的石头 = pygame.sprite.spritecollide(主角组.sprites(), 石头组, False)
                if 碰到的石头:
                  主角组.sprites().rect.right = 碰到的石头.rect.left
                if pygame.sprite.spritecollide(主角组.sprites(), 怪物组, False):
                  主角死亡 = True
                  print('主角死亡')
                if 主角组.sprites().rect.right > 窗口宽:
                  主角组.sprites().rect.right = 窗口宽
            if 持续向上 == True and 主角组.sprites().rect.top > 0:
                主角组.sprites().rect = 主角组.sprites().rect.move()
                碰到的石头 = pygame.sprite.spritecollide(主角组.sprites(), 石头组, False)
                if 碰到的石头:
                  主角组.sprites().rect.top = 碰到的石头.rect.bottom
                if pygame.sprite.spritecollide(主角组.sprites(), 怪物组, False):
                  主角死亡 = True
                  print('主角死亡')
                if 主角组.sprites().rect.top < 0:
                  主角组.sprites().rect.top = 0
            if 持续向下 == True and 主角组.sprites().rect.bottom < 窗口高:
                主角组.sprites().rect = 主角组.sprites().rect.move()
                碰到的石头 = pygame.sprite.spritecollide(主角组.sprites(), 石头组, False)
                if 碰到的石头:
                  主角组.sprites().rect.bottom = 碰到的石头.rect.top
                if pygame.sprite.spritecollide(主角组.sprites(), 怪物组, False):
                  主角死亡 = True
                  print('主角死亡')
                if 主角组.sprites().rect.bottom > 窗口高:
                  主角组.sprites().rect.bottom = 窗口高
    else:
      主角组.sprites().停顿标记 = 1
    主角组.draw(窗口)
    怪物组.draw(窗口)
    石头组.draw(窗口)
    pygame.display.flip()


    # t2 = time.time()
    # print(t2 - t1)
    # 结束 = True

nahongyan1997 发表于 2021-6-24 16:44:54

我没玩过pygame,不过可以给你个思路,想象成人物移动的时候人物只是在做走的动作,但是模型位置并没有动只是地图在动,等任务走到地图边缘位置地图无法移动时再移动人物。
页: [1]
查看完整版本: pygame地图移动