00:目录
- 01:介绍
- 02:资源
- 02.01:准备
- 02.02:参考
- 03:上代码
- 04:效果
- 05:尾声
- 05.01:对于网友
- 05.02:对于列位转发爱好者
- 05.03:最后
01:介绍
一天,小编没事干,想做一个游戏,于是参考了大量内容,制作了这个飞行模拟器。
02:资源
02.01:准备
1、python
python IDLE (3.7 32-bit)
其他版本没有太大影响
2、panda3d(python库)
pip安装方法
pip3 install panda3d
02.02:参考
1、panda3d
panda3d官网
谷歌翻译
2、三角学
大学数学-平面三角学.pdf
03:上代码
from math import pi, sin, cos
from direct.showbase.ShowBase import ShowBase
from direct.showbase import DirectObject
from direct.task import Task
from direct.actor.Actor import Actor
from direct.interval.IntervalGlobal import Sequence
from panda3d.core import *
from direct.gui.DirectGui import *
from direct.gui.OnscreenText import OnscreenText
from direct.gui.OnscreenImage import OnscreenImageclass MyApp(ShowBase): def __init__(self):ShowBase.__init__(self)# 禁用鼠标self.disableMouse()#隐藏鼠标props = WindowProperties()props.setCursorHidden(True)base.win.requestProperties(props)#设定摄像机初始位置self.camera.setPos(0,0,100)# 载入环境模型self.environ = self.loader.loadModel("models/environment")# 设置环境模型的父实例self.environ.reparentTo(self.render)# 对模型进行比例及位置调整self.environ.setScale(0.25, 0.25, 0.25)self.environ.setPos(-8, 42, 0)# 通知任务管理器调用SpinCameraTask控制相机self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")# 载入熊猫角色self.pandaActor = Actor("models/panda-model",{"walk": "models/panda-walk4"})self.pandaActor.setScale(0.005, 0.005, 0.005)self.pandaActor.reparentTo(self.render)# 动画循环self.pandaActor.loop("walk")# 创建四幕PosInterval1 = self.pandaActor.posInterval(13,Point3(0, -10, 0),startPos=Point3(0, 10, 0))PosInterval2 = self.pandaActor.posInterval(13,Point3(0, 10, 0),startPos=Point3(0, -10, 0))HprInterval1 = self.pandaActor.hprInterval(3,Point3(180, 0, 0),startHpr=Point3(0, 0, 0))HprInterval2 = self.pandaActor.hprInterval(3,Point3(0, 0, 0),startHpr=Point3(180, 0, 0))# 创建情节并运行四幕2self.pandaPace = Sequence(PosInterval1,HprInterval1,PosInterval2,HprInterval2,name="pandaPace")self.pandaPace.loop()#创建HUDglobal X1,X2,text,text2,L1,L2l,L2rtext=OnscreenText(fg=(255,255,0,255),pos=(-0.1,-0.1),scale=0.1,mayChange=True)text2=OnscreenText(pos=(-0.7,0),scale=0.1,mayChange=True)DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.04,0.04,-0.002,0.002),pos=(0,0,0))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.002,0.002,-0.04,0.04),pos=(0,0,0))X1=DirectFrame(frameColor=(0,0,0,255),frameSize=(-0.04,0.04,-0.002,0.002),pos=(0,0,0))X2=DirectFrame(frameColor=(0,0,0,255),frameSize=(-0.002,0.002,-0.04,0.04),pos=(0,0,0))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.5,-0.51,0.5,-0.5),pos=(0,0,0))L1=DirectFrame(frameColor=(255,255,0,255),frameSize=(0.2,0.11,0.005,-0.005),pos=(0,0,0))L2l=DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.1,-0.04,0.002,-0.002),pos=(0,0,0))L2r=DirectFrame(frameColor=(255,255,0,255),frameSize=(0.04,0.1,0.002,-0.002),pos=(0,0,0))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.1,0.1,0.002,-0.002),pos=(0,0,0.5))DirectFrame(frameColor=(255,255,0,255),frameSize=(-0.1,0.1,0.002,-0.002),pos=(0,0,-0.5))# 定义旋转相机def spinCameraTask(self, task):(mouse,size)=(base.win.getPointer(0),self.get_size())(mx0,my0)=(size[0]-mouse.getX(),mouse.getY())(mx,my,hpr)=(mx0/160,my0/160,self.camera.getHpr())(rx,ry)=(mx-size[0]/320+hpr[0],my-size[1]/320+hpr[1])pos=self.camera.getPos()(lx,ly,lz)=(pos[0],pos[1],pos[2])(angle,angle2)=(hpr[0],hpr[1])distance=0.2if angle<0:while angle<0:angle=angle+360else:angle=angle%360if angle2<0:while angle2<0:angle2=angle2+360else:angle2=angle2%360distance2=cos(angle2*pi/180)*distanceif angle%90==0:if angle==0:(x,y)=(0,distance2)elif angle==90:(x,y)=(distance2,0)elif angle==180:(x,y)=(0,-distance2)else:(x,y)=(-distance2,0)else:if angle<=45:x=sin(angle*pi/180)*distance2y=cos(angle*pi/180)*distance2elif angle<90:angle=90-anglex=cos(angle*pi/180)*distance2y=sin(angle*pi/180)*distance2elif angle<=135:angle=angle-90x=cos(angle*pi/180)*distance2y=-sin(angle*pi/180)*distance2elif angle<180:angle=180-anglex=sin(angle*pi/180)*distance2y=-cos(angle*pi/180)*distance2elif angle<=225:angle=angle-180x=-sin(angle*pi/180)*distance2y=-cos(angle*pi/180)*distance2elif angle<270:angle=270-anglex=-cos(angle*pi/180)*distance2y=-sin(angle*pi/180)*distance2elif angle<315:angle=angle-270x=-cos(angle*pi/180)*distance2y=sin(angle*pi/180)*distance2else:angle=360-anglex=-sin(angle*pi/180)*distance2y=cos(angle*pi/180)*distance2if angle2%90==0:if angle2==0 or angle2==90:z=distanceelse:z=0else:if angle2<=45:z=sin(angle2*pi/180)*distanceelif angle2<90:angle2=90-angle2z=cos(angle2*pi/180)*distanceelif angle2<=135:angle2=angle2-90z=cos(angle2*pi/180)*distanceelif angle2<180:angle2=180-angle2z=sin(angle2*pi/180)*distanceelif angle2<=225:angle2=angle2-180z=-sin(angle2*pi/180)*distanceelif angle2<270:angle2=270-angle2z=-cos(angle2*pi/180)*distanceelif angle2<315:angle2=angle2-270z=-cos(angle2*pi/180)*distanceelse:angle2=360-angle2z=-sin(angle2*pi/180)*distanceif lz<-1:self.closeWindow(self.win)raise RuntimeError('You crash the grund!')self.camera.setPos(-x+lx,y+ly,z+lz)self.camera.setHpr(rx,ry,0)if ry>=360:while ry>=360:ry=ry-360elif ry<0:while ry<0:ry=ry+360if ry//180==0:ry=ryelif ry//180==1:ry=ry-360L2l.setPos(0,0,ry/180)L2r.setPos(0,0,ry/180)b=size[1]/2a=mouse.getX()/b-size[0]/size[1],0,1-mouse.getY()/bX1.setPos(a)X2.setPos(a)text['text']=str(int(ry))text2['text']=str(int(z+lz))if z+lz>100:L1.setPos(-0.7,0,0.5)text2['pos']=(-0.7,0.48)else:L1.setPos(-0.7,0,(z+lz)/100-0.5)text2['pos']=(-0.7,(z+lz)/100-0.52)if z+lz<11:text2['fg']=(255,0,0,255)elif z+lz<31:text2['fg']=(0,255,255,255)else:text2['fg']=(255,255,0,255)return Task.contMyApp().run()
可全屏
玩法:
鼠标向上往下飞
鼠标向下往下飞
鼠标往左往左转
鼠标往右往右转
碰到地面会退出
如果您想鼠标往上往上飞,请将第92行改成:
(mx0,my0)=(size[0]-mouse.getX(),size[1]-mouse.getY())
04:效果
05:尾声
05.01:对于网友
1、感兴趣的网友可以给这个程序化简一下,或者加上物理效应
2、感兴趣的网友可以找我要一下详细过程
05.02:对于列位转发爱好者
转载请通知我,并附上原网址,谢谢!
05.03:最后
麻烦点个赞,谢谢!