当前位置: 首页 > 知识库问答 >
问题:

如何在一个背景图像上移动播放器?

和斌
2023-03-14

很抱歉最近问了这么多问题。我刚刚开始进入pyplay。关于我之前的问题,我认为我没有把它用在我想做的事情上。

这是我做的一张快速图片来演示

这是我想让玩家移动的单一背景图像或地图。红色的X只是角色的开始。我试着让它当我移动玩家时,背景也会跟随,就像玩家在地图上移动一样。我已经限制了玩家不能离开实际屏幕的边界。只是有一点麻烦,现在试图让它这样的单一图像将沿着玩家移动,如果玩家到达地图图片移动停止。我见过人们在玩家移动时使用滚动和复制图像。我只想看到它与玩家将要移动的单一图像一致。我不想担心碰撞,只要能够让运动正常工作。

这是我当前使用的代码:

from pygame.locals import *
from math import sin

pygame.display.set_caption("TEST")

clock = pygame.time.Clock()
time_passed = 0
class Player():
  def __init__(self,x,y):
    self.Image = pygame.image.load("myAvatar.png").convert()

    self.x = 200
   
    self.y = 200
  

  def getX(self):
    return self.rect.x

  def getY(self):
    return self.rect.y

  def handle_keys(self,screenHeight,screenWidth):
      key = pygame.key.get_pressed()
      dist = 2 

      if key[K_LEFT] and self.x > 0: 
            self.x -= 500 * time_passed
      
      if key[K_RIGHT] and self.x < screenWidth -20:
            self.x += 500 * time_passed
         
      if key[K_UP] and self.y > 0:
        self.y -= 500 * time_passed
      
      if key[K_DOWN] and self.y < screenHeight -20:
        self.y += 500 * time_passed
    


  def draw(self, game_window):
    self.Image = pygame.transform.scale(self.Image,(20,20))
    
    game_window.blit(self.Image, (int(self.x), int(self.y)))
   



class Map():
  def __init__(self):
    self.Image = pygame.image.load("test2.png").convert()




    self.rect = self.Image.get_rect()
    self.x = 0
    self.y = 0


  def draw(self, game_window,screenHeight,screenWidth):

    self.x = min(max(self.x, player.x - 2  * screenWidth / 2), player.x - screenWidth / 2)
    self.y = min(max(self.y, player.y -2  * screenHeight / 2), player.y - screenHeight / 2)



    game_window.blit(self.Image,(-self.x,-self.y))
  


class Enemy():
  def __init__ (self,x,y):
    self.Image = pygame.image.load("WC.jpg").convert()


    self.rect  = self.Image.get_rect(topleft = (x,y))


  
  def draw(self, game_window):
    self.Image = pygame.transform.scale(self.Image,(20,20))
    game_window.blit(self.Image, (self.rect.x, self.rect.y))


pygame.init()

clock = pygame.time.Clock()
screenWidth = 400
screenHeight = 400
game_window = pygame.display.set_mode((screenWidth,screenHeight))
player = Player(200,200)
map = Map()
enemy = Enemy(250,250)
leave = False
while not leave:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit() 
      running = False



  player.handle_keys(screenHeight,screenWidth)

  game_window.fill((0,0,0))
  map.draw(game_window,screenHeight,screenWidth)
  #enemy.draw(game_window)
  player.draw(game_window)
 
  pygame.display.update()
  pygame.display.flip()
  time_passed = clock.tick() / 1000

  


pygame.quit()
quit()

谢了Shay

共有1个答案

夏兴平
2023-03-14

玩家的移动取决于地图的大小。“玩家”的xy属性存储地图上的位置,并限制为地图的大小(map\u size)。玩家总是在屏幕中央绘制,除非它靠近地图的边界:

class Player():
    def __init__(self, x, y):
        self.Image = pygame.image.load("myAvatar.png").convert()
        self.x = 200
        self.y = 200
  
    def handle_keys(self, map_size):
        key = pygame.key.get_pressed()
        self.x += (key[K_RIGHT] - key[K_LEFT]) * 500 * time_passed
        self.y += (key[K_DOWN] - key[K_UP]) * 500 * time_passed
        self.x = max(0, min(map_size[0]-20, self.x))
        self.y = max(0, min(map_size[1]-20, self.y))
    
    def draw(self, game_window, map_size):
        window_size = game_window.get_size()
        center = window_size[0] // 2, window_size[0] // 2
        
        pos = [self.x, self.y]
        for i in range(2):
            if center[i] < pos[i] <= map_size[i]-center[i]:
                pos[i] = center[i]
            elif pos[i] > map_size[i] - center[i]: 
                pos[i] = window_size[i] - map_size[i] + pos[i]
        game_window.blit(self.Image, (int(pos[0]), int(pos[1])))

玩家在地图上的位置以窗口为中心:

class Map():
    def __init__(self):
        self.Image = pygame.image.load("test2.png").convert()

    def draw(self, game_window):
        window_size = game_window.get_size()
        map_size = self.Image.get_size()
        x = max(0, min(map_size[0] - window_size[0], player.x - 200))
        y = max(0, min(map_size[1] - window_size[1], player.y - 200))
        game_window.blit(self.Image, (-x, -y))

应用程序循环:

leave = False
while not leave:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            leave = True

    player.handle_keys(map.Image.get_size())

    game_window.fill((0,0,0))
    map.draw(game_window)
    #enemy.draw(game_window)
    player.draw(game_window, map.Image.get_size())
    
    pygame.display.update()
    pygame.display.flip()
    time_passed = clock.tick() / 1000

pygame.quit()
 类似资料:
  • 问题内容: 我有一个正在编写的CSS页面,我需要在一个类中应用背景图像,然后使用另一个类将一个局部透明的背景图像放在已经存在的背景图像之上。这只是一个简单的字眼,所以让我做一个示范。 在此示例中,第一个div应该具有背景图像1,第二个div应该具有背景图像1,但是滤镜图像位于其顶部,然后第三个div应该是图像2,第四个应该是图像2并且上面具有相同的滤镜。 但是,在此示例中,.backgroundF

  • 我有一个背景图像和它周围的边框,所以我需要把边框放在我的背景图像下,就像它在我的草稿中显示的那样。草稿图像 现在我有这样的东西。我的结果 我如何修复它? CSS .hero图像{ 位置:相对; 宽度:100%; 左边距:44px; 最大宽度:716px; 高度:626px; 背景图像:url(“/img/hero/hero bg.jpg”) 背景重复:不重复; 背景位置:-150px; 背景剪辑:

  • 问题内容: 我想让div元素延伸到33%的宽度,并在CSS中完成背景图片 如何在mouseover或mouseneter上对div中的背景图像进行动画处理,是否有可以执行此操作的插件?background div必须使用background-size:cover,因为它是一个弹性页面。 我还没有小提琴,因为我不知道从哪里开始或如何开始 问题答案: 对于那些想要破解CSS过渡缩放以应用于背景尺寸的人

  • 我希望用户能够将两个图像缩放到一起,同时保持它们之间的正确相对位置。我在其中一幅图像上使用缩放手势检测器,然后将手势扩展到另一幅图像。我的问题是,虽然我可以让图像一起移动,但一旦我尝试缩放第二个图像,翻译就会急剧下降。它们是我不知道的缩放时发生的事情吗?信息。ParentPrecords变量设置在缩放手势检测器的开头,然后再对父对象(基础图像)进行任何更改。

  • 我有一个线性布局,如下所示: