在pyopenGL和pygame上更改视点时会出现奇怪的行

问题描述

所以我正在使用pygame和PyopenGL进行2D游戏,我做了一些工作来使窗口可调整大小。当窗口调整大小时,游戏随之调整大小。很好。

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

但是,问题是,当我调整屏幕大小时,如果向上或向下滚动,则磁贴之间会出现奇怪的线条。向左或向右滚动时不会发生这种情况,这很奇怪。这些线仅在较高的分辨率下显示,而在较低的分辨率下则不存在。我的代码很大,有多个文件,因此我将其链接发布到github上,但这是带有调整大小功能的窗口代码

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,self.window_size[0],self.window_size[1])
        
        self.projection_matrix = numpy.array((
                (2/640,0),(0,-2/360,1,1)
            ),numpy.float32)

        self.view_matrix = numpy.array((
                (1,(-320,-180,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,self.window_size[1])
        
    def update_display(self):
        pygame.display.flip()

    def draw_game(self,draw):
        glClearColor(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][1])
        for i in draw["background_2"]:
            self.renderer.draw(self.graphics_handler["Background_images"][i[1]][0],i[0][1])
        for i in draw["background_3"]:
            self.renderer.draw(self.graphics_handler["Background_images"][i[1]][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][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][1],i[2])
        self.renderer.end()

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

        
        

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

解决方法

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

分辨率必须除以8,否则图块之间的缩放比例将有所不同,因此我们可以获得图块之间的线条。