【问题标题】:Weird lines show up when changing the viewpoint on pyopenGL and pygame在 pyopenGL 和 pygame 上更改视点时出现奇怪的线条
【发布时间】:2020-09-02 21:07:25
【问题描述】:

所以我正在使用 pygame 和 PyopenGL 开发 2d 游戏,我已经做了一些事情来制作它,以便窗口可以调整大小。当窗口调整大小时,游戏也会随之调整大小。这一切都很好。

我的游戏是一个基于图块的游戏,可以上下滚动。

但是,问题是,当我调整屏幕大小时,如果我向上或向下滚动,图块之间会出现奇怪的线条。向左或向右滚动时不会发生这种情况,这很奇怪。这些线条仅在高分辨率下出现,在较低分辨率下它们不存在。我的代码相当大并且在多个文件中,所以我将在 github 上发布一个指向它的链接,但这里是我的带有 resize 功能的窗口代码:

import numpy

import pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *

from . import batch
from . import GAH


class window_handler:
    def __init__(self,window_size=(640,360)):
        self.window_size = window_size
        self.main_window = pygame.display.set_mode(self.window_size, DOUBLEBUF|OPENGL|RESIZABLE)
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glViewport(0, 0, self.window_size[0], self.window_size[1])
        
        self.projection_matrix = numpy.array((
                (2/640, 0, 0, 0),
                (0, -2/360, 0, 0),
                (0, 0, 1, 0),
                (0, 0, 0, 1)
            ), numpy.float32)

        self.view_matrix = numpy.array((
                (1, 0, 0, 0),
                (0, 1, 0, 0),
                (0, 0, 1, 0),
                (-320, -180, 0, 1)
            ), numpy.float32)

        self.view_projection_matrix = numpy.dot(self.view_matrix,self.projection_matrix)
        batch.setup_shaders(vpMatrix = self.view_projection_matrix)
        self.renderer = batch.Batch()

    def rezise_request(self, event):
        self.window_size = event.w,event.h
        glViewport(0, 0, self.window_size[0], self.window_size[1])
        
    def update_display(self):
        pygame.display.flip()

    def draw_game(self,draw):
        glClearColor(0, 0, 0, 1)
        glClear(GL_COLOR_BUFFER_BIT)

        self.renderer.begin()
        
        for i in draw["background_0"]:
            self.renderer.draw(self.graphics_handler["Background_images"][i[1]][0],i[0][0],i[0][1])
        for i in draw["background_1"]:
            self.renderer.draw(self.graphics_handler["Background_images"][i[1]][0],i[0][0],i[0][1])
        for i in draw["background_2"]:
            self.renderer.draw(self.graphics_handler["Background_images"][i[1]][0],i[0][0],i[0][1])
        for i in draw["background_3"]:
            self.renderer.draw(self.graphics_handler["Background_images"][i[1]][0],i[0][0],i[0][1])

        for i in draw["tile_layer"]:
            self.renderer.draw(self.graphics_handler["Tileset"]["tileset_"+str(i[1][1])][i[1][0]],i[0][0],i[0][1])

        for i in draw["entity"].values():
            if i[1] != None:
                image = self.graphics_handler["Sprites"][i[1]][0]
                
                self.renderer.draw(image,i[0][0],i[0][1],i[2])
        self.renderer.end()

    def quit(self):
        self.renderer.delete()
        

        
        

这是我的代码的完整链接:github.com/EvelynMitchell199/Yumi

【问题讨论】:

  • 如果人工制品仅以高分辨率出现,您可能会看到一些舍入问题,因此回答 this question 可能会有所帮助。你能创建一个minimal reproducible example吗?由于无法运行您的代码,因此很难提供帮助。
  • 啊,抱歉。我不想发布所有代码的原因是有多少代码以及它会使问题膨胀多少,所以我选择了最好的选择。我已经将我的代码上传到了 github 并且可以在这里找到,我希望能够运行它有帮助(运行 main.py 来运行游戏)github.com/EvelynMitchell199/Yumi
  • @importrandom 如果您对链接代码有任何疑问,请直接询问,那里有很多内容,因此可能需要一段时间才能深入了解
  • @importrandom 所以,我仔细研究了一下,它绝对不是舍入错误,而且我还发现这些行只显示在窗口上,而不是在我打印屏幕时。尽管进行了多次尝试,但我根本无法让这些线条出现在打印屏幕上。这有帮助吗?
  • github链接是否正确?我跑了游戏。这是一个有跳跃但没有滚动的平台游戏。

标签: opengl pygame pyopengl window-resize


【解决方案1】:

我发现我们的代码有什么问题!因此,基本上,当我们设置分辨率时,如果分辨率不是此处以绿色突出显示的分辨率之一,那么一切都会奇怪地缩放,在图块之间创建线条。 https://pacoup.com/2011/06/12/list-of-true-169-resolutions/

分辨率必须能被 8 整除,否则图块之间的缩放比例会不同,因此我们可以得到图块之间的线。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2016-07-06
    • 2022-08-07
    相关资源
    最近更新 更多