• 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ć?

Object Storage Arubacloud
+1 głos
128 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 170 wizyt
pytanie zadane 6 października 2022 w Python przez Podlasianin Początkujący (400 p.)
0 głosów
0 odpowiedzi 225 wizyt
pytanie zadane 7 lipca 2022 w Python przez Karp.exe Początkujący (340 p.)
0 głosów
0 odpowiedzi 135 wizyt

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...