在 pyopenGL 和 pygame 上更改视点时出现奇怪的线条
Weird lines show up when changing the viewpoint on pyopenGL and pygame
所以我正在使用 pygame 和 PyopenGL 开发一个 2d 游戏,我做了一些事情来制作它所以 window 可以调整大小。当 window 调整大小时,游戏也会随之调整大小。这一切都很好。
我的游戏是一个基于图块的游戏,可以上下滚动。
但是,问题是,当我调整屏幕大小时,如果向上或向下滚动,图块之间会出现奇怪的线条。向左或向右滚动时不会发生这种情况,这很奇怪。这些线只在高分辨率下出现,在低分辨率下它们不存在。我的代码相当大并且在多个文件中,所以我将在 github 上 post 一个 link 到它,但这是我的 window 带有调整大小功能的代码:
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()
这是我的完整代码 link:github.com/EvelynMitchell199/Yumi
我发现我们的代码出了什么问题!所以,基本上当我们设置分辨率时,如果分辨率不是此处以绿色突出显示的分辨率之一,那么所有内容都会奇怪地缩放,从而在图块之间创建线条。 https://pacoup.com/2011/06/12/list-of-true-169-resolutions/
分辨率必须能被 8 整除,否则图块之间的比例会不同,因此我们可以得到图块之间的线。
所以我正在使用 pygame 和 PyopenGL 开发一个 2d 游戏,我做了一些事情来制作它所以 window 可以调整大小。当 window 调整大小时,游戏也会随之调整大小。这一切都很好。
我的游戏是一个基于图块的游戏,可以上下滚动。
但是,问题是,当我调整屏幕大小时,如果向上或向下滚动,图块之间会出现奇怪的线条。向左或向右滚动时不会发生这种情况,这很奇怪。这些线只在高分辨率下出现,在低分辨率下它们不存在。我的代码相当大并且在多个文件中,所以我将在 github 上 post 一个 link 到它,但这是我的 window 带有调整大小功能的代码:
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()
这是我的完整代码 link:github.com/EvelynMitchell199/Yumi
我发现我们的代码出了什么问题!所以,基本上当我们设置分辨率时,如果分辨率不是此处以绿色突出显示的分辨率之一,那么所有内容都会奇怪地缩放,从而在图块之间创建线条。 https://pacoup.com/2011/06/12/list-of-true-169-resolutions/
分辨率必须能被 8 整除,否则图块之间的比例会不同,因此我们可以得到图块之间的线。