• 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.

0 głosów
24 wizyt
pytanie zadane 13 sierpnia w Python, Django 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 przez Mr-root Gaduła (3,590 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 przez pZkaaa Nowicjusz (120 p.)
Dziękuje bardzo. Temat do zamkniecia

Podobne pytania

0 głosów
1 odpowiedź 76 wizyt
pytanie zadane 6 sierpnia w Python, Django przez akinhet Nowicjusz (170 p.)
0 głosów
0 odpowiedzi 71 wizyt
pytanie zadane 2 lipca 2017 w Python, Django przez DODO Bywalec (2,960 p.)
0 głosów
1 odpowiedź 71 wizyt
pytanie zadane 22 lipca w Python, Django przez Patryk01 Użytkownik (950 p.)
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

65,728 zapytań

112,369 odpowiedzi

237,231 komentarzy

46,688 pasjonatów

Przeglądających: 186
Pasjonatów: 5 Gości: 181

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.

...