




已阅读5页,还剩93页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DirectX使用的是左手坐标系x正向右,y正向上,z正向前,即向屏幕里Ogre/OpGL 使用的是右手坐标系 x正向右,y正向上,z正向自己,即向屏幕外以下 开发工具为 Visual Studio 2010, DirectX版本为:Microsoft DirectX SDK (June 2010) Ogre版本为:OgreSDK_vc10_v1-7-3注意:要想Ogre程序能运行,必须将Ogre库的dll文件路径配置进环境变量:一:9个实体,随机出现一个,隐藏另一个,鼠标移到转动相机,按键盘移动相机.(程序为 游戏类编程/Ogre/Ogre1.73/FirstOGRE) 1:新建一个空的 win32控制台应用程序,命名为:FirstOGRE 2:添加一个 FirstOGRE.cpp文件 3:配置 包含目录(包含Ogre的头文件的目录) 和 库目录(包含Ogre的lib文件的目录):包含目录: 库目录: 4:配置 附加依赖项: OgreRTShaderSystem_d.libOgreMain_d.libOIS_d.lib 5:将OgreSDK_vc10_v1-7-3安装目录下的 media目录拷贝到 当前工程目录下,将OgreSDK_vc10_v1-7-3安装目录下的 bin目录下 的 debug目录下和 release目录的下 后缀为 .cfg的文件拷贝到当前目录下, 并修改.cfg文件内的配置内容(修改配置路径的内容): 6:添加一个 MyEntity MyEntity.h:#ifndef MyEntity_H_#define MyEntity_H_#include class MyEntitypublic:MyEntity(Ogre:SceneManager* mSceneMgr, int i, int j);/创建实体,节点,并为节点创建动画.MyEntity(void);public:void update(float interval);/ 动画void enable(); /随机显示实体void disable(); /让显示的实体隐藏bool isEnable();/判断显示隐藏状态private:Ogre:Entity *m_pEnt; /创建的实体Ogre:SceneNode *m_pSceneNode; /保存实体的节点Ogre:AnimationState *m_pAnimState;/负责实体的动画;#endif MyEntity.cpp:#include MyEntity.hMyEntity:MyEntity(Ogre:SceneManager* mSceneMgr, int i, int j)using namespace Ogre;m_pEnt = mSceneMgr-createEntity(myEntiy+Ogre:StringConverter:toString(i*3+j), Sinbad.mesh);/创建实体,并给实体命名m_pEnt-setVisible(false); /默认情况下实体隐藏m_pSceneNode = mSceneMgr-getRootSceneNode()-createChildSceneNode(Ogre:Vector3(50*i, 0, 50*j);/创建一个节点时,给节点一个位置/pSceneNode-setScale(Ogre:Vector3(6.0f, 6.0f, 6.0f); /节点放大6倍m_pSceneNode-attachObject(m_pEnt); /节点与实体关联/创建实体的动画Ogre:Animation *pAnimation = mSceneMgr-createAnimation(myEntiy+Ogre:StringConverter:toString(i*3+j), 3.0f);/第一个为动画的名称,后一个为动画的时长pAnimation-setInterpolationMode(Ogre:Animation:IM_SPLINE);/设置动画差值为样条插值Ogre:NodeAnimationTrack *pTrack = pAnimation-createNodeTrack(0, m_pSceneNode); /创建一个轨迹动画,第一个值为索引,第二个为关联的节点/在第秒,物体放大为整个物体的倍Ogre:TransformKeyFrame *pKey = pTrack-createNodeKeyFrame(0.0f);pKey-setScale(Ogre:Vector3(3.0f, 3.0f, 3.0f); /物体放大3倍pKey-setTranslate(Ogre:Vector3(50*i, 0, 50*j);/转换点/在第秒后,物体放大为整个物体的倍pKey = pTrack-createNodeKeyFrame(1.0f);pKey-setScale(Ogre:Vector3(6.0f, 6.0f, 6.0f);pKey-setTranslate(Ogre:Vector3(50*i, 0, 50*j);/在第秒后,物体放大为整个物体的倍pKey = pTrack-createNodeKeyFrame(2.0f);pKey-setScale(Ogre:Vector3(6.0f, 6.0f, 6.0f);pKey-setTranslate(Ogre:Vector3(50*i, 0, 50*j);/在第秒后,物体放大为整个物体的倍pKey = pTrack-createNodeKeyFrame(3.0f);pKey-setScale(Ogre:Vector3(3.0f, 3.0f, 3.0f);pKey-setTranslate(Ogre:Vector3(50*i, 0, 50*j);/通过上面的动画创建动画状态m_pAnimState = mSceneMgr-createAnimationState(myEntiy+Ogre:StringConverter:toString(i*3+j);m_pAnimState-setEnabled(false); /初期动画为关闭m_pAnimState-setLoop(true); /设置动画为循环播放MyEntity:MyEntity(void)void MyEntity:update(float interval)/*自己写的缩放动画float scale = 0.0f;if(interval setScale(scale, scale, scale);*/m_pAnimState-setTimePosition(interval);/设置动画的起点void MyEntity:enable()if(!m_pEnt-getVisible()m_pAnimState-setEnabled(true); /设置动画为开启m_pAnimState-setTimePosition(0.0f);/设置动画的起点m_pEnt-setVisible(true);void MyEntity:disable()if(m_pEnt-getVisible() m_pEnt-setVisible(false);/隐藏bool MyEntity:isEnable()return m_pEnt-getVisible();/判断是否是显示 7:添加一个 MyEntityManager MyEntityManager.h:#ifndef MyEntityManager_H_#define MyEntityManager_H_#include MyEntity.hclass MyEntityManager /MyEntity的管理类public:MyEntityManager(Ogre:SceneManager* mSceneMgr);MyEntityManager(void);public:void update(const FrameEvent& evt); /帧事件private:MyEntity *m_pMyEnt9;/9个实体MyEntity *m_pCurrentMyEnt;/记录当前可见实体float m_time; /用于时间累加,当大于等于1时,还原为0;#endif MyEntityManager.cpp:#include MyEntityManager.hMyEntityManager:MyEntityManager(Ogre:SceneManager* mSceneMgr) : m_time(0.0f), m_pCurrentMyEnt(NULL)/*Ogre:Entity *pEnt = mSceneMgr-createEntity(Sword, Sword.mesh);SceneNode *pSceneNode = mSceneMgr-getRootSceneNode()-createChildSceneNode();pSceneNode-setScale(Ogre:Vector3(6.0f, 6.0f, 6.0f);pSceneNode-attachObject(pEnt);*/for(int i=0; i3; i+) /创建9个实体for(int j=0; j3; j+)m_pMyEnti*3+j = new MyEntity(mSceneMgr, i, j);MyEntityManager:MyEntityManager(void)for(int i=0; i= 1.0f) /当每过1秒,随机显示一个实体if(NULL != m_pCurrentMyEnt) m_pCurrentMyEnt-disable();m_pCurrentMyEnt = m_pMyEntrand()%9;m_pCurrentMyEnt-enable();m_time = 0.0f; /还原为0.0fif(NULL != m_pCurrentMyEnt) m_pCurrentMyEnt-update(m_time);/更新显示的实体状态 8:添加一个监听类:MyEntityFrameListener MyEntityFrameListener.h:#ifndef MyEntityFrameListener_H_#define MyEntityFrameListener_H_#include ogre/exampleframelistener.hclass MyEntityManager;class MyEntityFrameListener : public ExampleFrameListener, public OIS:KeyListener, public OIS:MouseListenerpublic:/bufferedKeys,bufferedMouse,bufferedJoy:是否启用键盘,鼠标,手柄的缓冲,默认不启用,会导致不停地检查输入设备信息来确定按键是否按下或释放,鼠标是否移动等等,如果检测/ 不够快速,某一动作可能不会被发现,所以调用时,要启用缓冲,在缓冲模式下,OIS会记录所有输入设备的变化,并把它们通过消息告知应/ 用程序。在缓冲模式下不需要检查输入设备的状态,只需要处理OIS发送的消息。MyEntityFrameListener(MyEntityManager *pMyEntMgr, RenderWindow* win, Camera* cam, bool bufferedKeys = false, bool bufferedMouse = false, bool bufferedJoy = false);MyEntityFrameListener(void);public:/virtual bool processUnbufferedKeyInput(const FrameEvent& evt); /键盘输入/virtual bool processUnbufferedMouseInput(const FrameEvent& evt);/鼠标输入virtual bool keyPressed(const OIS:KeyEvent &arg); /启用bufferedKeys缓存,并继承了KeyListener,则使用此替代processUnbufferedKeyInputvirtual bool keyReleased(const OIS:KeyEvent &arg);virtual bool mouseMoved(const OIS:MouseEvent &arg);virtual bool mousePressed(const OIS:MouseEvent &arg, OIS:MouseButtonID id);virtual bool mouseReleased(const OIS:MouseEvent &arg, OIS:MouseButtonID id); void moveCamera(); /移动相机virtual bool frameEnded(const FrameEvent& evt); /循环刷新界面private:MyEntityManager *m_pMyEntMgr; /实体管理类,也是实体集合类;#endif MyEntityFrameListener.cpp:#include MyEntityFrameListener.h#include MyEntityManager.hMyEntityFrameListener:MyEntityFrameListener(MyEntityManager *pMyEntMgr, RenderWindow* win, Camera* cam, bool bufferedKeys, bool bufferedMouse, bool bufferedJoy):ExampleFrameListener(win, cam, bufferedKeys, bufferedMouse, bufferedJoy), m_pMyEntMgr(pMyEntMgr)/启用了键鼠柄的缓冲,就能使用它们的回调函数mKeyboard-setEventCallback(this);mMouse-setEventCallback(this);MyEntityFrameListener:MyEntityFrameListener(void)if(NULL != m_pMyEntMgr)delete m_pMyEntMgr;m_pMyEntMgr = NULL;bool MyEntityFrameListener:keyPressed(const OIS:KeyEvent &arg) /键盘的键按下Real moveScale = 0.2f; switch(arg.key)case OIS:KC_A:case OIS:KC_LEFT:mTranslateVector.x = -moveScale; /Move camera leftbreak;case OIS:KC_D:case OIS:KC_RIGHT:mTranslateVector.x = moveScale;/Move camera RIGHTbreak;case OIS:KC_W:case OIS:KC_UP:mTranslateVector.z = -moveScale;/Move camera forwardbreak;case OIS:KC_S:case OIS:KC_DOWN:mTranslateVector.z = moveScale;/Move camera backwardbreak;case OIS:KC_PGUP:mTranslateVector.y = moveScale;/Move camera upbreak;case OIS:KC_PGDOWN:mTranslateVector.y = -moveScale;/Move camera downbreak;/*设置相机投影多边形模式,不用case OIS:KC_NUMPAD0:case 0 : mCamera-setPolygonMode(PM_SOLID);break;case OIS:KC_NUMPAD1:case 1 : mCamera-setPolygonMode(PM_WIREFRAME);break;case OIS:KC_NUMPAD2:case 2 : mCamera-setPolygonMode(PM_POINTS);break;*/return true;bool MyEntityFrameListener:keyReleased(const OIS:KeyEvent &arg) /释放按下的键 mTranslateVector = Vector3:ZERO;/防止按键释放后还继续移动相机return true;bool MyEntityFrameListener:mouseMoved(const OIS:MouseEvent &arg)const OIS:MouseState &ms = arg.state;if(ms.buttonDown(OIS:MB_Left) else if(ms.buttonDown(OIS:MB_Right) else mRotX = Degree(-ms.X.rel * 0.13); /转为弧度,如:Degree(180)mRotY = Degree(-ms.Y.rel * 0.13); /转为弧度,如:Degree(180) return true;bool MyEntityFrameListener:mousePressed(const OIS:MouseEvent &arg, OIS:MouseButtonID id)return true;bool MyEntityFrameListener:mouseReleased(const OIS:MouseEvent &arg, OIS:MouseButtonID id)return true;void MyEntityFrameListener:moveCamera() /移动相机mCamera-yaw(mRotX); /绕y轴转动mCamera-pitch(mRotY); /绕x轴转动mCamera-moveRelative(mTranslateVector); /移动相机mRotX = mRotY = 0; /防止鼠标不转动后继续转动相机bool MyEntityFrameListener:frameEnded(const FrameEvent& evt)/ExampleFrameListener:frameEnded(evt);/可以不用moveCamera(); /移动相机if(NULL != m_pMyEntMgr) m_pMyEntMgr-update(evt);/每个一秒随机显示一个实体,隐藏另一个实体等 return true; 9:添加一个 应用程序类:MyExampleApplication MyExampleApplication.h:#ifndef _MyExampleApplication_H_#define _MyExampleApplication_H_#include #include MyEntityManager.h#include MyEntityFrameListener.hclass MyExampleApplication : public ExampleApplicationpublic:MyExampleApplication(void);MyExampleApplication(void);public:void createScene(void); /创建屏幕(设置灯光,材质,相机,创建实体节点等)void createFrameListener(void); /创建帧监听private:MyEntityManager *m_pMyEntMgr;MyEntityFrameListener *m_pFrameLst;#endif MyExampleApplication.cpp:#include MyExampleApplication.hMyExampleApplication:MyExampleApplication(void)m_pMyEntMgr = NULL;m_pFrameLst = NULL;MyExampleApplication:MyExampleApplication(void)if(NULL != m_pMyEntMgr)delete m_pMyEntMgr;m_pMyEntMgr = NULL;if(NULL = m_pFrameLst) mRoot-removeFrameListener(m_pFrameLst);/删除监听 delete m_pFrameLst;m_pFrameLst = NULL;void MyExampleApplication:createScene(void)mSceneMgr-setAmbientLight(Ogre:ColourValue(0.5f, 0.5f, 0.5f);/设置环境光Light *l = mSceneMgr-createLight(mainLight);l-setPosition(20, 80, 50); Ogre:Vector3 pst = mCamera-getPosition();Ogre:Quaternion ort = mCamera-getOrientation();mCamera-setPosition(94.0f, 194.043f, 375.0f); /设置摄像机位置mCamera-setOrientation(Ogre:Quaternion(0.953763f, -0.3f, -0.00865638f, -0.0027f);/设置摄像机角度 mSceneMgr-setSkyBox(true, Examples/SceneSkyBox2, 50);/设置天空盒 m_pMyEntMgr = new MyEntityManager(mSceneMgr); /创建9个实体void MyExampleApplication:createFrameListener(void)m_pFrameLst = new MyEntityFrameListener(m_pMyEntMgr, mWindow, mCamera, true, true, true);/启用各输入设备的缓冲mRoot-addFrameListener(m_pFrameLst); 10:FirstOGRE.cpp的内容:#include MyExampleApplication.hint main()MyExampleApplication m;m.go(); return 0; 二:旋转节点,缩放节点,坐标空间移动旋转节点等,绑定相机旋转节点等(程序为 游戏类编程/Ogre/Ogre1.73/SecondOGRE) 1:新建一个 空的win32控制台应用程序,命名为:SecondOGRE. 2:添加一个 SecondOGRE.cpp 文件. 3:配置跟 FirstOGRE 的3,4,5项一样. 4:添加一个类:MyExampleApplication MyExampleApplication.h:#ifndef _MyExampleApplication_H_#define _MyExampleApplication_H_#include #include MyEntityFrameListener.hclass MyExampleApplication : public ExampleApplicationpublic:MyExampleApplication(void);MyExampleApplication(void);public:void createScene(void);/创建屏幕(设置灯光,材质,相机,创建实体节点等)void createFrameListener(void);/创建帧监听private:MyEntityFrameListener *m_pFrameLst;#endif MyExampleApplication.cpp: #include MyExampleApplication.hMyExampleApplication:MyExampleApplication(void) m_pFrameLst = NULL;MyExampleApplication:MyExampleApplication(void)if (NULL != m_pFrameLst)mRoot-removeFrameListener(m_pFrameLst);/删除监听delete m_pFrameLst;m_pFrameLst = NULL;void MyExampleApplication:createScene(void)mSceneMgr-setAmbientLight(Ogre:ColourValue(0.5f, 0.5f, 0.5f);/设置环境光Light *l = mSceneMgr-createLight(mainLight);l-setPosition(20, 80, 50);Ogre:Vector3 pst = mCamera-getPosition();Ogre:Quaternion ort = mCamera-getOrientation();mCamera-setPosition(0, 100.0f, 100.0f); /设置摄像机位置mCamera-setOrientation(Ogre:Quaternion(0.953763f, -0.3f, -0.00865638f, -0.0027f); /设置摄像机方向mSceneMgr-setSkyBox(true, Examples/SceneSkyBox2, 50);/设置天空盒/创建地面Plane plane(Vector3:UNIT_Y, -15);/通过法向量与恒定数创建一个PlaneMeshManager:getSingleton().createPlane(GrassPlane, ResourceGroupManager:DEFAULT_RESOURCE_GROUP_NAME, plane,1500, 1500,/宽度,高度200, 200, / x方向段值,y方向段值,即面板分成多少个三角形true, /创建一个垂直的法向量到面板1, 5, 5, Vector3:UNIT_Z); / 2D纹理坐标设置的数量,在u,v方向重复的瓦片的数量,纹理方向Entity* pEnt = mCamera-getSceneManager()-createEntity(GrassPlane, GrassPlane);mCamera-getSceneManager()-getRootSceneNode()-createChildSceneNode(GrassPlane)-attachObject(pEnt);pEnt-setMaterialName(Examples/BeachStones); /设置材质 Examples/GrassFloorvoid MyExampleApplication:createFrameListener(void)m_pFrameLst = new MyEntityFrameListener(mWindow, mCamera, true, true, true);/启用各输入设备的缓冲mRoot-addFrameListener(m_pFrameLst); 5:添加一个类:MyEntityFrameListener MyEntityFrameListener.h: #ifndef MyEntityFrameListener_H_#define MyEntityFrameListener_H_#include ogre/exampleframelistener.husing namespace Ogre;class MyEntityFrameListener : public ExampleFrameListener, public OIS:KeyListener, public OIS:MouseListenerpublic:MyEntityFrameListener(RenderWindow* win, Camera* cam, bool bufferedKeys = false, bool bufferedMouse = false, bool bufferedJoy = false);MyEntityFrameListener(void);public:virtual bool keyPressed(const OIS:KeyEvent &arg);virtual bool keyReleased(const OIS:KeyEvent &arg);virtual bool mouseMoved(const OIS:MouseEvent &arg);virtual bool mousePressed(const OIS:MouseEvent &arg, OIS:MouseButtonID id);virtual bool mouseReleased(const OIS:MouseEvent &arg, OIS:MouseButtonID id);void moveCamera();/移动相机virtual bool frameEnded(const FrameEvent& evt); /循环刷新界面protected:void createEntity1();/创建实体,绕各自自身轴旋转节点等void createEntity2();/创建实体,缩放节点等/ root节点没有父节点,其它节点都有父节点void createEntity3();/坐标空间,TS_PARENT(父节点空间),TS_WORLD(世界坐标空间),TS_LOCAL(自己的空间)void createEntity4();/在各个空间的移动void createEntity5();/在各个空间的转动protected:SceneManager *mSceneMgr;SceneNode *m_pNode7;SceneNode *m_pNode8;SceneNode *m_pNode9;SceneNode *m_pNode10;#endif MyEntityFrameListener.cpp: #include MyEntityFrameListener.hMyEntityFrameListener:MyEntityFrameListener(RenderWindow* win, Camera* cam, bool bufferedKeys, bool bufferedMouse, bool bufferedJoy): ExampleFrameListener(win, cam, bufferedKeys, bufferedMouse, bufferedJoy)/启用了键鼠柄的缓冲,就能使用它们的回调函数mKeyboard-setEventCallback(this);mMouse-setEventCallback(this);mSceneMgr = cam-getSceneManager(); createEntity1();/创建实体,绕各自自身轴旋转节点等createEntity2();/创建实体,缩放节点createEntity3();/坐标空间,TS_PARENT(父节点空间),TS_WORLD(世界坐标空间),TS_LOCAL(自己的空间)createEntity4();/在各个空间的移动createEntity5();/在各个空间的转动MyEntityFrameListener:MyEntityFrameListener(void)bool MyEntityFrameListener:keyPressed(const OIS:KeyEvent &arg) /键盘的键按下Real moveScale = 0.2f;switch(arg.key)case OIS:KC_A:case OIS:KC_LEFT:mTranslateVector.x = -moveScale; /Move camera leftbreak;case OIS:KC_D:case OIS:KC_RIGHT:mTranslateVector.x = moveScale;/Move camera RIGHTbreak;case OIS:KC_W:case OIS:KC_UP:mTranslateVector.z = -moveScale;/Move camera forwardbreak;case OIS:KC_S:case OIS:KC_DOWN:mTranslateVector.z = moveScale;/Move camera backwardbreak;case OIS:KC_PGUP:mTranslateVector.y = moveScale;/Move camera upbreak;case OIS:KC_PGDOWN:mTranslateVector.y = -moveScale;/Move camera downbreak;return true;bool MyEntityFrameListener:keyReleased(const OIS:KeyEvent &arg) /释放按下的键mTranslateVector = Vector3:ZERO;/防止按键释放后还继续移动相机return true;bool MyEntityFrameListener:mouseMoved(const OIS:MouseEvent &arg)const OIS:MouseState &ms = arg.state;if(ms.buttonDown(OIS:MB_Left) else if(ms.buttonDown(OIS:MB_Right) else mRotX = Degree(-ms.Y.rel * 0.13); /转为弧度,如:Degree(180)mRotY = Degree(-ms.X.rel * 0.13); /转为弧度,如:Degree(180)return true;bool MyEntityFrameListener:mousePressed(const OIS:MouseEvent &arg, OIS:MouseButtonID id)return true;bool MyEntityFrameListener:mouseReleased(const OIS:MouseEvent &arg, OIS:MouseButtonID id)return true;void MyEntityFrameListener:moveCamera() /移动相机/ mCamera-yaw(mRotX); /绕y轴转动/mCamera-pitch(mRotY); /绕x轴转动mCamera-moveRelative(mTranslateVector); /移动相机/ pNode7-translate(tran3, Node:TS_PARENT);/TS_PARENT时,点的位置:pos7+tran3/Quaternion q;q.FromAngleAxis(angle,axis);q.normalise();mOrientation = q*mOrientation;/pNode8-translate(tran8, Node:TS_LOCAL);/TS_LOCAL时,点的位置:pos8+mOrientation*tran8/Quaternion q;q.FromAngleAxis(angle,axis);q.normalise();mOrientation = q*mOrientation;/pNode9-translate(tran9, Node:TS_WORLD);/TS_WORLD时,点的位置:pos9+(mParent-_getDerivedOrientation().Inv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025有关企业用房借款合同范例
- 2025商业店铺租赁合同模板示例
- 高二政治考试题及答案
- 赣州社工考试题目及答案
- 辅助护理考试题及答案解析
- 二外日语考试题及答案
- 动物园考试题及答案
- 2025年中国全无苯全哑清面漆项目商业计划书
- 电商规划考试题及答案
- 工业金属锻件项目可行性分析报告范文模板
- 华润星级考试题目及答案
- 2025年公需课《人工智能赋能制造业高质量发展》试题及答案
- 管理者的角色认知课件
- 辽宁省大学生乡村医生专项计划招聘考试真题2024
- 2025麻精等特殊管理药品考核(医、药、护人员)试题及答案
- 2025山东淄博博山区城乡公益性岗位招聘492人笔试备考试题及答案解析
- 中职技能大赛备赛培训课件
- 2025年中国宽温液晶屏行业市场全景分析及前景机遇研判报告
- 2025年镇江市中考英语试题卷(含答案)
- (苏少2024版)美术二年级上册全册教学设计(新教材)
- 小学语文高段课程标准解读
评论
0/150
提交评论