【问题标题】:Having trouble keeping the map picture on the pygame screen [duplicate]在pygame屏幕上保存地图图片时遇到问题[重复]
【发布时间】:2021-05-27 10:05:53
【问题描述】:

我无法在 pygame 窗口上对齐地图图片。我想要它,这样地图图片将始终填满整个屏幕。我已经做到了,当玩家移动时地图图片会移动,但无法显示整个地图。

(这些不是我将在实际游戏中使用的图像,仅用于测试) Here is what happens if you move to the maximum up and left

When the character moves to the maximum down and right. Some of the image is still cut off

这是我正在使用的代码:

import pygame 
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("testbackground.jpg").convert()




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


  def draw(self, game_window,screenHeight,screenWidth):
    self.Image = pygame.transform.scale(self.Image,(800,800))
    self.x = min(max(self.x, player.x - 2  * screenWidth / 3), player.x - screenWidth / 3)
    self.y = min(max(self.y, player.y -2  * screenHeight / 3), player.y - screenHeight / 3)
      


    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()

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    您需要在后台多次blit。见How to scroll the background surface in PyGame?
    如果背景沿 x 和 y 轴移动,则必须在屏幕上放置 4 个背景“tiles2:

    class Map():
        def __init__(self):
            self.Image = pygame.image.load("testbackground.jpg").convert()
            self.Image = pygame.transform.scale(self.Image, game_window.get_size())
                    
            self.rect = self.Image.get_rect()
            self.x = 0
            self.y = 0
    
    
        def draw(self, game_window,screenHeight,screenWidth):
            
            self.x = player.x - screenWidth // 2
            self.y = player.y - screenHeight // 2
            
            x1 = self.x % self.Image.get_width()
            x2 = x1 - self.Image.get_width()
            y1 = self.y % self.Image.get_height()
            y2 = y1 - self.Image.get_height()
            
            game_window.blit(self.Image, (x1, y1))
            game_window.blit(self.Image, (x2, y1))
            game_window.blit(self.Image, (x1, y2))
            game_window.blit(self.Image, (x2, y2))
    

    【讨论】:

    • 感谢您的帮助。我想将播放器保持在一个图像上,而不是像那样复制它。我只是无法重新调整图像的位置。你有什么解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2017-08-14
    相关资源
    最近更新 更多