gpt4 book ai didi

python-3.x - Pyglet 中的相机行为

转载 作者:行者123 更新时间:2023-12-03 21:22:12 39 4
gpt4 key购买 nike

我想从您那里知道我如何确保 pyglet (2D) 中的相机始终跟随玩家并将其始终保持在屏幕中间。另外,我想知道如何使用鼠标滚轮进行线性缩放,始终将播放器固定在屏幕中间。明确地说,如果有人知道 Factorio,我希望相机的行为方式相同。我只找到了有关如何通过移动鼠标等操作的示例。不幸的是,我没有找到任何让我感兴趣的东西。

这是我目前使用的脚本:

主类(我不报告所有的脚本,而是与相机相关的部分):

def on_resize(self, width, height):
self.camera.init_gl(width, height)

def on_mouse_scroll(self, x, y, dx, dy):
self.camera.scroll(dy)

def _world(self):
self.camera = camera(self)
self.player = player(self, 0, 0)
self.push_handlers(self.player.keyboard)

相机脚本:
class camera(object):
zoom_in_factor = 1.2
zoom_out_factor = 1 / zoom_in_factor

def __init__(self, game):
self.game = game
self.left = 0
self.right = self.game.width
self.bottom = 0
self.top = self.game.height
self.zoom_level = 1
self.zoomed_width = self.game.width
self.zoomed_height = self.game.height

def init_gl(self, width, height):
self.width = width
self.height = height
glViewport(0, 0, self.width, self.height)

def draw(self):
glPushMatrix()
glOrtho(self.left, self.right, self.bottom, self.top, 1, -1)
glTranslatef(-self.game.player.sprite.x + self.width / 2, -self.game.player.sprite.y + self.height / 2, 0)
self.game.clear()
if self.game.runGame:
for sprite in self.game.mapDraw_3:
self.game.mapDraw_3[sprite].draw()
glPopMatrix()
print(self.game.player.sprite.x, self.game.player.sprite.y)

def scroll(self, dy):
f = self.zoom_in_factor if dy > 0 else self.zoom_out_factor if dy < 0 else 1
if .1 < self.zoom_level * f < 2:
self.zoom_level *= f

vx = self.game.player.sprite.x / self.width
vy = self.game.player.sprite.y / self.height

vx_in_world = self.left + vx * self.zoomed_width
vy_in_world = self.bottom + vy * self.zoomed_height

self.zoomed_width *= f
self.zoomed_height *= f

self.left = vx_in_world - vx * self.zoomed_width
self.right = vx_in_world + (1 - vx) * self.zoomed_width
self.bottom = vy_in_world - vy * self.zoomed_height
self.top = vy_in_world + (1 - vy) * self.zoomed_height

这就是我得到的:
enter image description here

这就是我想要得到的(以 Factorio 为例):

enter image description here

我现在使用的脚本是从这里获取并根据需要修改的:

How to pan and zoom properly in 2D?

但是,如您所见,我正在使用的脚本基于其他人创建的内容,我讨厌以这种方式使用某些内容,因为它不属于我。所以我使用它只是为了试验和创建我自己的相机类。这就是我寻求建议的原因。

我看过的其他例子:

https://www.programcreek.com/python/example/91285/pyglet.gl.glOrtho

https://groups.google.com/forum/#!topic/pyglet-users/g4dfSGPNCOk

https://www.tartley.com/2d-graphics-with-pyglet-and-opengl

还有其他地方我看过,但我不记得链接了

为了避免重复,是的,我查看了 pyglet 的指南,但至少我太愚蠢了(我不排除它),我没有找到任何可以帮助我理解如何去做的东西。

最佳答案

好吧,我不确定你的第一个问题,但我可以帮助缩放。

def on_mouse_scroll(self, x, y, scroll_x, scroll_y):
zoom = 1.00
if scroll_y > 0:
zoom = 1.03
elif scroll_x < 0:
zoom = 0.97

glOrtho(-zoom, zoom, -zoom, zoom, -1, 1)

关于python-3.x - Pyglet 中的相机行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50899831/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com