• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Scrollowanie w grze stworzonej w Pygame - jak to zrobić?

Konkurs Mistrz Programowania
+1 głos
304 wizyt
pytanie zadane 22 czerwca 2022 w Python przez Karp.exe Początkujący (340 p.)

Witam, robię grę w, której zrobiłem, już fizykę, wgrałem mapę itd. ale nie wiem jak zrobić scrollowanie (próbowałem to zrobić, ale wtedy niektóre bloki po prostu działały jakby były powietrzem - Gracz przez nie przechodził jakby nigdy nic).

Proszę o pomoc. kod:

import pygame
pygame.init()
win = pygame.display.set_mode((800, 800))
pygame.display.set_caption("Scrolling game")
#declare variables
#   for a player
moving_left = False
moving_right = False
jump = False
TILE_SIZE = 32
#creating_world
with open('world.txt') as world:
    reader = world.read()
    world_data = reader.split("\n")
    world.close()
class Square(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.Rect(x, y, 32, 32)
        self.can_jump = True
        self.vely = -30
        self.scroll = 0
    def draw(self):
        pygame.draw.rect(win, (255, 80, 80), self.rect)
    def move(self):
        global scrollx, jump, moving_left, moving_right
        Gravity = 3
        dx = 0
        dy = 0
        dy += Gravity
        if moving_left:
            dx -= 4
        elif moving_right:
            dx += 4 
        if jump:
            dy += self.vely
            self.vely += 1
            if self.vely == 0:
                jump = False
                self.can_jump = True
                self.vely = -30          
        #check for collision
        for tile in obstacle_list:
            if tile.colliderect(self.rect.x + 1, (self.rect.y + self.rect.height), self.rect.width - 2, 1) and jump == False:
                dy = 0
            if tile.colliderect(self.rect.x + self.rect.width, self.rect.y - 1, 1, self.rect.height - 2):
                dx = 0
            if tile.colliderect(self.rect.x + 1, self.rect.y, self.rect.width + 2, 1):
                jump = False
                self.can_jump = True
                self.vely = -30
                dy += 30
        self.scroll = -dx
        if dx < 0 and self.rect.x > 100 or dx > 0 and self.rect.x < 700:
            self.rect.x += dx
        self.rect.y += dy
class Block(pygame.sprite.Sprite):
    def __init__(self, img, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.transform.scale(pygame.image.load(f'blocks/{img}'), (32,32))
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
Player = Square(400, 400)
run = True
Dirt_group = pygame.sprite.Group()
Grass_group = pygame.sprite.Group()
Clock = pygame.time.Clock()
obstacle_list = []
count_loads = 0
while run:
    Clock.tick(100)
    win.fill((255, 124, 255))
    if count_loads != 1:
        y = 0
        for row in world_data:
            x = 0
            for tile in row:
                if tile == '1':
                    dirt = Block('dirt.png', x * TILE_SIZE, y * TILE_SIZE)
                    Dirt_group.add(dirt)
                if tile == '2':
                    grass = Block('grass.png', x * TILE_SIZE, y * TILE_SIZE)
                    Grass_group.add(grass)
                if tile != '0':
                    obstacle_list.append(pygame.Rect(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE))
                x += 1
            y += 1
        count_loads += 1
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_d:
                moving_right = True
            if event.key == pygame.K_a:
                moving_left = True
            if event.key == pygame.K_SPACE and Player.can_jump:
                jump = True
                Player.can_jump = False
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_d:
                moving_right = False
            if event.key == pygame.K_a:
                moving_left = False
    Player.draw()
    Player.move()
    Grass_group.update()
    Dirt_group.update()
    Grass_group.draw(win)
    Dirt_group.draw(win)
    pygame.display.update()

 

1
komentarz 22 czerwca 2022 przez Karp.exe Początkujący (340 p.)
Obejrzałem ten film i zrobiłem jak tam było - self.rect.x += scroll. Nadal nie działa. W filmie były dwie grafiki i program nimi poruszał  a u mnie są sprite'y. Nadal nie działa. Jednakże dziękuje za pomoc
1
komentarz 22 czerwca 2022 przez Karp.exe Początkujący (340 p.)
edit: znalazłem odpowiedź - pozycje kwadratów z obstacle_list nie była aktualizowana wraz ze scrollowaniem
1
komentarz 18 sierpnia 2022 przez furas Maniak (53,800 p.)

@Karp.exe, może łatwiej będzie stworzyć wielki Surface() i na nim rysować normalnie bez użycia wartości scroll - a potem wyświetlać w oknie tylko wybrany kawałem tego Surface używając wartości sroll
 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 283 wizyt
pytanie zadane 6 października 2022 w Python przez Podlasianin Początkujący (400 p.)
0 głosów
0 odpowiedzi 336 wizyt
pytanie zadane 7 lipca 2022 w Python przez Karp.exe Początkujący (340 p.)
0 głosów
0 odpowiedzi 217 wizyt

93,654 zapytań

142,575 odpowiedzi

323,091 komentarzy

63,170 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...