【问题标题】:How can I spawn ranctangles in different positions? [duplicate]我怎样才能在不同的位置产卵? [复制]
【发布时间】:2021-12-26 21:13:22
【问题描述】:
import pygame
import time
import random
pygame.init()

### VARIABLES ###
# spaceship
MOVEMENT_SPEED = 6
SPACESHIP_WIDTH, SPACESHIP_HEIGHT = 70, 40
RECT_WIDTH, RECT_HEIGHT = 30, 30

# window
GRAVITY = 1
FPS = 60
WIDTH, HEIGHT = 700, 900
WIN = pygame.display.set_mode((WIDTH, HEIGHT))


#colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
GRAY = (50, 50, 50)


# spacesgips
SPACESHIP = pygame.image.load('block_game\\Assets\\space_ship.png')
SPACESHIP = pygame.transform.scale(surface=SPACESHIP, size=(SPACESHIP_WIDTH, SPACESHIP_HEIGHT))
SPACESHIP = pygame.transform.rotate(surface=SPACESHIP, angle=90)
# background
BG = pygame.image.load('block_game\\Assets\\background.jpg')
BG = pygame.transform.scale(BG, (WIDTH, HEIGHT))

# random
rand_width = random.randint(0, WIDTH - SPACESHIP_WIDTH) 
rand_height = random.randint(0, HEIGHT - 500)


# rects
RECT_WIDTH, RECT_HEIGHT = 30, 30
rand_rect = pygame.Rect(rand_width, rand_height, RECT_WIDTH, RECT_HEIGHT)


list_colors = [WHITE]#, BLACK, RED, YELLOW, GRAY]
rand_color = random.choice(list_colors)

### VARIANLES ###

这正是我处理移动的方式,因此角色不会移出屏幕。

def handle_movement(keys_pressed, spaceship_rect):
    if keys_pressed[pygame.K_a] and spaceship_rect.x > 0:
        spaceship_rect.x -= MOVEMENT_SPEED

    if keys_pressed[pygame.K_d] and spaceship_rect.x < WIDTH - 40:
        spaceship_rect.x += MOVEMENT_SPEED
    
    if keys_pressed[pygame.K_w] and spaceship_rect.y > 600:
        spaceship_rect.y -= MOVEMENT_SPEED

    if keys_pressed[pygame.K_s] and spaceship_rect.y < HEIGHT - 75:
        spaceship_rect.y += MOVEMENT_SPEED
    
    #print(spaceship_rect)
    

如果我与积木发生碰撞,例如失去生命,我打算做点什么。

# checking for collision
def collision_check(spaceship_rect):
    if spaceship_rect.colliderect(rand_rect):
        print("collide")
        

这是我尝试在一些随机位置生成一些矩形的方式。

def drawing_blocks(): 
    pygame.draw.rect(WIN, rand_color, pygame.Rect(rand_rect)) # draw rect
    rand_rect.y += 1
    print(rand_rect.y) 
    
    if rand_rect.y == HEIGHT:
        # and here i want to draw a new block like before
        pass

这对我也不起作用,我想使用 random 模块生成 3-5 个方块,但在不同的位置。

def draw_window(spaceship_rect):
    WIN.fill(WHITE) # backgorund
    WIN.blit(BG, (0, 0)) # backgorund
    WIN.blit(source=SPACESHIP, dest=(spaceship_rect)) # spaceship
    
    drawing_blocks()
    pygame.display.update()

主循环

def main(): 
    clock = pygame.time.Clock()
    spaceship_rect = pygame.Rect(300, 800, SPACESHIP_WIDTH ,SPACESHIP_HEIGHT)
    
    run = True
    while run:
        clock.tick(FPS)

        for event in pygame.event.get(): # quit funktion
            if event.type == pygame.QUIT:
                run = False
                pygame.quit()

        

        # updateing game 
        keys_pressed = pygame.key.get_pressed() # checking if any key is pressed
        
        
        handle_movement(keys_pressed, spaceship_rect)
        draw_window(spaceship_rect)
        collision_check(spaceship_rect)

    pygame.quit()


if __name__ == '__main__':
    main()

this is how i want the rectangles to be

【问题讨论】:

标签: python pygame rectangles


【解决方案1】:

在变量中保存随机矩形/颜色永远不会起作用,因为它的随机部分永远不会重新生成,它将始终保持不变。因此,您应该在每次调用该函数时生成一个随机矩形。

def get_rand_rect():
    rand_width = random.randint(0, 660) 
    rand_height = random.randint(0, 400) 
    rand_rect=pygame.Rect(rand_width, rand_height, 30, 30)
    return rand_rect

def drawing_blocks():
    for rect in rand_rects
        pygame.draw.rect(WIN, rand_color, rect) # draw rect
        rect.y += 1
        print(rect.y) 
    
        if rect.y == HEIGHT:
            index=rand_rects.index(rect)
            rects.remove(rect)
            new_rect=get_rand_rect()
            rand_rects.insert(index,new_rect)

以下示例将绘制rand_rects 中的所有矩形,将它们向下移动1 个像素,如果其中一个到达HEIGHT,它将与一个新的交换。当然,您应该在设置中添加一个填充有起始矩形的rand_rects 列表。

【讨论】:

  • 我有完全相同的想法,但现在它只是在每次屏幕刷新时在任何地方绘制随机矩形,它应该同时只绘制 1-5 个,然后如果一个在屏幕外(如果rand_rect.y == HEIGHT) 新的重生。感谢您的回复并帮助我完成我的主要项目。
  • @Kelvi919 更新了答案。这是你需要的吗?
  • 就在您的标题中,在您定义 rand_rect 的地方。
  • thx 这就像我现在需要的那样工作,我只需要使用 time.sleep 代码生成它们,而不会停止游戏运行。再次感谢。
  • 如果你不介意在 discord 上再有 1 个朋友加我 Kelvi919#4698 ^^
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 2020-10-25
  • 1970-01-01
  • 2018-07-09
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多