python - PyOpenGL 接受键盘输入
问题描述
我正在尝试使用 PyOpenGL 在 Python 中制作一个光线投射器,并且我完成了制作一个黄色的小方块。主要的是我需要键盘输入来移动我的方块,我做了一些东西,但它不起作用。这是代码:
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
import math
def drawPlayer():
glColor3f(1,1,0)
glPointSize(8)
glBegin(GL_POINTS)
glVertex2i(px,py)
glEnd()
def display():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
drawPlayer()
glutSwapBuffers()
# Here is my keyboard input code
def buttons(key,x,y):
if key == 'a':
px -= 5
if key == 'd':
px += 5
if key == 'w':
py -= 5
if key == 's':
py += 5
def init():
glClearColor(0.3,0.3,0.3,0)
gluOrtho2D(0,1024,512,0)
global px, py
px = 300; py = 300
def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(1024, 512)
window = glutCreateWindow("Raycaster in python")
init()
glutDisplayFunc(display)
glutKeyboardFunc(buttons)
glutMainLoop()
if __name__ == "__main__":
main()
为什么这段代码不起作用?
解决方案
在全局命名空间中定义px
和:py
px = 300; py = 300
def drawPlayer():
glColor3f(1,1,0)
glPointSize(8)
glBegin(GL_POINTS)
glVertex2i(px,py)
glEnd()
使用该global
语句更改button
回调中全局命名空间中的变量。使用字节前缀将 与key
字母(例如key == b'a'
)进行比较。调用glutPostRedisplay
以将当前窗口标记为需要重新显示:
def buttons(key,x,y):
global px, py
if key == b'a':
px -= 5
if key == b'd':
px += 5
if key == b'w':
py -= 5
if key == b's':
py += 5
glutPostRedisplay()
完整示例
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys
import math
px = 300; py = 300
def drawPlayer():
glColor3f(1,1,0)
glPointSize(8)
glBegin(GL_POINTS)
glVertex2i(px,py)
glEnd()
def display():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
drawPlayer()
glutSwapBuffers()
# Here is my keyboard input code
def buttons(key,x,y):
global px, py
if key == b'a':
px -= 5
if key == b'd':
px += 5
if key == b'w':
py -= 5
if key == b's':
py += 5
glutPostRedisplay()
def init():
glClearColor(0.3,0.3,0.3,0)
gluOrtho2D(0,1024,512,0)
def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(1024, 512)
window = glutCreateWindow("Raycaster in python")
init()
glutDisplayFunc(display)
glutKeyboardFunc(buttons)
glutMainLoop()
if __name__ == "__main__":
main()
推荐阅读
- twitter-bootstrap - 具有显示值的引导范围滑块
- arrays - 使用下标和线性索引分配给数组的 Julia 语言问题
- objective-c - 使用特定编码转换字符串以获得一个字符
- typescript - 不要使用 `object` 作为类型。`object` 类型目前很难使用
- mongodb - 用聚合填充 MongoDB 中二维时间序列数据的天间隙
- html - 无法将 RStudio 编入 HTML 文档
- python - 如何在 KivyMD 中更改小部件参数的值
- javascript - 用出现的javascript计算字长
- android - 购物车项目与供应商一起添加,但在离开产品详细信息屏幕时被删除 (Flutter)
- powerbi - CALCULATE、SUM、MAX 和 <= 如何在逻辑上适用于累计总数?