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

Aruba Cloud - Virtual Private Server VPS
+1 głos
351 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 (256,600 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ź 692 wizyt
pytanie zadane 17 grudnia 2022 w Python przez Kubas23 Użytkownik (630 p.)
0 głosów
0 odpowiedzi 135 wizyt
pytanie zadane 4 sierpnia 2023 w Python przez Kubas23 Użytkownik (630 p.)
0 głosów
0 odpowiedzi 374 wizyt
pytanie zadane 29 stycznia 2023 w Python przez Kubas23 Użytkownik (630 p.)

93,337 zapytań

142,332 odpowiedzi

322,423 komentarzy

62,676 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...