Странные линии появляются при изменении точки обзора на pyopenGL и pygame

поэтому я работаю над 2-мерной игрой с использованием pygame и PyopenGL, я кое-что сделал, чтобы изменить размер окна. Когда размер окна изменяется, игра изменяется вместе с ним. Это все хорошо.

Моя игра - это игра, основанная на плитке, с прокруткой вверх и вниз.

Однако проблема в том, что при изменении размера экрана при прокрутке вверх или вниз между плитками появляются странные линии. Этого не происходит при прокрутке влево или вправо, что странно. Эти линии появляются только при более высоком разрешении, при более низком разрешении их нет. Мой код довольно большой и находится в нескольких файлах, поэтому я просто опубликую ссылку на него на 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, 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


person Evelyn Mitchell    schedule 02.09.2020    source источник
comment
Если артефакты появляются только при высоком разрешении, возможно, вы наблюдаете некоторые проблемы с округлением, поэтому ответы на этот вопрос может помочь. Можете ли вы создать минимальный воспроизводимый пример? Невозможность запустить свой код затрудняет оказание помощи.   -  person import random    schedule 03.09.2020
comment
Ах, приношу свои извинения. Причина, по которой я не хотел публиковать весь свой код, заключается в том, что его много и насколько это раздует вопрос, поэтому я выбрал лучшую альтернативу. Я загрузил свой код в github, и его можно найти здесь. Надеюсь, его запуск поможет (запустите main.py для запуска игры) github.com/EvelynMitchell199/Yumi   -  person Evelyn Mitchell    schedule 03.09.2020
comment
@importrandom, если у вас есть какие-либо вопросы о связанном коде, просто спросите, там довольно много, поэтому может потребоваться время, чтобы покопаться   -  person Evelyn Mitchell    schedule 03.09.2020
comment
@importrandom Итак, я изучил это еще немного, и это определенно не ошибка округления, и я также обнаружил, что строки отображаются ТОЛЬКО в окне, а не при печати экрана. Несмотря на множество попыток, мне вообще не удавалось отобразить линии на экране печати. Это вообще помогает?   -  person Evelyn Mitchell    schedule 03.09.2020
comment
Ссылка на github правильная? Я запустил игру. Это платформер с прыжками, но без прокрутки.   -  person Mike67    schedule 03.09.2020
comment
@ Mike67: если вы отойдете от экрана вправо, камера переместится в другое место. В этой другой области экран может прокручиваться вверх и вниз,   -  person Evelyn Mitchell    schedule 03.09.2020
comment
хотя вам нужно подняться на относительно высокий холм, чтобы начать прокрутку, вероятно, следовало отметить, что @ Mike67   -  person Evelyn Mitchell    schedule 03.09.2020


Ответы (1)


Я понял, что не так с нашим кодом! Итак, в основном, когда мы устанавливаем разрешения, если разрешение не является одним из тех, которые здесь выделены зеленым, тогда все странно масштабируется, создавая линии между плитками. https://pacoup.com/2011/06/12/list-of-true-169-resolutions/

Разрешение ДОЛЖНО делиться на 8, иначе масштабирование между плитками будет другим, и, таким образом, мы сможем получить линии между плитками.

person Evelyn    schedule 03.09.2020