Gra w Pygame - problem ze sterowaniem i punktami

0

Witam! Podczas tworzenia gry napotkałem 2 problemy.

  1. Postać po naciśnięciu klawisza page up lub page down brnie w jednym kierunku. Można go skierować w drugą stronę, jednak jest to za trudne, bo postać porusza się zbyt szybko, aby ją opanować. Chciałbym, aby postać poruszała się tak długo, jak przyciska się dany klawisz.
  2. Punkty są zbierane nie poprzez ruch postaci w prawo, lecz gdy postać poruszy się w górę lub w dół. Zanim dodałem kolejne wiersze w programie, działało to porwane.

Z góry dziękuję za pomoc!

import pygame
import os
import random
import math

pygame.init()

szer = 800
wys = 600
screen = pygame.display.set_mode((szer,wys))

def napisz(tekst, x, y, rozmiar):
    cz = pygame.font.SysFont ("Arial", rozmiar)
    rend = cz.render(tekst, 1, (0,148,255))
    screen.blit(rend, (x,y))

copokazuje = "menu"

class Przeszkoda():
    def __init__(self, x, szerokosc):
        self.x = x
        self.szerokosc = szerokosc
        self.y_gora = 0
        self.wys_gora = random.randint(150,250)
        self.odstep = 200
        self.y_dol = self.wys_gora + self.odstep
        self.wys_dol = wys - self.y_dol
        self.kolor = (127, 51, 0)
        self.ksztalt_gora = pygame.Rect(self.x, self.y_gora, self.szerokosc, self.wys_gora)
        self.ksztalt_dol = pygame.Rect(self.x, self.y_dol, self.szerokosc, self.wys_dol)
    def rysuj(self):
        pygame.draw.rect(screen, self.kolor, self.ksztalt_gora, 0)
        pygame.draw.rect(screen, self.kolor, self.ksztalt_dol, 0)
    def ruch(self, v):
        self.x = self.x - v
        self.ksztalt_gora = pygame.Rect(self.x, self.y_gora, self.szerokosc, self.wys_gora)
        self.ksztalt_dol = pygame.Rect(self.x, self.y_dol, self.szerokosc, self.wys_dol)
    def kolizja(self, player):
        if self.ksztalt_gora.colliderect(player) or self.ksztalt_dol.colliderect(player):
            return True
        else:
            return False

class Mis():
    def __init__(self, x, y):
        self.x = y
        self.y = y
        self.wysokosc = 42
        self.szerokosc = 100
        self.ksztalt = pygame.Rect(self.x, self.y, self.szerokosc, self.wysokosc)
        self.grafika = pygame.image.load(os.path.join('panmisio.png'))
    def rysuj (self):
        screen.blit(self.grafika, (self.x,self.y))
    def ruch(self, v):
        self.y = self.y + v
        self.ksztalt = pygame.Rect(self.x, self.y, self.szerokosc, self.wysokosc)
    
przeszkody = []
for i in range(21):
    przeszkody.append(Przeszkoda(i*szer/20,szer/20))

gracz = Mis(250,275)

dy = 0
    
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                dy = -1
            if event.key == pygame.K_DOWN:
                dy = 1
            if event.key == pygame.K_SPACE:
                if copokazuje != "rozgrywka":
                    gracz = Mis(250,275)
                    dy = 0
                    copokazuje = "rozgrywka"
                    punkty = 0
    screen.fill((76,30,0))
    if copokazuje == "menu":
        napisz("Naciśnij spację, aby rozpocząć grę", 150, 400, 30)
        grafika = pygame.image.load(os.path.join('tytuł1.png'))
        screen.blit(grafika, (0,50))
    elif copokazuje == "rozgrywka":
        for p in przeszkody:
            p.ruch(1)
            p.rysuj()
            if p.kolizja(gracz.ksztalt):
                copokazuje = "koniec"
        for p in przeszkody:
            if p.x <= -p.szerokosc:
                przeszkody.remove(p)
                przeszkody.append((Przeszkoda(szer,szer/20)))
                punkty = punkty + math.fabs(dy)
        gracz.rysuj()
        gracz.ruch(dy)
        napisz(str(punkty), 700, 30,40)
    elif copokazuje == "koniec":
        grafika = pygame.image.load(os.path.join('koniec.png'))
        screen.blit(grafika, (0,50))
        napisz("Naciśnij spację, aby zagrać jeszcze raz", 150, 500, 30)
        napisz("Twój wynik: " + str(punkty), 150, 300,40)
    pygame.display.update()
0
  1. Kiedy nacisniesz page up/page down, ustawiasz wartość dy. Ale ta wartość nigdy wraca do zera tylko po naciśnięciu spacji. Zrób if elif i else. Odpowiednio dla klawiszy i dla stanu kiedy żaden z page'ów nie jest wciśnięty.
0

Możesz pokazać jak to zrobić? Nie wiem co w pisać w tych poleceniach.

1

Ehhh... Przecież masz te polecenia!

            if event.key == pygame.K_UP:
                dy = -1
            elif event.key == pygame.K_DOWN:
                dy = 1
            else:
                dy = 0

Tylko, że to nie będzie działać... Dopatrzyłem, że używasz eventów keydown. One są dobre do badania jednorazowych akcji (skok, strzał...). Do chodzenia potrzebujesz ciągły stan klawisza. https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed

I klawisze jakie obsługujesz w kodzie to nie są page up, czy page down, tylko strzałki...

0

Zrobiłem jak pokazałeś. Dalej to samo.

0

Użyłeś pygame.key.get_pressed?

0

Nie. Dopiero co zacząłem przygodę z oprogramowaniem, więc część poleceń jest mi nieznana.

0

Kombinowałem i nic. Szukałem jakiejś podpowiedzi w internecie jeśli chodzi o pygame.key.get_pressed, ale to nie odbiło się na postępach. Dalej stoję w miejscu.

1

W linku, który podałem masz przykłady...
https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed
Wystarczy kliknąć przycisk: Search examples for pygame.key.get_pressed

Po prostu musisz zamiast używać eventów, po pętli for event in pygame.event.get() obsłużyć swoje klawisze.
A z pętli trzeba oczywiście usunąć obsługę klawiszy up i down.

1 użytkowników online, w tym zalogowanych: 0, gości: 1