Gra w Pygame - problem ze sterowaniem i punktami

Odpowiedz Nowy wątek
2019-11-02 21:21
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()

Pozostało 580 znaków

2019-11-02 21:40
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.

edytowany 1x, ostatnio: Spine, 2019-11-02 21:42

Pozostało 580 znaków

2019-11-02 21:43
0

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

Pozostało 580 znaków

2019-11-02 21:46
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...

edytowany 2x, ostatnio: Spine, 2019-11-02 21:52

Pozostało 580 znaków

2019-11-02 22:18
0

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

Pozostało 580 znaków

2019-11-02 22:18
0

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

Pozostało 580 znaków

2019-11-02 22:21
0

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

Pozostało 580 znaków

2019-11-03 13:40
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.

Pozostało 580 znaków

2019-11-03 14:15
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.

edytowany 2x, ostatnio: Spine, 2019-11-03 14:15

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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