Как переместить персонажа в пигме без создания более одной картинки - PullRequest
0 голосов
/ 22 мая 2019

Я делаю свою первую игру в Pygame, но когда я создал свой мир и пытаюсь переместить своего персонажа, его спрайт все еще остается в прежней позиции.Я не могу закрыть свой фон в каждом кадре, так как он слишком большой и сводит производительность Pygame к остановке.

Я пытался перетаскивать каждый кадр, но это также замедляло работу Pygame.Затем я попытался сделать так, чтобы он запечатлелся вокруг персонажа, чтобы он покрывал старую картинку моего персонажа, но я также не смог заставить ее работать.

def MakeTerrain():
    TempY = 0
    for o in range(51):
        for i in range(51):
            TempX = 16 * i
            if TempX >= 800:
                TempY = 16 * o
                TempX = 0
            rnd = random.randrange(10)
            if rnd <= 8:
                tile = Tile("Grass",[TempX,TempY])
            else:
                tile = Tile("Stone",[TempX,TempY])

            Tiles.append(tile)
            tile.BlitTile(Display)

Функция создания ландшафта [aka world / background]

class Player():
def __init__(self,MovementSpeed=1):
    self.DirectionX = 0
    self.DirectionY = 0
    self.PlayerPos = [0,0]
    self.MovementSpeed = MovementSpeed
    self.PlayerSprite = pygame.image.load("Jeffrey.png")

def BlitPlayer(self,display):
    display.blit(self.PlayerSprite,(self.PlayerPos[0],self.PlayerPos[1]))

Класс моего игрока с функцией блита

class Tile():
    def __init__(self,sprite,Position):
        self.TilePosition = Position
        self.TileSprite = pygame.image.load(sprite+".png")

    def BlitTile(self,display):
        display.blit(self.TileSprite,(self.TilePosition[0],self.TilePosition[1]))

Класс плитки

http://prntscr.com/nrtnyx

Вот что происходит

1 Ответ

1 голос
/ 22 мая 2019

Я думаю, что идея только перерисовать плитки рядом с игроком может работать, но это нужно немного переработать.

Это потребует изменения значений вашей позиции на pygame.math.Vector2, так что сначала, ятакже рекомендовал бы изменить все экземпляры этих значений на self.pos, чтобы цикл, который я покажу вам, был проще сделать.

self.pos = pygame.math.Vector2(Position)

Чтобы получить значения x и y, они просто self.pos.x илиself.pos.y

В коде чертежа вы можете сначала изменить его, чтобы он проходил через каждый спрайт:

for sprite in my_sprites:
    pass

Внутри этого цикла вы можете проверить расстояние от спрайта до игрокаиспользуя эти новые векторы:

deltaVec = player.pos - sprite.pos # Find delta [difference] between player position and sprite position
len = deltaVec.length() # Find the length between those two points through the distance formula

Затем, в конце, проверьте, находится ли новое расстояние ниже определенной пороговой величины:

if len < 100: # 100 being the distance, change if needed
    sprite.draw()

В конце, новый код рисованиявыглядело бы так:

for sprite in my_sprites:
    deltaVec = player.pos - sprite.pos
    len = deltaVec.length() 

    if len < 100: # 100 being the distance, change if needed
        sprite.draw()

Это должно перерисовывать только плитки, ближайшие к игроку, и это без необходимости управлять каждой плиткой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...