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

Komenda screem.fill() nie odswieza obecnego ekranu.

Fiszki IT
Fiszki IT
0 głosów
60 wizyt
pytanie zadane 13 sierpnia 2019 w Python przez pZkaaa Nowicjusz (120 p.)

Witam, robie gierke w pygame I natrafilem na pewien problem. Komenda screen.fill() nie niszczy obecnych obiektow na ekranie. Dochodzi do sytuacji w ktorej po przegranej gierce(kolizji z przeciwnikiem) jak klikam spacje, ktora powinna resetowac cala gre, natychmiast przegrywam bo przeciez gracz jest w kolizji z przeciwnikiem.

import os
import random
import pygame

pygame.init()
pygame.display.set_caption('Biedronkaaa')
screen = pygame.display.set_mode((500, 500))
# background_menu = pygame.image.load("tlo-menu.jpg")
# background_game = pygame.image.load("tlo-gra.jpg")


def write(text, x, y, size):
    cz = pygame.font.SysFont("Arial", size)
    text = cz.render(text, 1, (204, 0, 0))
    screen.blit(text, (x, y))


class Biedronki():

    def __init__(self):
        self.x = random.randint(10, 100)
        self.y = random.randint(10, 100)
        self.vx = random.randint(-4, 4)
        self.vy = random.randint(-4, 4)
        self.graphic = pygame.image.load(os.path.join('biedrona.png'))
        self.size = 24

    def draw(self):
        screen.blit(self.graphic, (self.x, self.y))

    def moves(self):
        self.x += self.vx
        self.y += self.vy
        if self.x <= 0 or self.x >= 500 - self.size:
            self.vx = self.vx * -1
        if self.y <= 0 or self.y >= 500 - self.size:
            self.vy = self.vy * -1

    def collision(self, player):
        x_srodek = self.x + self.size / 2
        y_srodek = self.y + self.size / 2
        if player.collidepoint(x_srodek, y_srodek):
            return True
        else:
            return False


enemies = []
for i in range(20):
    enemies.append(Biedronki())

x_player = 450
y_player = 450
v = 20
player = pygame.Rect(x_player, y_player, 32, 32)
graphic_player = pygame.image.load(os.path.join('gracz.png'))

game = "menu"
points = 0

# mainloop
while True:
    screen.fill((0,0,0))
    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:
                if y_player - v > 0:
                    y_player -= v
            if event.key == pygame.K_DOWN:
                if y_player + v < 500 - 32:
                    y_player += v
            if event.key == pygame.K_RIGHT:
                if x_player + v < 500 - 32:
                    x_player += v
            if event.key == pygame.K_LEFT:
                if x_player - v > 0:
                    x_player -= v
            if event.key == pygame.K_SPACE:
                if game != "contest":
                    screen.blit(graphic_player, (x_player, y_player))
                    game = 'contest'
                    points = 0
            player = pygame.Rect(x_player, y_player, 32, 32)


    if game == "menu":
        screen.fill((50,50,50))
        write("Press space to run", 140, 250, 20)
    elif game == "contest":
        points += 1
        screen.fill((50, 50, 50))
        for biedroneczka in enemies:
            biedroneczka.moves()
            biedroneczka.draw()
            if biedroneczka.collision(player):
                game = "end"


        screen.blit(graphic_player, (x_player, y_player))
        write(str(points), 30, 30, 20)
        pygame.time.wait(15)


    elif game == "end":
        write("Niestety przegrywasz", 50, 290, 20)
        write("Aby zagrać ponownie, zrestartuj gre :)", 50, 350, 20)
        write("Twój wynik to: " + str(points), 50, 320, 20)
    pygame.display.update()

 

1 odpowiedź

+1 głos
odpowiedź 13 sierpnia 2019 przez Mr-root Gaduła (3,750 p.)

Cześć.

Zmieniłem lekko Twój kod tak aby po kliknięciu spacji od nowa tworzył przeciwników i przenosił gracza do pozycji początkowej [84 - 89] oraz [47]. 

import os
import random
import pygame

pygame.init()
pygame.display.set_caption('Biedronkaaa')
screen = pygame.display.set_mode((500, 500))
# background_menu = pygame.image.load("tlo-menu.jpg")
# background_game = pygame.image.load("tlo-gra.jpg")


def write(text, x, y, size):
	cz = pygame.font.SysFont("Arial", size)
	text = cz.render(text, 1, (204, 0, 0))
	screen.blit(text, (x, y))


class Biedronki():
	def __init__(self):
		self.x = random.randint(10, 100)
		self.y = random.randint(10, 100)
		self.vx = random.randint(-4, 4)
		self.vy = random.randint(-4, 4)
		self.graphic = pygame.image.load(os.path.join('biedrona.png'))
		self.size = 24

	def draw(self):
		screen.blit(self.graphic, (self.x, self.y))

	def moves(self):
		self.x += self.vx
		self.y += self.vy
		if self.x <= 0 or self.x >= 500 - self.size:
			self.vx = self.vx * -1
		if self.y <= 0 or self.y >= 500 - self.size:
			self.vy = self.vy * -1

	def collision(self, player):
		x_srodek = self.x + self.size / 2
		y_srodek = self.y + self.size / 2
		if player.collidepoint(x_srodek, y_srodek):
			return True
		else:
			return False


enemies = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


x_player = 450
y_player = 450
v = 20
player = pygame.Rect(x_player, y_player, 32, 32)
graphic_player = pygame.image.load(os.path.join('gracz.png'))

game = "menu"
points = 0

# mainloop
while True:
	screen.fill((0,0,0))
	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:
				if y_player - v > 0:
					y_player -= v
			if event.key == pygame.K_DOWN:
				if y_player + v < 500 - 32:
					y_player += v
			if event.key == pygame.K_RIGHT:
				if x_player + v < 500 - 32:
					x_player += v
			if event.key == pygame.K_LEFT:
				if x_player - v > 0:
					x_player -= v
			if event.key == pygame.K_SPACE:
				if game != "contest":
					screen.blit(graphic_player, (x_player, y_player))
					game = 'contest'
					points = 0
					x_player = 450
					y_player = 450
					for _ in range(20):
						enemies.pop(0)
					for _ in range(20):
						enemies.append(Biedronki())
			player = pygame.Rect(x_player, y_player, 32, 32)


	if game == "menu":
		screen.fill((50,50,50))
		write("Press space to run", 140, 250, 20)
	elif game == "contest":
		points += 1
		screen.fill((50, 50, 50))
		for biedroneczka in enemies:
			biedroneczka.moves()
			biedroneczka.draw()
			if biedroneczka.collision(player):
				game = "end"


		screen.blit(graphic_player, (x_player, y_player))
		write(str(points), 30, 30, 20)
		pygame.time.wait(15)


	elif game == "end":
		write("Niestety przegrywasz", 50, 290, 20)
		write("Aby zagrać ponownie, zrestartuj gre :)", 50, 350, 20)
		write("Twój wynik to: " + str(points), 50, 320, 20)
	pygame.display.update()

Mam nadzieję, że pomogłem

Mr Root

komentarz 13 sierpnia 2019 przez pZkaaa Nowicjusz (120 p.)
Dziękuje bardzo. Temat do zamkniecia

Podobne pytania

0 głosów
0 odpowiedzi 111 wizyt
pytanie zadane 4 lipca w Python przez CubeStorm Stary wyjadacz (11,920 p.)
0 głosów
1 odpowiedź 124 wizyt
pytanie zadane 30 maja 2020 w Python przez tonn204 Mądrala (6,610 p.)
0 głosów
1 odpowiedź 324 wizyt
pytanie zadane 6 sierpnia 2019 w Python przez akinhet Nowicjusz (170 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

84,750 zapytań

133,554 odpowiedzi

295,973 komentarzy

56,009 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...