I’m trying to make a raycaster in Python with PyOpenGL and i accomplished to make a little yellow square. Main thing is that i need keyboard input to move my square and i made something but it is not working. Here is the code:
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()
Why this code is not working?
Advertisement
Answer
Define px
and py
in global namespace:
px = 300; py = 300 def drawPlayer(): glColor3f(1,1,0) glPointSize(8) glBegin(GL_POINTS) glVertex2i(px,py) glEnd()
Use the global
statement to change the variables in the global namespace within the button
callback. Use the bytesprefix to compare the key
to a letter (e.g. key == b'a'
). Invoke glutPostRedisplay
to mark the current window as needing to be redisplayed:
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()
Complete example
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()