【问题标题】:How to Spawn additional Rectangles in Pygame?如何在 Pygame 中生成额外的矩形?
【发布时间】:2017-10-22 10:13:12
【问题描述】:

我正在创建一个简单的游戏,但遇到了一个问题。

游戏是这样的: “白色方块”吃掉“绿色方块”

问题:
每次“白色方块”吃掉“绿色方块”时,我怎样才能产生“新红色方块”并留在屏幕上?

代码如下:

import pygame, sys
from random import randint
from pygame.locals import*


pygame.init()
gameDisplay = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Square-it")
clock = pygame.time.Clock()

"Green Square"
green_x = randint(10, 780)
green_y = randint(10, 580)
green_width = 15
green_height = 15
green_color = pygame.Color("green")
green = pygame.Rect(green_x, green_y, green_width, green_height)

"Red Square"
red_x = randint(20, 780)
red_y = randint(20, 580)
red_width = 10
red_height = 10
red_color = pygame.Color("red")
red = pygame.Rect(red_x, red_y, red_width, red_height)

"White Square"
white_x = 400
white_y = 300
white_width = 10
white_height = 10
white_color = pygame.Color("white")
white = pygame.Rect(white_x, white_y, white_width, white_height)

while True:

    clock.tick(60)
    gameDisplay.fill((0, 20, 5))
    gameDisplay.fill(white_color, white)
    gameDisplay.fill(green_color, green)
    gameDisplay.fill(red_color, red)
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
           sys.exit()

    '''When White eats Green, Green regenerates'''
    if white.colliderect(green):
        green = pygame.Rect(randint(10, 780), randint(10, 580), green_width, green_height)

    '''White Square Movement'''
    keys = pygame.key.get_pressed()
    if keys[K_LEFT]:
        white.left = white.left - 10

    if keys[K_RIGHT]:
        white.right = white.right + 10

    if keys[K_UP]:
        white.top = white.top - 10

    if keys[K_DOWN]:
        white.bottom = white.bottom + 10

【问题讨论】:

    标签: python python-3.x random pygame


    【解决方案1】:

    你应该首先创建一个数组来存储你所有的红色矩形实例

    red_square_list = []
    

    当你的白色矩形碰撞绿色矩形时,你应该提取绿色矩形的 x,y 位置,并在这个位置创建一个红色矩形的实例。

    为此,我建议使用类,但首先您可以创建一个函数来创建一个红色矩形:

    def create_red_square(x, y)
        red_width = 10
        red_height = 10
        red_color = pygame.Color("red")
        red = pygame.Rect(red_x, red_y, red_width, red_height)
        return red
    

    现在,每次白色与绿色碰撞时,您都必须提取绿色矩形位置并使用上面的函数显示一个红色:

    if white.colliderect(green):
        pos_x, pos_y = green.left, green.top
        green = pygame.Rect(randint(10, 780), randint(10, 580), green_width, green_height)
        red_square_list.append(create_red_square(pos_x, pos_y))
    

    最后一行仅用于存储红色矩形,如果您想稍后使用它们(就像您对绿色/白色矩形所做的那样)

    希望对你有帮助

    编辑 #1:

    我犯了一些小错误是以前的代码,这是一个可行的解决方案:

    ` 导入pygame,系统 从随机导入 randint 从 pygame.locals 导入*

    red_square_list = []
    
    pygame.init()
    gameDisplay = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("Square-it")
    clock = pygame.time.Clock()
    red_color = pygame.Color("red")
    
    "Green Square"
    green_x = randint(10, 780)
    green_y = randint(10, 580)
    green_width = 15
    green_height = 15
    green_color = pygame.Color("green")
    green = pygame.Rect(green_x, green_y, green_width, green_height)
    
    def create_red_square(x, y):
        """Return one instance of Rect at position x, y"""
        red_width = 10
        red_height = 10
        red = pygame.Rect(x, y, red_width, red_height)
        return red
    
    "White Square"
    white_x = 400
    white_y = 300
    white_width = 10
    white_height = 10
    white_color = pygame.Color("white")
    white = pygame.Rect(white_x, white_y, white_width, white_height)
    
    while True:
    
        clock.tick(60)
        gameDisplay.fill((0, 20, 5))
        gameDisplay.fill(white_color, white)
        gameDisplay.fill(green_color, green)
        for each in red_square_list: #display all red rect
            gameDisplay.fill(red_color, each)
        pygame.display.update()
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
               sys.exit()
    
        '''When White eats Green, Green regenerates'''
        if white.colliderect(green):
            # extract green rect position
            pos_left, pos_top = green.left, green.top 
            # store the new red rectangle in the array
            red_square_list.append(create_red_square(pos_left+2, pos_top+2))
            # +2 is required as red square are 10x10 and green 15x15
            # new rect green
            new_left = randint(10, 780)
            new_top = randint(10, 580)
            green = pygame.Rect(new_left, new_top, green_width, green_height)
    
    
        '''White Square Movement'''
        keys = pygame.key.get_pressed()
        if keys[K_LEFT]:
        white.left = white.left - 10
    
        if keys[K_RIGHT]:
            white.right = white.right + 10
    
        if keys[K_UP]:
            white.top = white.top - 10
    
        if keys[K_DOWN]:
            white.bottom = white.bottom + 10
    

    希望对你有帮助

    【讨论】:

    • 感谢 Nicolas M. 的努力,不幸的是我试过了,但它仍然对我不起作用:/
    • 有没有办法,当白色碰撞绿色时,在屏幕上随机生成一个新的红色方块并保持在它的位置?
    • 对不起,我犯了 2 个错误(正方形的位置不正确,要移动 2px),我忘了添加一个循环来显示它们并声明函数中的颜色。现在可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2020-12-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多