首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏中如何使圆圈在屏幕上正确显示的问题

游戏中如何使圆圈在屏幕上正确显示的问题
EN

Stack Overflow用户
提问于 2022-03-05 13:36:03
回答 1查看 54关注 0票数 1

我觉得我对皮克的理解有点弱。对于代码的复杂性(因为这是由老师给出的),或者简单地说,我至少可以让障碍变得明显,我将非常感激。

代码语言:javascript
复制
def draw(screen, background, boids, obstaclearray):
    
    #redrawing the whole window
    
    boids.clear(screen, background)
    dirty = boids.draw(screen)
    for element in obstaclearray:
        pygame.draw.circle(screen, (255,255,255), (element.x, element.y), element.radius)

    pygame.display.update(dirty)

上面是我实际画的地方,并试图画圆圈。CircularObstacle类是一个非常简单的类,如下所示:

代码语言:javascript
复制
import pygame
class CircularObstacle():
    def __init__(self, x, y, radius): #MAYBE ADD A SIZE 
        self.x = x
        self.y = y
        self.radius = radius

问题是,这个圆圈只有在机器人经过它的时候才画出来,这真的很奇怪。我认为这与游戏的设置方式以及表面和所有东西有关,下面是所有的主要代码。当然,障碍并不像预期的那样起作用,但我计划以后修复它,首先,我想至少有一个圆圈来展示。以下是我的完整代码,因为我认为它对于解决这个问题至关重要:

代码语言:javascript
复制
import pygame
from pygame.locals import *
import argparse
import sys
from boid import Boid 
from Obstacle import CircularObstacle



def add_boids(boids,num_boids):
    for boid in range (num_boids):
        boids.add(Boid())
        
        


def update(dt, boids):
    
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit(0)
        elif event.type == KEYDOWN:
            mods = pygame.key.get_mods()
            if event.key == pygame.K_q:
                # quit
                pygame.quit()
                sys.exit(0)
            elif event.key == pygame.K_UP:
                # add boids
                if mods & pygame.KMOD_SHIFT:
                    add_boids(boids, 100)
                else:
                    add_boids(boids, 10)
            elif event.key == pygame.K_DOWN:
                # remove boids
                if mods & pygame.KMOD_SHIFT:
                    boids.remove(boids.sprites()[:100])
                else:
                    boids.remove(boids.sprites()[:10])

    
    #ADD STUFF LIKE THE SLIDER AND STUFF
    
    for b in boids:
        b.update(dt, boids)
        

def draw(screen, background, boids, obstaclearray):
    
    #redrawing the whole window
    
    boids.clear(screen, background)
    dirty = boids.draw(screen)
    for element in obstaclearray:
        pygame.draw.circle(screen, (255,255,255), (element.x, element.y), element.radius)

    pygame.display.update(dirty)
    
    
    
 
default_boids = 0
default_geometry = "1000x1000"

# Initialise pygame.
pygame.init()



pygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN, pygame.KEYUP])

# keep a good framerate so the graphics are better
fps = 60.0
fpsClock = pygame.time.Clock()

# Set up pygamme window
window_width, window_height = 800,600
flags = DOUBLEBUF

screen = pygame.display.set_mode((window_width, window_height), flags)
screen.set_alpha(None)
background = pygame.Surface(screen.get_size()).convert()
background.fill(pygame.Color('black'))

boids = pygame.sprite.RenderUpdates()


add_boids(boids, default_boids)

obstaclearray = []
defaultcircleobstacle = CircularObstacle(200,200,13)
obstaclearray.append(defaultcircleobstacle)
#The "game loop"
dt = 1/fps  # here dt means the amount of time elapsed since the last frame 

#it seems like thie is a forever loop but in reality this is not since in the update method we provide functinality to quit the program
while True:
    update(dt, boids)
    draw(screen, background, boids, obstaclearray)
    dt = fpsClock.tick(fps)   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-05 13:45:44

当您调用pygame.display.update()时,您有两个选项。您可以在没有任何参数的情况下调用它。在本例中,将更新整个屏幕。

代码语言:javascript
复制
pygame.display.update()

或者用需要更新的矩形区域列表来调用它。在这种情况下,只更新矩形区域。

代码语言:javascript
复制
pygame.display.update(rect_list) 

您可以执行第二个选项,但是绘制圆圈的区域不在dirty列表中,因此该区域不会更新。

pygame.display.update(脏)

要么用pygame.display.update()更新整个屏幕,要么将圆圈区域添加到dirty列表中:

代码语言:javascript
复制
def draw(screen, background, boids, obstaclearray):
    
    boids.clear(screen, background)
    dirty = boids.draw(screen)
    for element in obstaclearray:
        dirty_rect = pygame.draw.circle(screen, (255,255,255), (element.x, element.y), element.radius)
        dirty.append(dirty_rect)

    pygame.display.update(dirty)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71362621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档