




已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2048最近有一款2048的游戲非?;?,本文將通過這個(gè)游戲來介紹一下OGEngine游戲引擎的一些使用。OGEngine引擎是開源的,我們很容易找到,搭建起來也很方便,我們只需在Android工程下添加OGEngine的jar包或者直接引用源碼就可以了。1.創(chuàng)建游戲的主Activity 類創(chuàng)建的游戲主Activity入口類繼承于GameActivity類,需要重寫相關(guān)方法。(1) 重寫onCreatePixelPerfectEngineOptions(). 此類主要是設(shè)置引擎相關(guān)參數(shù)。Overrideprotected PixelPerfectEngineOptions onCreatePixelPerfectEngineOptions() PixelPerfectEngineOptions pixelPerfectEngineOptions = new PixelPerfectEngineOptions(this, ZoomCamera.class);/ 設(shè)置豎屏pixelPerfectEngineOptions.setScreenOrientation(ScreenOrientation.PORTRAIT_FIXED); / 適配模式,這里設(shè)置為“保持寬度不變,改變高”pixelPerfectEngineOptions.setPixelPerfectMode(PixelPerfectMode.CHANGE_HEIGHT);/ 參考尺寸pixelPerfectEngineOptions.setDesiredSize(ConstantUtil.DESIRED_SIZE);return pixelPerfectEngineOptions;解析: 根據(jù)游戲本身的需要設(shè)置豎屏或者橫屏;ScreenOrientation.PORTRAIT_FIXED 這個(gè)參數(shù)表示豎屏,ScreenOrientation.LANDSCAPE_FIXED 這參數(shù)表上橫屏,我這里設(shè)置成了豎屏。 設(shè)置適配模式,PixelPerfectMode.CHANGE_HEIGHT 表上“保持寬度不變,改變高”。 屏幕參考尺寸,我這里是豎屏上面又設(shè)置了“保持寬度不變,改變高”,所以我這里的參考尺寸設(shè)為480,表示保持鏡頭的寬為480不變,根據(jù)實(shí)際手機(jī)屏幕分辨率的寬高比改變鏡頭的高。(2) 重寫 onLoadResources(). 此類主要用于在此加載相關(guān)資源。Overrideprotected void onLoadResources() / 加載圖片資源RegionRes.loadTexturesFromAssets(Res.ALL_XML);/ 加載字體資源FontRes.loadFont(128, 128, Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32, true, Color.BLACK, ConstantUtil.FONT_CARD_NUM);FontRes.loadFont(128, 128, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL), 25, true, Color.WHITE, ConstantUtil.FONT_SCORE_NUM);/ 加載音效資源SoundFactory.setAssetBasePath(mfx/);SoundRes.loadSoundFromAssets(ConstantUtil.SOUND_SELECT, select.mp3);SoundRes.loadSoundFromAssets(ConstantUtil.SOUND_SETPOS, setpos.mp3);SoundRes.loadSoundFromAssets(ConstantUtil.SOUND_MERGE, merge.mp3);(3) 重寫 onLoadComplete(). 此類在上面onLoadComplete()方法中加載資源完成后執(zhí)行,通常此時(shí)可以跳轉(zhuǎn)到相關(guān)游戲場景。Overrideprotected void onLoadComplete() / 加載資源完成后this.startScene(GameScene.class);2. 創(chuàng)建游戲場景 GameScene 類創(chuàng)建場景的類可以繼承于Scene 類,場景Scene是Entity的子類,該類用來創(chuàng)建游戲中的場景。Scene是屏幕上所有對象的根容器。在onSceneCreate(SceneBundle bundle)方法里面創(chuàng)建各種實(shí)體,比如 EntityGroup、Sprite、Text、Layer。Overridepublic void onSceneCreate(SceneBundle bundle) super.onSceneCreate(bundle);initView();private void initView() / 游戲背景AnimatedSprite game_bg = new AnimatedSprite(0, 0, Res.GAME_BG,getVertexBufferObjectManager();this.attachChild(game_bg);/ 中間游戲主體部分mGameGroup = new GameGroup(this);/ 設(shè)置改Group的中心位置在鏡頭的中心點(diǎn)上mGameGroup.setCentrePosition(this.getCameraCenterX(),this.getCameraCenterY();this.attachChild(mGameGroup);/ 2048 LOGOAnimatedSprite game_logo = new AnimatedSprite(20, 20, Res.GAME_LOGO,getVertexBufferObjectManager();this.attachChild(game_logo);/ 最佳得分背景bestScoreBg = new AnimatedSprite(0, 20, Res.GAME_SCORE_BG_BEST,getVertexBufferObjectManager();/ 設(shè)置bestScoreBg右邊x坐標(biāo)的位置在鏡頭的右邊減20的位置bestScoreBg.setRightPositionX(this.getCameraRightX() - 20);this.attachChild(bestScoreBg);tBestScore = new Text(0, bestScoreBg.getY() + 50,FontRes.getFont(ConstantUtil.FONT_SCORE_NUM),SharedUtil.getBestScore(getActivity() + , 4,getVertexBufferObjectManager();/ 設(shè)置 tBestScore 的X坐標(biāo)上的中點(diǎn)在bestScoreBg的X坐標(biāo)中點(diǎn)上tBestScore.setCentrePositionX(bestScoreBg.getCentreX();this.attachChild(tBestScore);/ 當(dāng)前得分背景currScoreBg = new AnimatedSprite(0, bestScoreBg.getY(),Res.GAME_SCORE_BG_NOW, getVertexBufferObjectManager();/ 設(shè)置currScoreBg的右邊X坐標(biāo)點(diǎn)在bestScoreBg左邊的X坐標(biāo)減20的位置上currScoreBg.setRightPositionX(bestScoreBg.getLeftX() - 20);this.attachChild(currScoreBg);.(1) Scene 類是游戲中非常重要的一個(gè)類,在Scene場景中,利用attachChild(IEntity)來添加實(shí)體。(2) 由GameActivity 類跳轉(zhuǎn)到Scene 或者Scene 于 Scene 之間的跳轉(zhuǎn)使用public Scene startScene(Class pSceneCls)public Scene startScene(Class pSceneCls, SceneBundle bundle)pSceneCls:需要跳轉(zhuǎn)的場景的Classbundle用于傳遞場景之間的數(shù)據(jù)(3) Scene中包含生命周期,在Scene被添加到引擎渲染后、Activity執(zhí)行對應(yīng)生命周期時(shí)、Scene會重新顯示時(shí)執(zhí)行public void onSceneCreate(SceneBundle bundle) public void onSceneResume() public void onScenePause()public void onSceneDestroy()(4) 要關(guān)閉一個(gè)Scene 使用 finish() 方法即可。(5) 需要靈活運(yùn)用實(shí)體中有關(guān)設(shè)置坐標(biāo)位置和獲取坐標(biāo)位置的方法來設(shè)定實(shí)體Entity的位置。下面是部分相關(guān)方法。/獲取左X坐標(biāo)public float getLeftX() ;/獲取右X坐標(biāo)public float getRightX();/設(shè)置右上X位置public void setRightPositionX(float pX);/獲取底部Y位置public float getBottomY();/設(shè)置底部Y位置public void setBottomPositionY(float pY) ;/ 獲取中心X坐標(biāo)public float getCentreX() ;/ 獲取中心Y坐標(biāo)public float getCentreY() ;/ 設(shè)置中心X位置public void setCentrePositionX(float pCentreX) ;/ 設(shè)置中心Y位置public void setCentrePositionY(float pCentreY);/ 設(shè)置中心位置public void setCentrePosition(float pCentreX, float pCentreY) ; 顯示、更新分?jǐn)?shù)。這里顯示分?jǐn)?shù)使用到了Text 文本類 tBestScore、tBestScore均為Text /* * 更新最高紀(jì)錄 * * param pBestScore */private void updateBestScore(int pBestScore) tBestScore.setText(pBestScore + );/ 設(shè)置居中tBestScore.setCentrePositionX(bestScoreBg.getCentreX();/* * 增加當(dāng)前分?jǐn)?shù) * * param pAddScore * 所增加的分?jǐn)?shù) */public void addCurrScore(int pAddScore) if (pAddScore != 0) / 播放音效SoundRes.playSound(ConstantUtil.SOUND_MERGE);currScore += pAddScore;tCurrScore.setText(currScore + );tCurrScore.setCentrePositionX(currScoreBg.getCentreX();/ 當(dāng)前分?jǐn)?shù)大于所保存的最佳分?jǐn)?shù)時(shí),更新最佳分?jǐn)?shù)if (currScore SharedUtil.getBestScore(getActivity() SharedUtil.setBestScore(getActivity(), currScore);updateBestScore(currScore); 按鈕及按鈕點(diǎn)擊事件監(jiān)聽,btnHelp 和 btnExit 均為ButtonSprite,通過setOnClickListener(onClickListener); 設(shè)置點(diǎn)擊事件監(jiān)聽。/* * 按鈕點(diǎn)擊監(jiān)聽 */private OnClickListener onClickListener = new OnClickListener() Overridepublic void onClick(ButtonSprite pButtonSprite, float pTouchAreaLocalX,float pTouchAreaLocalY) if (pButtonSprite = btnHelp) / 點(diǎn)擊了幫助按鈕attachChild(helpLayer); else if (pButtonSprite = btnExit) / 點(diǎn)擊了退出游戲按鈕showDialog();3. 創(chuàng)建卡片類手游2048中,卡片是一個(gè)重要的單元體,移動的其實(shí)是卡片,下面我們來介紹一下卡片類的實(shí)現(xiàn)。(1) 稍微擴(kuò)展一下卡片精靈我們知道,在2048游戲中,每種數(shù)字所對應(yīng)的卡片顏色不一樣,這里我們使用卡片的原圖是一白色的方塊圖,通過相關(guān)設(shè)置顏色的方法可以改變卡片的顏色。觀察OGEngine引擎源碼可以發(fā)現(xiàn)Entity 類里有個(gè) setColor 的方法,它可以使設(shè)定的RGB顏色值疊加在原圖上形成新的顏色,我們這里的原圖使用的是白色的方塊圖,所以我們可以找到想要變成的顏色的圖,拿到它的RGB值就好辦了。我們可以看一下Entity 中的 setColor /* * param pRed * from 0.0f to 1.0f * param pGreen * from 0.0f to 1.0f * param pBlue * from 0.0f to 1.0f */Overridepublic void setColor(final float pRed, final float pGreen, final float pBlue) if (this.mColor.setChecking(pRed, pGreen, pBlue) this.onUpdateColor();由上面的源碼可以看到,RGB各個(gè)顏色值的范圍是01(如下面的源碼注釋),而我們用取色器獲取得到的RGB是0255的,不太方便使用,所以我們擴(kuò)展一下。這里我們在卡片精靈CardSprite 類中擴(kuò)展一下。public class CardSprite extends AnimatedSprite public CardSprite(VertexBufferObjectManager pVertexBufferObjectManager) super(0, 0, Res.GAME_ROUNDRECT, pVertexBufferObjectManager);/* * 設(shè)置RGB 0 到 255/*public void setRGB(float pRed, float pGreen, float pBlue) this.setColor(pRed / 255, pGreen / 255, pBlue / 255);/* * 設(shè)置數(shù)組形式的 RGB 0 到 255 * param pRGBs 數(shù)組形式的RGB */public void setRGB(float pRGBs) this.setColor(pRGBs0 / 255, pRGBs1 / 255, pRGBs2 / 255);(2) 創(chuàng)建卡片精靈和卡片上面顯示的數(shù)字的組合類在OGEngine中要把精靈、文本實(shí)體等組合成一個(gè)整體我們通常使用到EntityGroup 類。public class CardGroup extends EntityGroup private CardSprite cardSprite;/ 卡片背景private int number = 0;/ 數(shù)字private Text tNum; / 數(shù)字文本/ =get&set=/ 獲取數(shù)字public int getNumber() return number;/ 設(shè)置數(shù)字public void setNumber(int number) this.number = number;onDrawNum(number);/ =public CardGroup(float pX, float pY, Scene pScene) / 卡片資源原圖的大小為90*90,所以這個(gè)組合的寬高可以設(shè)置為90*90super(pX, pY, 90, 90, pScene);/ 初始化ViewinitView();/ 自動計(jì)算成自適應(yīng)寬高this.setWrapSize();private void initView() / 創(chuàng)建卡片精靈cardSprite = new CardSprite(this.getVertexBufferObjectManager();this.attachChild(cardSprite);/ 創(chuàng)建文本實(shí)體用于顯示卡片上的數(shù)字,文本是可變的,這里設(shè)置文本的默認(rèn)值為空字符串,最大的顯示位數(shù)為4tNum = new Text(0, 0, FontRes.getFont(ConstantUtil.FONT_CARD_NUM), ,4, this.getVertexBufferObjectManager();/ 設(shè)置文本的中心Y坐標(biāo)在cardSprite的Y坐標(biāo)中點(diǎn)上tNum.setCentrePositionY(cardSprite.getCentreY();this.attachChild(tNum);/ 畫卡片上的數(shù)字并根據(jù)數(shù)字顯示顏色,默認(rèn)值為0onDrawNum(0);/ 畫卡片上的數(shù)字,并根據(jù)數(shù)字設(shè)置卡片的顏色private void onDrawNum(int number) float mRGBs;switch (number) case 0:mRGBs = ConstantUtil.RGBS_0;break;case 2:mRGBs = ConstantUtil.RGBS_2;break;case 4:mRGBs = ConstantUtil.RGBS_4;break;case 8:mRGBs = ConstantUtil.RGBS_8;break;/ 此次省略了16、32、64、128、256、512 的設(shè)置case 1024:mRGBs = ConstantUtil.RGBS_1024;break;case 2048:mRGBs = ConstantUtil.RGBS_2048;break;default:mRGBs = ConstantUtil.RGBS_0;break;/ 設(shè)置精靈顏色,傳入的是RGB的數(shù)組形式cardSprite.setRGB(mRGBs);/ 設(shè)置文本顯示,設(shè)置數(shù)字相對于卡片精靈X坐標(biāo)居中if (number = 0) tNum.setText(); else tNum.setText(number + );tNum.setCentrePositionX(cardSprite.getCentreX();/ 對比當(dāng)前卡片與傳進(jìn)來的卡片上的數(shù)字是否相等public boolean equals(CardGroup pCardGroup) return getNumber() = pCardGroup.getNumber();這樣整個(gè)卡片類就創(chuàng)建好了,代碼注釋得比較詳細(xì),就不再多解析了。4. 把卡片添加到游戲主體界面部分(GameGroup)上面我們已經(jīng)創(chuàng)建了卡片類 CardGroup,下面我們再把它組合成一個(gè)整體。(1) 建立GameGroup類,聲明一些常量,構(gòu)造器。public class GameGroup extends EntityGroup private GameScene mGameScene;/*手指滑動的最小響應(yīng)距離*/private final static int FLING_MIN_DISTANCE =10;/*卡片之間的間隔*/private static final float INTERVAL = 15;/*卡片行列數(shù)量*/private final static int mCount = 4;/*卡片尺寸*/private final static float CARD_SIZE = 90;/*卡片數(shù)組*/private CardGroup cardArrays = new CardGroup44;/*用于標(biāo)記還有哪些空的位置*/private List emptyPoints = new ArrayList();/*隨機(jī)生成的數(shù)字2*/private final static int mSamllNum = 2;/*隨機(jī)生成的數(shù)字4*/private final static int mBignum = 4;public GameGroup(GameScene pGameScene) super(0, 0, 435, 435, pGameScene);/ 設(shè)置可以監(jiān)聽觸碰事件this.setIgnoreTouch(false);this.mGameScene = pGameScene;initView();(2)具體實(shí)現(xiàn)創(chuàng)建卡片函數(shù),代碼如下:private void initView() / 創(chuàng)建背景AnimatedSprite rectBg = new AnimatedSprite(0, 0, Res.GAME_RECT_BG, this.getVertexBufferObjectManager();this.attachChild(rectBg);/ 創(chuàng)建 4*4 單元格 卡片for (int row = 0; row mCount; row+) for (int column = 0; column mCount; column+) cardArraysrowcolumn=new CardGroup(column+1)*INTERVAL+column*CARD_SIZE, (row+1)*INTERVAL+row*CARD_SIZE, getScene();this.attachChild(cardArraysrowcolumn);/ 在隨機(jī)一處剩余的空白單元隨機(jī)生成數(shù)字,2或者4addRandomNum();addRandomNum();(3) 游戲生成隨機(jī)卡片數(shù)字addRandomNum()/* * 在隨機(jī)一處剩余的空白單元隨機(jī)生成數(shù)字,2或者4 */private void addRandomNum() / 播放音效SoundRes.playSound(ConstantUtil.SOUND_SETPOS);emptyPoints.clear();for (int x = 0; x mCount; x+) for (int y = 0; y mCount; y+) if (cardArraysxy.getNumber() 0.1f ? mSamllNum: mBignum);/ 生成卡片的一些動作效果,就是一個(gè)由0到1倍的縮放過程cardArraysp.xp.y.registerEntityModifier(new ScaleModifier(0.2f, 0.0f, 1.0f);(4)在游戲場景GameScene 類中創(chuàng)建GameGroup / 中間游戲主體部分mGameGroup = new GameGroup(this);/ 設(shè)置改Group的中心位置在鏡頭的中心點(diǎn)上mGameGroup.setCentrePosition(this.getCameraCenterX(),this.getCameraCenterY();this.attachChild(mGameGroup);(5)運(yùn)行效果運(yùn)行效果如下,中間部分則為GameGroup 中展示的界面5. 游戲滑動上下左右相加的邏輯下面我們將來分析一下游戲2048滑動上下左右相加邏輯的實(shí)現(xiàn)。要實(shí)現(xiàn)這一功能,首先我們得監(jiān)聽觸碰事件。本游戲中,我們是在 GameGroup 實(shí)現(xiàn)滑動事件的處理。(1)public GameGroup(GameScene pGameScene) super(0, 0, 435, 435, pGameScene);/ 設(shè)置可以監(jiān)聽觸碰事件this.setIgnoreTouch(false);this.mGameScene = pGameScene;initView();如上面的代碼,記得把 GameGroup 設(shè)置可以監(jiān)聽觸碰事件即:this.setIgnoreTouch(false);接下來重寫它的 onAreaTouched 方法。根據(jù)監(jiān)聽按下ActionDown以及松開ActionUp時(shí)的滑動情況實(shí)現(xiàn)判斷是向哪個(gè)方向滑動其中FLING_MIN_DISTANCE 為一常量值:/*手指滑動的最小響應(yīng)距離*/private final static int FLING_MIN_DISTANCE =10;具體代碼如下:private boolean mGrabbed = false;private float startX, startY, offsetX, offsetY;Overridepublic boolean onAreaTouched(TouchEvent pSceneTouchEvent,float pTouchAreaLocalX, float pTouchAreaLocalY) if (pSceneTouchEvent.isActionDown() mGrabbed = true;startX = pSceneTouchEvent.getX();startY = pSceneTouchEvent.getY(); else if (pSceneTouchEvent.isActionUp() if (mGrabbed) mGrabbed = false;offsetX = pSceneTouchEvent.getX() - startX;offsetY = pSceneTouchEvent.getY() - startY;if (Math.abs(offsetX) Math.abs(offsetY) if (offsetX FLING_MIN_DISTANCE) / 向右滑toRight(); else if (offsetY FLING_MIN_DISTANCE) / 向下滑toDown();return true;(2) 向左滑動函數(shù)的邏輯代碼:private void toLeft() LogUtil.d(左移);SoundRes.playSound(ConstantUtil.SOUND_SELECT);boolean mMerge = false;for (int x = 0; x mCount; x+) for (int y = 0; y mCount; y+) for (int y1 = y + 1; y1 0) if (cardArraysxy.getNumber() = 0) cardArraysxy.setNumber(cardArraysxy1.getNumber();cardArraysxy1.setNumber(0);mMerge = true;y-; else if (cardArraysxy.equals(cardArraysxy1) cardArraysxy.setNumber(cardArraysxy.getNumber() * 2);mergeAction(cardArraysxy);cardArraysxy1.setNumber(0);mGameScene.addCurrScore(cardArraysxy.getNumber();mMerge = true;break;if (mMerge) addRandomNum();checkComplete();(3) 向右滑動函數(shù)的邏輯代碼:private void toRight() LogUtil.d(右移);SoundRes.playSound(ConstantUtil.SOUND_SELECT);boolean mMerge = false;for (int x = 0; x = 0; y-) for (int y1 = y - 1; y1 = 0; y1-) if (cardArraysxy1.getNumber() 0) if (cardArraysxy.getNumber() = 0) cardArraysxy.setNumber(cardArraysxy1.getNumber();cardArraysxy1.setNumber(0);mMerge = true;y+; else if (cardArraysxy.equals(cardArraysxy1) cardArraysxy.setNumber(cardArraysxy.getNumber() * 2);mergeAction(cardArraysxy);cardArraysxy1.setNumber(0);mGameScene.addCurrScore(cardArraysxy.getNumber();mMerge = true;break;if (mMerge) addRandomNum();checkComplete();(4) 向上滑動函數(shù)的邏輯代碼:private void toUp() LogUtil.d(上移);SoundRes.playSound(ConstantUtil.SOUND_SELECT);boolean mMerge = false;for (int y = 0; y mCount; y+) for (int x = 0; x mCount; x+) for (int x1 = x + 1; x1 0) if (cardArraysxy.getNumber() = 0) cardArraysxy.setNumber(cardArraysx1y.getNumber();cardArraysx1y.setNumber(0);mMerge = true;x-; else if (cardArraysxy.equals(cardArraysx1y) cardArraysxy.setNumber(cardArraysxy.getNumber() * 2);mergeAction(cardArraysxy);cardArraysx1y.setNumber(0);mGameScene.addCurrScore(cardArraysxy.getNumber();mMerge = true;break;if (mMerge) addRandomNum();checkComplete();(5) 向下滑動函數(shù)的邏輯代碼:private void toDown() LogUtil.d(下移);SoundRes.playSound(ConstantUtil.SOUND_SELECT);boolean mMerge = false;for (int y = 0; y = 0; x-) for (int x1 = x - 1; x1 = 0; x1-) if (cardAr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 茶葉新品推廣與代理銷售合作協(xié)議
- 礦產(chǎn)資源測繪信息保密及開發(fā)利用合同范本
- 特色酒吧吧臺裝修設(shè)計(jì)與品牌授權(quán)合同
- 2025至2030中國天然鉀肥市場現(xiàn)狀分析及未來銷售格局研究報(bào)告
- 2025至2030中國天然氣和石油鉆頭行業(yè)深度研究及發(fā)展前景投資評估分析
- 2025至2030中國吸塵設(shè)備行業(yè)市場發(fā)展分析及發(fā)展前景與投融資報(bào)告
- 2025至2030中國醫(yī)療用車行業(yè)供需趨勢及投資風(fēng)險(xiǎn)報(bào)告
- 2025至2030中國醫(yī)用起釘器行業(yè)市場深度研究及發(fā)展前景投資可行性分析報(bào)告
- 2025至2030中國制漿造紙用酶行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報(bào)告
- 人教版三年級語文下冊第四單元《語文園地》示范課教學(xué)課件
- 班組長生產(chǎn)管理能力考試題庫-上(選擇題)
- GB/T 4074.2-2024繞組線試驗(yàn)方法第2部分:尺寸測量
- 維修結(jié)算單完整版本
- 歐普照明產(chǎn)品介紹
- 管道系統(tǒng)壓力試驗(yàn)和泄漏性試驗(yàn)記錄
- 頸部血腫的應(yīng)急預(yù)案
- 2023年北京中儲糧集團(tuán)招聘考試真題及答案
- 省級融媒體平臺建設(shè)方案
- 【公開課教案】《蹲踞式起跑》教案
- 社會主義市場經(jīng)濟(jì)理論1課件
- 管道工施工安全詳細(xì)措施培訓(xùn)
評論
0/150
提交評論