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

Generator poziomów do gry (python,pygame)

Object Storage Arubacloud
+1 głos
229 wizyt
pytanie zadane 22 grudnia 2022 w Python przez Kubas23 Użytkownik (630 p.)

Chcialbym stworzyc generator poziomow do mojej gry ale prostokaty sie nie renderuja:

 

import pygame
import time
  
pygame.init()
window = pygame.display.set_mode((1280, 720))
  
 
class Sciana:
    def __init__(self, x, y, szerokosc, wysokosc):
        
        self.x_cord = x
        self.y_cord = y
        self.szerokosc = szerokosc
        self.wysokosc = wysokosc
        self.hitbox = pygame.Rect(self.x_cord, self.y_cord, self.szerokosc, self.wysokosc)
 
    def __str__(self):
        return f"Sciana({self.x_cord},{self.y_cord},{self.szerokosc},{self.wysokosc})"
 
    def draw(self):
        pygame.draw.rect(window, (0,0,0) , self.hitbox)
   
 
item = 'sciana'
image = pygame.image.load('select.png')
  
sciany = [
] 
 
 
pozycja = 1
x = 0
y = 0
 
speed = 25
run = True

while run:
    time.sleep(0.05)
    pygame.time.Clock().tick(30)
    keys = pygame.key.get_pressed()
    window.fill((255,255,255))   
     
    for event in pygame.event.get():
        if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:  
            run = False
  
    if keys[pygame.K_1]:
        item = 'sciana'
    if keys[pygame.K_2]:
        item = 'lava'
    if keys[pygame.K_RIGHT]:  
        x += speed
    if keys[pygame.K_LEFT]: 
        x -= speed
    if keys[pygame.K_UP]:  
        y -= speed
    if keys[pygame.K_DOWN]: 
        y += speed
    if keys[pygame.K_SPACE]:  
        time.sleep(0.5)
        if item == 'sciana':
            sciany.insert(pozycja, Sciana(x,y,25,25))


            print('-'*20)
            for sciana in sciany:
                print(sciana)
            print('-'*20)
            pozycja += 1    

    if keys[pygame.K_LSHIFT]: 
        print(sciany)
   
    
    player = window.blit(image,(x, y,))
    
    window.blit(image,(x, y,))  
    
    for sciana in sciany:
        sciana.draw(window)
        
    pygame.display.update()
    
pygame.quit()

 

Wyskakuje błąd:

Traceback (most recent call last):
  File ".................", line 81, in <module>
    sciana.draw(window)
TypeError: Sciana.draw() takes 1 positional argument but 2 were given

1 odpowiedź

0 głosów
odpowiedź 22 grudnia 2022 przez VBService Ekspert (253,120 p.)
edycja 23 grudnia 2022 przez VBService
 
Najlepsza

Ponieważ masz w linii 5 window (globalnie zadeklarowane)

import pygame
import time
   
pygame.init()
window = pygame.display.set_mode((1280, 720))
   
  
class Sciana:
    def __init__(self, x, y, szerokosc, wysokosc):
         
        self.x_cord = x
        self.y_cord = y
        self.szerokosc = szerokosc
        self.wysokosc = wysokosc
        self.hitbox = pygame.Rect(self.x_cord, self.y_cord, self.szerokosc, self.wysokosc)
  
    def __str__(self):
        return f"Sciana({self.x_cord},{self.y_cord},{self.szerokosc},{self.wysokosc})"
  
    def draw(self):
        pygame.draw.rect(window, (0,0,0) , self.hitbox)
    
  
item = 'sciana'
image = pygame.image.load('select.png')
   
sciany = [] # pusta lista, więc ...
  
  
pozycja = 0 # .. tu zero
x = 0
y = 0
  
speed = 25
run = True
 
while run:
    time.sleep(0.05)
    pygame.time.Clock().tick(30)
    keys = pygame.key.get_pressed()
    window.fill((255,255,255))   
      
    for event in pygame.event.get():
        if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:  
            run = False
   
    if keys[pygame.K_1]:
        item = 'sciana'
    if keys[pygame.K_2]:
        item = 'lava'
    if keys[pygame.K_RIGHT]:  
        x += speed
    if keys[pygame.K_LEFT]: 
        x -= speed
    if keys[pygame.K_UP]:  
        y -= speed
    if keys[pygame.K_DOWN]: 
        y += speed
    if keys[pygame.K_SPACE]:  
        time.sleep(0.5)
        if item == 'sciana':
            sciany.insert(pozycja, Sciana(x,y,25,25))
 
 
            print('-'*20)
            for sciana in sciany:
                print(sciana)
            print('-'*20)
            pozycja += 1   
 
    if keys[pygame.K_LSHIFT]: 
        print(sciany)
    
     
    player = window.blit(image,(x, y,))
     
    window.blit(image,(x, y,))  
     
    for sciana in sciany:
        sciana.draw()
         
    pygame.display.update()
     
pygame.quit()

 

wtedy wystarczy

...

    window.blit(image,(x, y,))  
     
    for sciana in sciany:
        sciana.draw()
         
    pygame.display.update()

...

bo masz

    def draw(self):
        pygame.draw.rect(window, (0,0,0) , self.hitbox)

 

 

BTW, Twój kod ma problem z wychodzeniem w czasie "przesuwania" za pomocą klawiszy strzałek poza zakres okna.

Sprawdź np. ten kod smiley

import pygame
from pygame.locals import *
from sys import exit

pygame.init()

window_size = (600, 400) 
window = pygame.display.set_mode(window_size)
pygame.display.set_caption('Square')
clock = pygame.time.Clock() 
 
GREEN = (0, 255, 0)
BLUE  = (0, 0, 255)
BLACK = (0, 0, 0)

window_frame = Rect(0, 0, window_size[0], window_size[1])
square_green = Rect(300, 100, 100, 100)
square_blue  = Rect(0, 0, 100, 100)

pixel_step = 5
 
while True:
    keys = pygame.key.get_pressed()

    for event in pygame.event.get():
        if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:
            pygame.quit()
            exit()

    blue_square_x_pos = 0
    blue_square_y_pos = 0
        
    if keys[pygame.K_RIGHT]:
        blue_square_x_pos = pixel_step
                    
    if keys[pygame.K_LEFT]:
        blue_square_x_pos = -pixel_step

    if keys[pygame.K_DOWN]:
        blue_square_y_pos = pixel_step
                    
    if keys[pygame.K_UP]:
        blue_square_y_pos = -pixel_step                

    square_blue.move_ip(blue_square_x_pos, blue_square_y_pos)            
    collide = pygame.Rect.colliderect(square_blue, square_green)

    if collide:
        if keys[pygame.K_RIGHT]:
            blue_square_x_pos = -pixel_step
                    
        if keys[pygame.K_LEFT]:
            blue_square_x_pos = pixel_step
                
        if keys[pygame.K_DOWN]:
            blue_square_y_pos = -pixel_step
                    
        if keys[pygame.K_UP]:
            blue_square_y_pos = pixel_step 
                
        square_blue.move_ip(blue_square_x_pos, blue_square_y_pos)

    square_blue.clamp_ip(window_frame)
 
    window.fill(BLACK)
 
    pygame.draw.rect(window, GREEN, square_green)
    pygame.draw.rect(window, BLUE, square_blue)
    
    pygame.display.flip()
    clock.tick(60)

 

no chyba, że przewidujesz duże mapy (poziomy) i będziesz "skrolował" obraz w oknie. 

komentarz 23 grudnia 2022 przez Kubas23 Użytkownik (630 p.)
A jak konkretnie mialbym naprawic te globalna deklaracje "Window" ?

Tzn ten error:

Traceback (most recent call last):
  File ".................", line 81, in <module>
    sciana.draw(window)
TypeError: Sciana.draw() takes 1 positional argument but 2 were given
komentarz 23 grudnia 2022 przez Kubas23 Użytkownik (630 p.)
ok juz dziala

Podobne pytania

0 głosów
1 odpowiedź 453 wizyt
pytanie zadane 17 grudnia 2022 w Python przez Kubas23 Użytkownik (630 p.)
0 głosów
0 odpowiedzi 57 wizyt
pytanie zadane 4 sierpnia 2023 w Python przez Kubas23 Użytkownik (630 p.)
0 głosów
0 odpowiedzi 280 wizyt
pytanie zadane 29 stycznia 2023 w Python przez Kubas23 Użytkownik (630 p.)

92,555 zapytań

141,403 odpowiedzi

319,558 komentarzy

61,940 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!

...