OpenGL with PyOpenGL Python and PyGame p.4-Moving the player automatically towards the cube
2016-03-15 19:39
519 查看
Moving the player automatically towards the cube
Since we're trying to make a 3D PyOpenGL version of our previous game, we want the cube to just start coming at us. We of cour4000
se will soon want many cubes, but let's just start with
one for now.
This tutorial is fairly simplistic, we just need to make the cube come at us, and we need to be able to know where we are in reference to the camera.
Now the beginning of our main function should look like this (Note the commented areas as areas of change that you might not notice)
def main(): pygame.init() display = (800,600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) gluPerspective(45, (display[0]/display[1]), 0.1, 50.0) #start further back glTranslatef(random.randrange(-5,5),0, -30) # no more rotate #glRotatef(25, 2, 1, 0) object_passed = False
So we've commented out the rotation, and we've started back a bit further. We also have set a variable to false that asks if the object has passed us yet.
Next:
while not object_passed: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: glTranslatef(-0.5,0,0) if event.key == pygame.K_RIGHT: glTranslatef(0.5,0,0) if event.key == pygame.K_UP: glTranslatef(0,1,0) if event.key == pygame.K_DOWN: glTranslatef(0,-1,0) ''' if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 4: glTranslatef(0,0,1.0) if event.button == 5: glTranslatef(0,0,-1.0) '''
Note that we've commented out the zooming ability, since that's not quite what we want, though we could allow the user later to speed up/slow down slightly. This would make a lot of
sense is coverage space and time is somehow made important in our game.
Also note that our movement according to key-presses has changed.
That code basically handles our navigation, but we also know we want to know once the cube has passed us. To do this, we need to know where we are. We are the ones moving (remember
my question? Did you get it right?). We can store where we have placed the cubes, now we want to know how to acquire our own location:
x = glGetDoublev(GL_MODELVIEW_MATRIX)
This will give us our modelview matrix, which contains our X, Y, and Z coordinates! The following are our actual coordinates:
camera_x = x[3][0] camera_y = x[3][1] camera_z = x[3][2]
Now, we can wrap up our code with:
glTranslatef(0,0,0.5) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) Cube() pygame.display.flip() if camera_z <= 0: object_passed = True for x in range(10): main()
Here, we're slowly moving with the glTranslate, and then performing the typical code, followed by a final if statement asking if we've passed the point of the cube. If we have, then
we basically are just restarting the instance.
#!/usr/bin/python # -*- coding:utf-8 -*- import pygame from pygame.locals import * import random from OpenGL.GL import * from OpenGL.GLU import * verticies = ( (1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1), (1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1) ) edges = ( (0,1), (0,3), (0,4), (2,1), (2,3), (2,7), (6,3), (6,4), (6,7), (5,1), (5,4), (5,7) ) surfaces = ( (0,1,5,4), #创建平面时平面的顺序不一定要相临,但是每个面的顶点一定要按顺时针或者逆时针写 (5,4,6,7), (6,7,2,3), (2,7,5,1), (0,1,2,3), (0,3,6,4) ) colors = ( (1,0,0), (0,1,0), (0,0,1), (1,1,0), (1,0,1), (1,1,1), (1,0,0), (0,1,0), (0,0,1), (1,0,0), (1,1,1), (0,1,1), ) def Cube(): glBegin(GL_QUADS) x = 0 for surface in surfaces: x+=1 for vertex in surface: glColor3fv(colors[x]) glVertex3fv(verticies[vertex]) glEnd() glBegin(GL_LINES) for edge in edges: for vertex in edge: glVertex3fv(verticies[vertex]) glEnd() def main(): pygame.init() #pygame的一些初始化不用管 display = (800,600) pygame.display.set_mode(display, DOUBLEBUF|OPENGL) gluPerspective(45,(display[0]/display[1]), 0.5, 50.0) #参数1是我们看显示物体的远近 #参数2是物体显示的长宽比,和窗口长宽比相同就行 #参数3和4是z轴近和远的裁剪面的距离,但是还是不太明白要这干啥 #glTranslatef(0.0,0.0, -5) #Z轴就是我们眼睛到屏幕方向的轴,负是远,正是近,其实就是让物体相对与屏幕在XYZ各方向移动几个距离 #start further back glTranslatef(0,0, -30) #glRotatef(360, 1, 1, 1) #360是让他转360度,它最终回到原来初始位置 object_passed = False while not object_passed: #如果camera_z 的距离小于某个值则跳出循环 for event in pygame.event.get(): if event.type == pygame.QUIT: #退出事件响应 pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: glTranslatef(-0.5,0,0) if event.key == pygame.K_RIGHT: glTranslatef(0.5,0,0) if event.key == pygame.K_UP: glTranslatef(0,1,0) if event.key == pygame.K_DOWN: glTranslatef(0,-1,0) x = glGetDoublev(GL_MODELVIEW_MATRIX) #X=[[a,0,0,0],[0,a,0,0],[0,0,a,0],[X,Y,Z,a]] camera_x = x[3][0] camera_y = x[3][1] camera_z = x[3][2] #这里是camera 视角,z表示物体距离屏幕有多远是正值 #print x[3] glTranslatef(0,0,0.01) if camera_z <= 2: #如果camera_z 的距离小于某个值则跳出循环 object_passed = True #glRotatef(10, 0, 0, 1) #参数1是每次旋转的度数是多少, #参数2是x, y and z的一个坐标,表示从(0,0,0)点到(x,y,z)这条线为轴进行旋转 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) #用来删除就得画面,清空画布 Cube() #创建模型 pygame.display.flip() #显示画面 pygame.time.wait(10) #10ms刷新一次 main()
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法