原文地址:http://blog.csdn.net/zhang463586719/article/details/6643359

本人android开发新手,借博客大赛希望和各位开发者共同交流下android游戏的开发心得。本人前几个练手的游戏都没有使用游戏引擎,开发出来效果一般般,之后便尝试了使用游戏引擎,第一款游戏引擎就是用的微云,之所以用微云,因为微云提供了一个不错的demo可以作为很好的功能演示,非常的直观,但是其实例确实不足,应该说在我学习微云引擎的时候,只有demo源代码可以供你参考的。但是这一切不能否认微云是一个很好的游戏引擎的事实,尤其是它整合的box2d物理引擎用起来也非常的顺手。

那么下面我就简单来介绍下我做的这个小游戏《猴子跳》,整个游戏风格简单,有点类似《doodle jump》

效果图如下:

gameview.java

view plain
  1. import com.wiyun.engine.nodes.Director;
  2. import com.wiyun.engine.nodes.Scene;
  3. import com.wiyun.engine.nodes.Director.IDirectorLifecycleListener;
  4. import com.wiyun.engine.opengl.WYGLSurfaceView;
  5. import com.wiyun.engine.transitions.JumpZoomTransition;
  6. import android.app.Activity;
  7. import android.media.MediaPlayer;
  8. import android.os.Bundle;
  9. import android.view.Window;
  10. import android.view.WindowManager.LayoutParams;
  11. public class GameView extends Activity implements IDirectorLifecycleListener {
  12. /** Called when the activity is first created. */
  13. protected WYGLSurfaceView mGLSurfaceView;
  14. static GameView gameview;
  15. static int fenshu, score;
  16. protected Scene mScene;
  17. static {
  18. System.loadLibrary("xml2");
  19. System.loadLibrary("wiengine");
  20. System.loadLibrary("lua");
  21. System.loadLibrary("chipmunk");
  22. }
  23. MediaPlayer mMediaPlayer, mMediaPlayer2;
  24. @Override
  25. public void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN);
  28. requestWindowFeature(Window.FEATURE_NO_TITLE);
  29. mGLSurfaceView = new WYGLSurfaceView(this);
  30. gameview = this;
  31. setContentView(mGLSurfaceView);
  32. // 设置显示帧率,程序发布时应该去掉
  33. Director.getInstance().setDisplayFPS(true);
  34. // 创建第一个场景
  35. menu a = new menu();
  36. mMediaPlayer = new MediaPlayer();
  37. // 添加一个生命周期监听器,如果不需要可以不添加
  38. Director.getInstance().addLifecycleListener(this);
  39. // 开始运行第一个场景
  40. Director.getInstance().runWithScene(a.mScene);
  41. }
  42. public void play1() {
  43. mMediaPlayer = MediaPlayer.create(GameView.this, R.raw.jump);
  44. mMediaPlayer.setLooping(false);
  45. mMediaPlayer.start();
  46. }
  47. public void play2() {
  48. mMediaPlayer = MediaPlayer.create(GameView.this, R.raw.boost);
  49. mMediaPlayer.setLooping(false);
  50. mMediaPlayer.start();
  51. }
  52. public void play3() {
  53. mMediaPlayer = MediaPlayer.create(GameView.this, R.raw.jump2);
  54. mMediaPlayer.setLooping(false);
  55. mMediaPlayer.start();
  56. }
  57. public void change() {
  58. main a = new main();
  59. Director.getInstance().replaceScene(
  60. JumpZoomTransition.make(1, a.mScene));
  61. number n = new number();
  62. a.mScene.addChild(n);
  63. }
  64. @Override
  65. protected void onPause() {
  66. super.onPause();
  67. Director.getInstance().pause();
  68. }
  69. @Override
  70. protected void onResume() {
  71. super.onResume();
  72. Director.getInstance().resume();
  73. }
  74. @Override
  75. protected void onDestroy() {
  76. super.onDestroy();
  77. Director.getInstance().end();
  78. }
  79. @Override
  80. public void onDirectorEnded() {
  81. // TODO Auto-generated method stub
  82. }
  83. @Override
  84. public void onDirectorPaused() {
  85. // TODO Auto-generated method stub
  86. }
  87. @Override
  88. public void onDirectorResumed() {
  89. // TODO Auto-generated method stub
  90. }
  91. @Override
  92. public void onDirectorScreenCaptured(String arg0) {
  93. // TODO Auto-generated method stub
  94. }
  95. @Override
  96. public void onSurfaceChanged(int arg0, int arg1) {
  97. // TODO Auto-generated method stub
  98. }
  99. @Override
  100. public void onSurfaceCreated() {
  101. // TODO Auto-generated method stub
  102. }
  103. @Override
  104. public void onSurfaceDestroyed() {
  105. // TODO Auto-generated method stub
  106. }
  107. }

菜单栏 menu.java

view plain
  1. import com.wiyun.engine.motionwelder.MWSprite;
  2. import com.wiyun.engine.nodes.Director;
  3. import com.wiyun.engine.nodes.Layer;
  4. import com.wiyun.engine.nodes.Menu;
  5. import com.wiyun.engine.nodes.MenuItemSprite;
  6. import com.wiyun.engine.nodes.Scene;
  7. import com.wiyun.engine.nodes.Sprite;
  8. import com.wiyun.engine.opengl.Texture2D;
  9. import com.wiyun.engine.particle.ParticleSystem;
  10. import com.wiyun.engine.types.WYRect;
  11. import com.wiyun.engine.types.WYSize;
  12. import com.wiyun.engine.utils.ResolutionIndependent;
  13. public class menu extends Layer {
  14. public Scene mScene;
  15. WYSize s;
  16. MWSprite m_sprite1;
  17. ParticleSystem emitter;
  18. menu() {
  19. s = Director.getInstance().getWindowSize();
  20. mScene = Scene.make();
  21. bc();
  22. s();
  23. m();
  24. }
  25. public void bc() {
  26. Texture2D bc = Texture2D.makePNG(R.drawable.bc);
  27. Sprite bc2 = Sprite.make(bc);
  28. bc.autoRelease();
  29. bc2.autoRelease();
  30. bc2.setPosition(bc2.getWidth() / 2, bc2.getHeight() / 2);
  31. mScene.addChild(bc2);
  32. }
  33. public void s() {
  34. emitter = ParticleSnow.make();
  35. emitter.setPosition(s.width / 2, s.height);
  36. emitter.autoRelease();
  37. mScene.addChild(emitter);
  38. }
  39. public void m() {
  40. Texture2D tex = Texture2D.makePNG(R.drawable.start_normal);
  41. Texture2D tex2 = Texture2D.makePNG(R.drawable.start_down);
  42. Sprite sprite1Normal = Sprite.make(tex, ResolutionIndependent
  43. .resolve(WYRect.make(0, 0, 96, 29)));
  44. Sprite sprite1Disabled = Sprite.make(tex2, ResolutionIndependent
  45. .resolve(WYRect.make(0, 0, 96, 29)));
  46. MenuItemSprite start = MenuItemSprite.make(sprite1Normal,
  47. sprite1Disabled, sprite1Disabled, this, "start");
  48. tex = Texture2D.makePNG(R.drawable.about_normal);
  49. tex2 = Texture2D.makePNG(R.drawable.about_down);
  50. sprite1Normal = Sprite.make(tex, ResolutionIndependent.resolve(WYRect
  51. .make(0, 0, 96, 29)));
  52. sprite1Disabled = Sprite.make(tex2, ResolutionIndependent
  53. .resolve(WYRect.make(0, 0, 96, 29)));
  54. MenuItemSprite about = MenuItemSprite.make(sprite1Normal,
  55. sprite1Disabled, sprite1Disabled);
  56. tex = Texture2D.makePNG(R.drawable.quit_normal);
  57. tex2 = Texture2D.makePNG(R.drawable.quit_down);
  58. sprite1Normal = Sprite.make(tex, ResolutionIndependent.resolve(WYRect
  59. .make(0, 0, 96, 29)));
  60. sprite1Disabled = Sprite.make(tex2, ResolutionIndependent
  61. .resolve(WYRect.make(0, 0, 96, 29)));
  62. MenuItemSprite quit = MenuItemSprite.make(sprite1Normal,
  63. sprite1Disabled, sprite1Disabled, this, "quit");
  64. Menu menu = Menu.make(start, about, quit);
  65. menu.alignItemsVertically(40);
  66. menu.setPosition(s.width / 2, s.height / 2);
  67. mScene.addChild(menu);
  68. }
  69. public void quit() {
  70. GameView.gameview.onDestroy();
  71. }
  72. public void start() {
  73. GameView.gameview.change();
  74. }
  75. }

游戏大背景的设置,游戏的大背景由36张图片拼接而成的

BC.java

view plain
  1. import com.wiyun.engine.box2d.Box2D;
  2. import com.wiyun.engine.box2d.Box2DRender;
  3. import com.wiyun.engine.box2d.collision.PolygonShape;
  4. import com.wiyun.engine.box2d.dynamics.Body;
  5. import com.wiyun.engine.box2d.dynamics.BodyDef;
  6. import com.wiyun.engine.box2d.dynamics.Fixture;
  7. import com.wiyun.engine.box2d.dynamics.World;
  8. import com.wiyun.engine.box2d.dynamics.World.IContactListener;
  9. import com.wiyun.engine.box2d.dynamics.contacts.Contact;
  10. import com.wiyun.engine.nodes.Director;
  11. import com.wiyun.engine.nodes.Layer;
  12. import com.wiyun.engine.opengl.Texture2D;
  13. import com.wiyun.engine.types.WYPoint;
  14. import com.wiyun.engine.types.WYSize;
  15. import com.wiyun.engine.utils.TargetSelector;
  16. public class BC extends Layer implements IContactListener {
  17. static World mWorld;
  18. Fixture bc1, bc2;
  19. WYSize s;
  20. Box2DRender render;
  21. float y1 = +17.8f, y2 = 0;
  22. static int chushi = 30;
  23. static boolean grass1 = false, grass2 = false, grass3 = false;
  24. protected Box2D mBox2D;
  25. BC() {
  26. mBox2D = Box2D.make();
  27. mBox2D.setDebugDraw(false);
  28. render = Box2DRender.make();
  29. mBox2D.setBox2DRender(render);
  30. mWorld = mBox2D.getWorld();
  31. s = Director.getInstance().getWindowSize();
  32. addChild(mBox2D);
  33. y1 = s.height / s.width * 10f;
  34. // set gravity
  35. mWorld.setGravity(0, 4);// 47
  36. {
  37. BodyDef bd = BodyDef.make();
  38. bd.setType(Body.TYPE_DYNAMIC);
  39. bd.setPosition(0, y1);
  40. Body body = mWorld.createBody(bd);
  41. bd.destroy();
  42. PolygonShape shape = PolygonShape.make();
  43. shape.setAsBox(10f, s.height / s.width * 10f);
  44. int id = id(chushi);
  45. bc1 = body.createFixture(shape, 0.0f);
  46. Texture2D tex = Texture2D.makePNG(id);
  47. render.bindTexture(bc1, tex);
  48. tex.autoRelease();
  49. }
  50. {
  51. BodyDef bd = BodyDef.make();
  52. bd.setType(Body.TYPE_DYNAMIC);
  53. bd.setPosition(0, y1 + s.height / s.width * 20 - 0.26f);
  54. Body body = mWorld.createBody(bd);
  55. bd.destroy();
  56. PolygonShape shape = PolygonShape.make();
  57. shape.setAsBox(10f, s.height / s.width * 10f);
  58. bc2 = body.createFixture(shape, 0.0f);
  59. chushi--;
  60. int id = id(chushi);
  61. Texture2D tex = Texture2D.makePNG(id);
  62. render.bindTexture(bc2, tex);
  63. tex.autoRelease();
  64. }
  65. // place box2d to center of bottom edge
  66. mBox2D.setPosition(s.width / 2, 0);
  67. mWorld.setContactListener(this);
  68. // add contact listener
  69. schedule(new TargetSelector(this, "update(float)", new Object[] { 0f }));
  70. }
  71. public void update(float delta) {
  72. mWorld.step(1.f / 60.f, 10, 10);
  73. mWorld.clearForces();
  74. if (Box2.collision == true) {
  75. bc1.getBody().setLinearVelocity(
  76. WYPoint.make(0f, -2.56f * Box2.jump1));
  77. bc2.getBody().setLinearVelocity(
  78. WYPoint.make(0f, -2.56f * Box2.jump1));
  79. Box2.collision = false;
  80. }
  81. if (bc1.getBody().getPosition().y < -y1 + 0.26f) {
  82. int id = id(chushi);
  83. Texture2D tex = Texture2D.makePNG(id);
  84. render.bindTexture(bc1, tex);
  85. tex.autoRelease();
  86. chushi--;
  87. id = id(chushi);
  88. tex = Texture2D.makePNG(id);
  89. render.bindTexture(bc2, tex);
  90. tex.autoRelease();
  91. bc1.getBody().setTransform(0, y1, 0);
  92. bc2.getBody().setTransform(0,
  93. y1 + s.height / s.width * 20f - 0.26f, 0);// 35
  94. grass1 = true;
  95. grass2 = true;
  96. grass3 = true;
  97. }
  98. }
  99. public int id(int a) {
  100. int id = 0;
  101. switch (a) {
  102. case 1:
  103. id = R.drawable.background_1_1;
  104. break;
  105. case 2:
  106. id = R.drawable.background_2_2;
  107. break;
  108. case 3:
  109. id = R.drawable.background_3_3;
  110. break;
  111. case 4:
  112. id = R.drawable.background_4_4;
  113. break;
  114. case 5:
  115. id = R.drawable.background_5_5;
  116. break;
  117. case 6:
  118. id = R.drawable.background_6_6;
  119. break;
  120. case 7:
  121. id = R.drawable.background_7_7;
  122. break;
  123. case 8:
  124. id = R.drawable.background_8_8;
  125. break;
  126. case 9:
  127. id = R.drawable.background_9_9;
  128. break;
  129. case 10:
  130. id = R.drawable.background_10_10;
  131. break;
  132. case 11:
  133. id = R.drawable.background_11_11;
  134. break;
  135. case 12:
  136. id = R.drawable.background_12_12;
  137. break;
  138. case 13:
  139. id = R.drawable.background_13_13;
  140. break;
  141. case 14:
  142. id = R.drawable.background_14_14;
  143. break;
  144. case 15:
  145. id = R.drawable.background_15_15;
  146. break;
  147. case 16:
  148. id = R.drawable.background_16_16;
  149. break;
  150. case 17:
  151. id = R.drawable.background_17_17;
  152. break;
  153. case 18:
  154. id = R.drawable.background_18_18;
  155. break;
  156. case 19:
  157. id = R.drawable.background_19_19;
  158. break;
  159. case 20:
  160. id = R.drawable.background_20_20;
  161. break;
  162. case 21:
  163. id = R.drawable.background_21_21;
  164. break;
  165. case 22:
  166. id = R.drawable.background_22_22;
  167. break;
  168. case 23:
  169. id = R.drawable.background_23_23;
  170. break;
  171. case 24:
  172. id = R.drawable.background_24_24;
  173. break;
  174. case 25:
  175. id = R.drawable.background_25_25;
  176. break;
  177. case 26:
  178. id = R.drawable.background_26_26;
  179. break;
  180. case 27:
  181. id = R.drawable.background_27_27;
  182. break;
  183. case 28:
  184. id = R.drawable.background_28_28;
  185. break;
  186. case 29:
  187. id = R.drawable.background_29_29;
  188. break;
  189. case 30:
  190. id = R.drawable.background_30_30;
  191. break;
  192. }
  193. return id;
  194. }
  195. @Override
  196. public void beginContact(int contactPointer) {
  197. // TODO Auto-generated method stub
  198. Contact contact = Contact.from(contactPointer);
  199. contact.setEnabled(false);
  200. }
  201. @Override
  202. public void endContact(int contactPointer) {
  203. // TODO Auto-generated method stub
  204. Contact contact = Contact.from(contactPointer);
  205. contact.setEnabled(false);
  206. }
  207. @Override
  208. public void postSolve(int contactPointer, int arg1) {
  209. // TODO Auto-generated method stub
  210. Contact contact = Contact.from(contactPointer);
  211. contact.setEnabled(false);
  212. }
  213. @Override
  214. public void preSolve(int contactPointer, int arg1) {
  215. // TODO Auto-generated method stub
  216. Contact contact = Contact.from(contactPointer);
  217. contact.setEnabled(false);
  218. }
  219. }

第二层的设计,grass.java

view plain
  1. import com.wiyun.engine.box2d.Box2D;
  2. import com.wiyun.engine.box2d.Box2DRender;
  3. import com.wiyun.engine.box2d.FixtureAnimation;
  4. import com.wiyun.engine.box2d.collision.PolygonShape;
  5. import com.wiyun.engine.box2d.dynamics.Body;
  6. import com.wiyun.engine.box2d.dynamics.BodyDef;
  7. import com.wiyun.engine.box2d.dynamics.Fixture;
  8. import com.wiyun.engine.box2d.dynamics.World;
  9. import com.wiyun.engine.box2d.dynamics.World.IContactListener;
  10. import com.wiyun.engine.box2d.dynamics.contacts.Contact;
  11. import com.wiyun.engine.nodes.Director;
  12. import com.wiyun.engine.nodes.Layer;
  13. import com.wiyun.engine.opengl.Texture2D;
  14. import com.wiyun.engine.types.WYPoint;
  15. import com.wiyun.engine.types.WYSize;
  16. import com.wiyun.engine.utils.TargetSelector;
  17. public class grass extends Layer implements IContactListener {
  18. static World mWorld;
  19. Fixture grass1, grass2, grass3; // 漂浮物1,2,3(因为一开始只设计了了草,现在更改了)
  20. float grassx1, grassx2, grassx3;// 漂浮物1,2,3的横向移动速度,因为有云和草什么的,要具有不同的速度撒(因为一开始只设计了了草,现在更改了)
  21. float grassy1, grassy2, grassy3;// 漂浮物1,2,3的纵向移动速度
  22. Fixture bc1, bc2;
  23. WYSize s;
  24. Box2DRender render;
  25. float y1 = +17.8f, y2 = 0;
  26. protected Box2D mBox2D;
  27. grass() {
  28. mBox2D = Box2D.make();
  29. mBox2D.setDebugDraw(false);
  30. render = Box2DRender.make();
  31. mBox2D.setBox2DRender(render);
  32. mWorld = mBox2D.getWorld();
  33. s = Director.getInstance().getWindowSize();
  34. addChild(mBox2D);
  35. // set gravity
  36. mWorld.setGravity(0, 30);// 47
  37. first();
  38. // place box2d to center of bottom edge
  39. mBox2D.setPosition(s.width / 2, 0);
  40. mWorld.setContactListener(this);
  41. // add contact listener
  42. schedule(new TargetSelector(this, "update(float)", new Object[] { 0f }));
  43. }
  44. public void first() {
  45. {
  46. BodyDef bd = BodyDef.make();
  47. bd.setType(Body.TYPE_DYNAMIC);
  48. bd.setPosition(-5, 5);
  49. Body body = mWorld.createBody(bd);
  50. bd.destroy();
  51. PolygonShape shape = PolygonShape.make();
  52. shape.setAsBox(5f, 10f);
  53. grass1 = body.createFixture(shape, 0.0f);
  54. Texture2D tex = Texture2D.makePNG(R.drawable.branch_upper_flip);
  55. tex.autoRelease();
  56. render.bindTexture(grass1, tex);
  57. }
  58. {
  59. BodyDef bd = BodyDef.make();
  60. bd.setType(Body.TYPE_DYNAMIC);
  61. bd.setPosition(0, 65);
  62. Body body = mWorld.createBody(bd);
  63. bd.destroy();
  64. PolygonShape shape = PolygonShape.make();
  65. shape.setAsBox(12f, 12f);
  66. grass2 = body.createFixture(shape, 0.0f);
  67. Texture2D tex = Texture2D.makePNG(R.drawable.branch_lower);
  68. tex.autoRelease();
  69. render.bindTexture(grass2, tex);
  70. }
  71. {
  72. BodyDef bd = BodyDef.make();
  73. bd.setType(Body.TYPE_DYNAMIC);
  74. bd.setPosition(0, 120);
  75. Body body = mWorld.createBody(bd);
  76. bd.destroy();
  77. PolygonShape shape = PolygonShape.make();
  78. shape.setAsBox(13f, 13f);
  79. grass3 = body.createFixture(shape, 0.0f);
  80. Texture2D tex = Texture2D.makePNG(R.drawable.vines);
  81. render.bindTexture(grass3, tex);
  82. tex.autoRelease();
  83. }
  84. }
  85. public void update(float delta) {
  86. mWorld.step(1.f / 60.f, 10, 10);
  87. mWorld.clearForces();
  88. if (Box2.collision2 == true) {
  89. grass1.getBody().setLinearVelocity(
  90. WYPoint.make(grassx1, Box2.jump1 * (-19.14f + grassy1)));
  91. grass2.getBody().setLinearVelocity(
  92. WYPoint.make(grassx2, Box2.jump1 * (-19.14f + grassy2)));
  93. grass3.getBody().setLinearVelocity(
  94. WYPoint.make(grassx3, Box2.jump1 * (-19.14f + grassy3)));
  95. Box2.collision2 = false;
  96. }
  97. if (grass1.getBody().getPosition().y < -80) {
  98. float a = grass1.getBody().getPosition().x;
  99. grass1.getBody().setTransform(a, 80, 0);
  100. if (BC.grass1 == true) {
  101. BC.grass1 = false;
  102. if (BC.chushi < 29 && BC.chushi > 27) {
  103. Texture2D tex = Texture2D.makePNG(R.drawable.noimage);
  104. render.bindTexture(grass1, tex);
  105. tex.autoRelease();
  106. } else if (BC.chushi == 25) {
  107. Texture2D tex = Texture2D.makePNG(R.drawable.building);
  108. render.bindTexture(grass1, tex);
  109. tex.autoRelease();
  110. } else if (BC.chushi == 23) {
  111. Texture2D tex = Texture2D.makePNG(R.drawable.rock1);
  112. render.bindTexture(grass1, tex);
  113. tex.autoRelease();
  114. } else {
  115. Texture2D tex = Texture2D.makePNG(R.drawable.noimage);
  116. render.bindTexture(grass1, tex);
  117. tex.autoRelease();
  118. }
  119. }
  120. }
  121. if (grass2.getBody().getPosition().y < -80) {
  122. float a = grass2.getBody().getPosition().x;
  123. grass2.getBody().setTransform(a, 80, 0);
  124. if (BC.grass2 == true) {
  125. BC.grass2 = false;
  126. if (BC.chushi == 28) {
  127. Texture2D tex = Texture2D.makePNG(R.drawable.branch_blue);
  128. render.bindTexture(grass2, tex);
  129. tex.autoRelease();
  130. } else if (BC.chushi == 26 && BC.chushi == 27) {
  131. Texture2D tex = Texture2D.makePNG(R.drawable.cloud_white_2);
  132. render.bindTexture(grass2, tex);
  133. grassx2 = -3f;
  134. tex.autoRelease();
  135. } else {
  136. Texture2D tex = Texture2D.makePNG(R.drawable.noimage);
  137. render.bindTexture(grass2, tex);
  138. tex.autoRelease();
  139. }
  140. }
  141. }
  142. if (grass3.getBody().getPosition().y < -80) {
  143. float a = grass3.getBody().getPosition().x;
  144. if (BC.chushi != 23) {
  145. grass3.getBody().setTransform(a, 80, 0);
  146. } else {
  147. grass3.getBody().setTransform(a, 280, 0);
  148. }
  149. if (BC.grass3 == true) {
  150. BC.grass3 = false;
  151. if (BC.chushi == 28) {
  152. Texture2D tex = Texture2D.makePNG(R.drawable.bridge);
  153. render.bindTexture(grass3, tex);
  154. tex.autoRelease();
  155. } else if (BC.chushi == 25 || BC.chushi == 24
  156. || BC.chushi == 26 || BC.chushi == 27) {
  157. Texture2D tex = Texture2D.makePNG(R.drawable.cloud_city);
  158. render.bindTexture(grass3, tex);
  159. tex.autoRelease();
  160. } else if (BC.chushi == 23) {
  161. Texture2D tex = Texture2D
  162. .makePNG(R.drawable.asteroids_deep);
  163. render.bindTexture(grass3, tex);
  164. grassy3 = -40f;
  165. tex.autoRelease();
  166. } else if (BC.chushi == 22) {
  167. Texture2D tex = Texture2D.makePNG(R.drawable.yellow_clouds);
  168. render.bindTexture(grass3, tex);
  169. grassy3 = -5f;
  170. tex.autoRelease();
  171. } else if (BC.chushi == 19) {
  172. Texture2D tex = Texture2D.makePNG(R.drawable.cloud_white_1);
  173. render.bindTexture(grass3, tex);
  174. grassx3 = 4f;
  175. grassy3 = 0f;
  176. tex.autoRelease();
  177. }
  178. }
  179. }
  180. if (grass3.getBody().getPosition().x < -24) {
  181. float a = grass3.getBody().getPosition().y;
  182. grass3.getBody().setTransform(24, a, 0);
  183. }
  184. if (grass3.getBody().getPosition().x > 24) {
  185. float a = grass3.getBody().getPosition().y;
  186. grass3.getBody().setTransform(-24, a, 0);
  187. }
  188. if (grass2.getBody().getPosition().x < -24) {
  189. float a = grass2.getBody().getPosition().y;
  190. grass2.getBody().setTransform(24, a, 0);
  191. }
  192. if (grass2.getBody().getPosition().x > 24) {
  193. float a = grass2.getBody().getPosition().y;
  194. grass2.getBody().setTransform(-24, a, 0);
  195. }
  196. if (grass1.getBody().getPosition().x < -24) {
  197. float a = grass1.getBody().getPosition().y;
  198. grass1.getBody().setTransform(24, a, 0);
  199. }
  200. if (grass1.getBody().getPosition().x > 24) {
  201. float a = grass1.getBody().getPosition().y;
  202. grass1.getBody().setTransform(-24, a, 0);
  203. }
  204. }
  205. @Override
  206. public void beginContact(int contactPointer) {
  207. // TODO Auto-generated method stub
  208. Contact contact = Contact.from(contactPointer);
  209. contact.setEnabled(false);
  210. }
  211. @Override
  212. public void endContact(int contactPointer) {
  213. // TODO Auto-generated method stub
  214. Contact contact = Contact.from(contactPointer);
  215. contact.setEnabled(false);
  216. }
  217. @Override
  218. public void postSolve(int contactPointer, int arg1) {
  219. // TODO Auto-generated method stub
  220. Contact contact = Contact.from(contactPointer);
  221. contact.setEnabled(false);
  222. }
  223. @Override
  224. public void preSolve(int contactPointer, int arg1) {
  225. // TODO Auto-generated method stub
  226. Contact contact = Contact.from(contactPointer);
  227. contact.setEnabled(false);
  228. }
  229. }

最上面一层的设计

Box2.java

view plain
  1. import java.nio.channels.Selector;
  2. import java.util.Random;
  3. import com.wiyun.engine.box2d.Box2D;
  4. import com.wiyun.engine.box2d.Box2DRender;
  5. import com.wiyun.engine.box2d.FixtureAnimation;
  6. import com.wiyun.engine.box2d.collision.PolygonShape;
  7. import com.wiyun.engine.box2d.dynamics.Body;
  8. import com.wiyun.engine.box2d.dynamics.BodyDef;
  9. import com.wiyun.engine.box2d.dynamics.Fixture;
  10. import com.wiyun.engine.box2d.dynamics.World;
  11. import com.wiyun.engine.box2d.dynamics.World.IContactListener;
  12. import com.wiyun.engine.box2d.dynamics.contacts.Contact;
  13. import com.wiyun.engine.nodes.Director;
  14. import com.wiyun.engine.nodes.Layer;
  15. import com.wiyun.engine.nodes.Scheduler;
  16. import com.wiyun.engine.nodes.Timer;
  17. import com.wiyun.engine.opengl.Texture2D;
  18. import com.wiyun.engine.particle.ParticleSystem;
  19. import com.wiyun.engine.particle.QuadParticleSystem;
  20. import com.wiyun.engine.types.WYPoint;
  21. import com.wiyun.engine.types.WYSize;
  22. import com.wiyun.engine.utils.TargetSelector;
  23. public class Box2 extends Layer implements IContactListener {
  24. World mWorld;
  25. Body m_character;
  26. float x;
  27. float y;
  28. float taijiex=1;
  29. static float change1 = 1, jump1 = 1,boost1=0;
  30. boolean hide=false;
  31. int donghua = 0; // 娃娃上升的判断条件(在碰撞时被赋值为true)
  32. int donghua2 = 1; // 娃娃下落的判断条件(在娃娃速度为0时被赋值为true)
  33. WYSize s;// 屏幕大小
  34. Character character;// 角色类的声明
  35. Taijie[] taijie;// 台阶类的声明
  36. WYPoint sp;// 整个场景的移动速度(碰撞后台阶都赋予这个速度) ps:grass1,2,3要自己重新赋速度了
  37. int mum = 0;
  38. int move=-1;
  39. Timer t ;
  40. static Box2DRender render;// 向一个关联里面加入图片或者动画信息
  41. static boolean collision = false, collision2 = false;
  42. boolean taijiemove=false;
  43. protected Box2D mBox2D;
  44. ParticleSystem emitter;
  45. Fixture jump, boost, change;
  46. Box2() {
  47. mBox2D = Box2D.make();
  48. mBox2D.setDebugDraw(false);
  49. render = Box2DRender.make();
  50. mBox2D.setBox2DRender(render);
  51. mWorld = mBox2D.getWorld();
  52. sp = WYPoint.make(0f, 0f);
  53. character = new Character(mWorld, 15f);
  54. taijie = new Taijie[10];
  55. {
  56. for (int i = 0; i < taijie.length; i++) {
  57. taijie[i] = new Taijie(mWorld);
  58. taijie[i].m_platform.getBody().setTransform(0, taijie[i].m_platform.getBody().getPosition().y + 4.6f, 0);
  59. }
  60. }
  61. Random a = new Random();
  62. {
  63. BodyDef bd = BodyDef.make();
  64. bd.setType(Body.TYPE_DYNAMIC);
  65. bd.setPosition((float) a.nextInt(13) - 5.5f, 2.1f * 80f);
  66. Body body = mWorld.createBody(bd);
  67. bd.destroy();
  68. PolygonShape shape = PolygonShape.make();
  69. shape.setAsBox(1.3f, 1.3f);
  70. jump = body.createFixture(shape, 0.0f);
  71. Texture2D tex = Texture2D.makePNG(R.drawable.jump);
  72. render.bindTexture(jump, tex);
  73. tex.autoRelease();
  74. }
  75. {
  76. BodyDef bd = BodyDef.make();
  77. bd.setType(Body.TYPE_DYNAMIC);
  78. bd.setPosition((float) a.nextInt(13) - 5.5f, 2.1f * 180f);
  79. Body body = mWorld.createBody(bd);
  80. bd.destroy();
  81. PolygonShape shape = PolygonShape.make();
  82. shape.setAsBox(1.3f, 1.3f);
  83. boost = body.createFixture(shape, 0.0f);
  84. Texture2D tex = Texture2D.makePNG(R.drawable.boost);
  85. render.bindTexture(boost, tex);
  86. tex.autoRelease();
  87. }
  88. {
  89. BodyDef bd = BodyDef.make();
  90. bd.setType(Body.TYPE_DYNAMIC);
  91. bd.setPosition((float) a.nextInt(13) - 5.5f, 2.1f * 150f);
  92. Body body = mWorld.createBody(bd);
  93. bd.destroy();
  94. PolygonShape shape = PolygonShape.make();
  95. shape.setAsBox(1.3f, 1.3f);
  96. change = body.createFixture(shape, 0.0f);
  97. Texture2D tex = Texture2D.makePNG(R.drawable.changge);
  98. render.bindTexture(change, tex);
  99. tex.autoRelease();
  100. }
  101. s = Director.getInstance().getWindowSize();
  102. emitter = new ParticleSnow();
  103. emitter.setPosition(-1000, -1000);
  104. main.mScene.addChild(emitter);
  105. addChild(mBox2D);
  106. // set gravity
  107. mWorld.setGravity(0, 47);// 47
  108. // place box2d to center of bottom edge
  109. mBox2D.setPosition(s.width / 2, 0);
  110. // add contact listener
  111. mWorld.setContactListener(this);
  112. setAccelerometerEnabled(true);
  113. schedule(new TargetSelector(this, "update(float)", new Object[] { 0f }));
  114. }
  115. public void update(float delta) {
  116. mWorld.step(1.f / 60.f, 10, 10);
  117. mWorld.clearForces();
  118. float top = 0;
  119. for (int i2 = 0; i2 < taijie.length; i2++) {
  120. if (taijie[i2].m_platform.getBody().getPosition().y > top) {
  121. top = taijie[i2].m_platform.getBody().getPosition().y;
  122. }
  123. }
  124. for (int i2 = 0; i2 < taijie.length; i2++) {
  125. if (taijie[i2].m_platform.getBody().getPosition().y < -2) {
  126. Random a= new Random();
  127. Random b = new Random();
  128. Random c = new Random();
  129. b.nextInt(30);
  130. if(i2==move)
  131. {
  132. Scheduler.getInstance().unschedule(t);
  133. move=-1;
  134. taijie[i2].m_platform.getBody().setLinearVelocity(WYPoint.make(0, taijie[i2].m_platform.getBody().getLinearVelocity().y));
  135. Texture2D tex = Texture2D.makePNG(R.drawable.bar1);
  136. render.bindTexture(taijie[i2].m_platform, tex);
  137. tex.autoRelease();
  138. }
  139. if(hide==true&&b.nextInt(30)>BC.chushi)
  140. {
  141. taijie[i2].m_platform.getBody().setTransform(-100f, top + 4.6f, 0);
  142. hide=false;
  143. }else
  144. {
  145. taijie[i2].m_platform.getBody().setTransform((float) a.nextInt(16) - 7.5f, top + 4.6f, 0);
  146. hide=true;
  147. if(c.nextInt(30)+1>BC.chushi&&move==-1)
  148. {
  149. Random e = new Random();
  150. taijie[i2].m_platform.getBody().setTransform(-3f, taijie[i2].m_platform.getBody().getPosition().y, 0);
  151. taijie[i2].m_platform.getBody().setLinearVelocity(WYPoint.make(+e.nextInt(2)+4, taijie[i2].m_platform.getBody().getLinearVelocity().y));
  152. Texture2D tex = Texture2D.makePNG(R.drawable.bar3);
  153. render.bindTexture(taijie[i2].m_platform, tex);
  154. tex.autoRelease();
  155. TargetSelector mSelector1 = new TargetSelector(this, "updatechange(float,int,int)", new Object[] { 0f, 1 ,i2});
  156. t = new Timer(mSelector1, 2f);
  157. Scheduler.getInstance().schedule(t);
  158. move=i2;
  159. System.out.println("时间已经设置了");
  160. }
  161. }
  162. GameView.fenshu++;
  163. }
  164. }
  165. /*
  166. for (int i2 = 0; i2 < taijie.length; i2++) {
  167. if (taijie[i2].m_platform.getBody().getPosition().x < -2) {
  168. taijie[i2].m_platform.getBody().setLinearVelocity(WYPoint.make(taijie[i2].m_platform.getBody().getLinearVelocity().x*-1f, 0));
  169. }else if(taijie[i2].m_platform.getBody().getPosition().x >20)
  170. {
  171. taijie[i2].m_platform.getBody().setLinearVelocity(WYPoint.make(taijie[i2].m_platform.getBody().getLinearVelocity().x*-1f, 0));
  172. }
  173. }*/
  174. if (GameView.score < GameView.fenshu * 100) {
  175. GameView.score += 9;
  176. }
  177. if (jump.getBody().getPosition().y < -11.1) {
  178. Random a = new Random();
  179. jump.getBody().setTransform((float) a.nextInt(13) - 5.5f, 650, 0);
  180. }
  181. if (change.getBody().getPosition().y < -11.1) {
  182. Random a = new Random();
  183. change.getBody().setTransform((float) a.nextInt(13) - 5.5f, 650, 0);
  184. }
  185. if (boost.getBody().getPosition().y < -11.1) {
  186. Random a = new Random();
  187. boost.getBody().setTransform((float) a.nextInt(13) - 5.5f, 650, 0);
  188. }
  189. if (character.m_character.getBody().getPosition().x < -11.1) {
  190. float a = character.m_character.getBody().getPosition().y;
  191. character.m_character.getBody().setTransform(11, a, 0);
  192. } else if (character.m_character.getBody().getPosition().x > 11.1) {
  193. float a = character.m_character.getBody().getPosition().y;
  194. character.m_character.getBody().setTransform(-11, a, 0);
  195. }
  196. if(boost1==0)
  197. {
  198. if (taijie[0].m_platform.getBody().getLinearVelocity().y >= 0
  199. && donghua2 == 1) {
  200. FixtureAnimation anim = FixtureAnimation.make(0.2f,
  201. R.drawable.down, R.drawable.down2, R.drawable.down3);
  202. anim.setLoop(true);
  203. anim.start(character.m_character);
  204. donghua2 = 0;
  205. } else if (donghua == 1) {
  206. FixtureAnimation anim = FixtureAnimation.make(0.15f,
  207. R.drawable.up1, R.drawable.up2, R.drawable.up3,
  208. R.drawable.up4, R.drawable.up5, R.drawable.up6);
  209. anim.setLoop(false);
  210. anim.start(character.m_character);
  211. donghua = 0;
  212. }
  213. }else
  214. {
  215. FixtureAnimation anim = FixtureAnimation.make(0.15f,
  216. R.drawable.up1, R.drawable.up2, R.drawable.up3,
  217. R.drawable.up4, R.drawable.up5, R.drawable.up6);
  218. anim.setLoop(false);
  219. anim.start(character.m_character);
  220. }
  221. }
  222. public void updatechange(float a,int c,int n)
  223. {
  224. taijie[n].m_platform.getBody().setLinearVelocity(WYPoint.make(taijie[move].m_platform.getBody().getLinearVelocity().x*-1f, taijie[move].m_platform.getBody().getLinearVelocity().y));
  225. }
  226. public void updategravityOnce(float a) {
  227. BC.mWorld.setGravity(0, 4);
  228. grass.mWorld.setGravity(0, 30);
  229. mWorld.setGravity(0, 47);
  230. Texture2D tex = Texture2D.makePNG(R.drawable.boost);
  231. render.bindTexture(boost, tex);
  232. tex.autoRelease();
  233. boost1=0;
  234. emitter.setPosition(-1000, -1000);
  235. }
  236. public void updatejumpOnce(float a) {
  237. jump1 = 1;
  238. Texture2D tex = Texture2D.makePNG(R.drawable.jump);
  239. render.bindTexture(jump, tex);
  240. tex.autoRelease();
  241. }
  242. public void updatechangeOnce(float a) {
  243. change1 = 1;
  244. Texture2D tex = Texture2D.makePNG(R.drawable.changge);
  245. render.bindTexture(change, tex);
  246. tex.autoRelease();
  247. }
  248. @Override
  249. public void wyAccelerometerChanged(float accelX, float accelY, float accelZ) {
  250. x = accelX;
  251. character.m_character.getBody().setLinearVelocity(
  252. WYPoint.make(change1
  253. * (5f * x + character.m_character.getBody()
  254. .getLinearVelocity().x * 0.8f), -y));
  255. if(boost1==1)
  256. {
  257. emitter.setPosition(character.m_character.getBody().getPosition().x*24+s.width/2, character.m_character.getBody().getPosition().y*24-50);
  258. }
  259. // update(1f);
  260. /*
  261. * if(character.m_character.getBody().getPosition().x<-15f) {
  262. * character=null; character=new Character(mWorld,30f); }
  263. * if(character.m_character.getBody().getPosition().x>30f) {
  264. * character=null; character=new Character(mWorld,-14.5f); }
  265. */
  266. }
  267. @Override
  268. public void beginContact(int contactPointer) {
  269. // TODO Auto-generated method stub
  270. /**/
  271. }
  272. @Override
  273. public void endContact(int arg0) {
  274. // TODO Auto-generated method stub
  275. y = 0;
  276. }
  277. @Override
  278. public void postSolve(int arg0, int arg1) {
  279. // TODO Auto-generated method stub
  280. }
  281. @Override
  282. public void preSolve(int contactPointer, int oldManifoldPointer) {
  283. // TODO Auto-generated method stub
  284. Contact contact = Contact.from(contactPointer);
  285. Fixture fixtureA = contact.getFixtureA();
  286. Fixture fixtureB = contact.getFixtureB();
  287. boolean pengzhuang = false;
  288. int i = 0;
  289. if (fixtureA.equals(character.m_character)) {
  290. pengzhuang = true;
  291. if (fixtureB.equals(boost)) {
  292. BC.mWorld.setGravity(0, -3);
  293. grass.mWorld.setGravity(0, -22);
  294. mWorld.setGravity(0, -35);
  295. Texture2D tex = Texture2D.makePNG(R.drawable.noimage);
  296. render.bindTexture(boost, tex);
  297. tex.autoRelease();
  298. boost1=1;
  299. emitter.setPosition(character.m_character.getBody().getPosition().x*24+s.width/2, character.m_character.getBody().getPosition().y*24-50);
  300. scheduleOnce(new TargetSelector(this,
  301. "updategravityOnce(float)", new Object[] { 0f }), 4f);
  302. pengzhuang = false;
  303. GameView.gameview.play2();
  304. } else if (fixtureB.equals(jump)) {
  305. jump1 = 2f;
  306. Texture2D tex = Texture2D.makePNG(R.drawable.noimage);
  307. render.bindTexture(jump, tex);
  308. tex.autoRelease();
  309. scheduleOnce(new TargetSelector(this, "updatejumpOnce(float)",new Object[] { 0f }), 5f);
  310. pengzhuang = false;
  311. } else if (fixtureB.equals(change)) {
  312. change1 = -1;
  313. Texture2D tex = Texture2D.makePNG(R.drawable.noimage);
  314. render.bindTexture(change, tex);
  315. tex.autoRelease();
  316. scheduleOnce(new TargetSelector(this,
  317. "updatechangeOnce(float)", new Object[] { 0f }), 3f);
  318. pengzhuang = false;
  319. }
  320. while (!fixtureB.equals(taijie[i].m_platform)
  321. && i < taijie.length - 1) {
  322. i++;
  323. }
  324. } else if (fixtureB.equals(character.m_character)) {
  325. pengzhuang = true;
  326. while (!fixtureA.equals(taijie[i].m_platform)
  327. && i < taijie.length - 1) {
  328. i++;
  329. }
  330. }
  331. if (pengzhuang == true) {
  332. if (taijie[i].m_platform.getBody().getLinearVelocity().y > 0
  333. && taijie[i].m_platform.getBody().getPosition().y + 1.2f < character.m_character
  334. .getBody().getPosition().y) {
  335. contact.setEnabled(true);
  336. sp = WYPoint.make(0f, -30f * jump1);
  337. for (int i2 = 0; i2 < taijie.length; i2++) {
  338. if(i2==move)
  339. {
  340. taijie[i2].m_platform.getBody().setLinearVelocity(WYPoint.make(taijie[i2].m_platform.getBody().getLinearVelocity().x, -30f * jump1));
  341. }
  342. else
  343. {
  344. taijie[i2].m_platform.getBody().setLinearVelocity(WYPoint.make(0, -30f * jump1));
  345. }
  346. }
  347. donghua = 1;
  348. donghua2 = 1;
  349. change.getBody().setLinearVelocity(sp);
  350. jump.getBody().setLinearVelocity(sp);
  351. boost.getBody().setLinearVelocity(sp);
  352. if(jump1==1)
  353. {
  354. GameView.gameview.play1();
  355. }else if(jump1==2)
  356. {
  357. GameView.gameview.play3();
  358. }
  359. System.out.println("碰撞了");
  360. collision = true;
  361. collision2 = true;
  362. /*
  363. * for(int i2=mum;i2<taijie.length;i2++) {
  364. * if(taijie[i2].m_platform.getBody().getPosition().y<-5) {
  365. * mWorld.destroyBody(taijie[i2].m_platform.getBody());
  366. * main.jishu++; float y=main.jishu*5f; Random aa=new Random();
  367. * BodyDef bd = BodyDef.make(); bd.setType(Body.TYPE_DYNAMIC);
  368. * bd.setPosition((float)aa.nextInt(20)-10, y); Body body =
  369. * mWorld.createBody(bd); bd.destroy();
  370. *
  371. *
  372. * PolygonShape shape = PolygonShape.make();
  373. * shape.setAsBox(2.0f, 0.4f); body.createFixture(shape, 0.0f);
  374. * } }
  375. */
  376. } else {
  377. contact.setEnabled(false);
  378. }
  379. } else {
  380. contact.setEnabled(false);
  381. }
  382. }
  383. public class ParticleSnow extends QuadParticleSystem {
  384. protected ParticleSnow() {
  385. this(700);
  386. }
  387. protected ParticleSnow(int p) {
  388. super(p);
  389. // duration
  390. setDuration(PARTICLE_DURATION_INFINITY);
  391. // Gravity mode: speed of particles
  392. setSpeedVariance(160, 20);
  393. // Gravity mode: radial
  394. setRadialAccelerationVariance(-90, 0);
  395. // Gravity mode: tagential
  396. setTangentialAccelerationVariance(0, 0);
  397. // gravity
  398. setParticleGravity(0, -1200);
  399. // angle
  400. setDirectionAngleVariance(90, 360);
  401. // life of particles
  402. setLifeVariance(3, 1);
  403. // spin of particles
  404. setEndSpinVariance(0, 2000);
  405. // color of particles
  406. setStartColorVariance(0.9f, 0.9f, 0.9f, 1f, 0f, 0f, 0.1f, 0f);
  407. setEndColorVariance(1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f);
  408. // size, in pixels
  409. setStartSizeVariance(20, 0);
  410. setEndSizeVariance(PARTICLE_START_SIZE_EQUAL_TO_END_SIZE, 0);
  411. // emits per second
  412. setEmissionRate(50);
  413. setTexture(Texture2D.makePNG(R.drawable.xingxing));
  414. // additive
  415. setBlendAdditive(false);
  416. }
  417. }
  418. }

基于微云游戏引擎的游戏开发——《猴子跳》相关推荐

  1. unity游戏开发毕设_《毕业设计(论文)-基于Unity游戏引擎的游戏设计》.doc

    学 号070125分类号本科生毕业论文(设计) 题目: 基于Unity游戏引擎的游戏设计 院(系) 电子与信息工程系专业 计算机科学与技术班级2007级学 生 姓 名指导教师(职称)提 交 时 间 二 ...

  2. 游戏引擎与游戏引擎开发入门

    早想写一点游戏设计的文章与大家交流,一是经验的问题,二是公司正在紧张的游戏制作期,实在抽不出多少时间,一直没有动手,今天忽然头脑发热,写了一段,以后准备陆续写一些游戏创意,策划,制作,流程管理,和制作 ...

  3. unity游戏引擎_Unity游戏引擎指南:如何开始使用最受欢迎的游戏引擎

    unity游戏引擎 Unity游戏开发 (Game Development with Unity) Unity is a cross-platform game engine developed by ...

  4. U3D 游戏引擎之游戏架构脚本该如何来写

    转载自:http://www.cnblogs.com/softimagewht/p/3916646.html 这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Un ...

  5. 聚播微信群控云控引擎二次开发SDK服务端对接接口

    聚播微信群控云控引擎二次开发SDK服务端对接接口 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo);b ...

  6. 游戏引擎与游戏开发入门介绍

    转自:https://www.cnblogs.com/Renyi-Fan 最近由于工作原因,需要对游戏开发有一个初步但完整的了解.因为自己之前刚毕业的时候接触过一些cocos-quick的开发,因此对 ...

  7. Egret蛮牛游戏引擎入门和开发(官方版)

    Egret蛮牛公开课是一套全面讲解Egret引擎入门和开发的视频教程,教程全套一共77集视频,是学习egret入门很好的学习资料. 围住神经猫案例视频讲解,基于winphone开发,整体游戏开发过程是 ...

  8. 手把手教你架构3d游戏引擎pdf_游戏开发中的算法

    游戏技术这条路,可深可浅.你可以满足于完成GamePlay玩法层面的东西,你也可以满足于架构和框架设计层面的东西,你也可以醉心于了解某一游戏引擎带来的掌控感.但是,我们不该止步于此,止步与目前所见或所 ...

  9. raspberry pi_如何在Raspberry Pi上使用LÖVE游戏引擎对游戏进行编程

    raspberry pi Raspberry Pi以向孩子介绍开源软件和编程而闻名. Pi是负担得起的,实用的专业级计算入门,伪装成可破解的乐趣. Mitch Resnick's Scratch (最 ...

  10. 最好JavaScript游戏引擎和游戏下载

    选择最适合您的项目JavaScript游戏引擎可能很困难. 做出最终选择之前,有很多因素需要考虑. 不仅包括功能,限制和要求之类的大选项,而且经常被忽略的较小细节(如可执行的导出选项,协作和支持的在线 ...

最新文章

  1. h5的语义化部分_H5 部分新语义化标签
  2. 科大星云诗社动态20210325
  3. SChema中group指示器的使用
  4. 主成分分析法_探索主成分分析法
  5. Android Alertdialog之多选对话框
  6. hibernate_使用c3p0连接池配置
  7. 【Websocket编程】基于libwebsockets实现客户端数据通信
  8. Dialog System, QA问答系统
  9. 九大百度竞价操作技巧
  10. 百度地图自定义信息窗口
  11. 人们熟知的一句名言是:“天才是1%的灵感加99%的汗水。”可如果没有那1%的灵感,世界上所有的汗水也就仅仅是一桶汗水而已。...
  12. cf 723 C2. Potions (Hard Version)(反悔,priority)
  13. python爬取js_Python爬取javascript(js)动态网页
  14. 故障--桥接网卡的坑
  15. Dojo 1.6 最新官方教程: Dojo DOM 函数
  16. 使用图像播放Java中的一种技巧-搜索图像,将图像转换为文本,隐藏数据
  17. C语言的输入输出模型
  18. 1.1Android的发展和历史
  19. HTA入门基础教程 | VBS脚本的GUI界面 HTA简明教程 ,附带完整历程及界面美化
  20. 【力扣周赛】第293场周赛

热门文章

  1. 核心频率个加速频率_加速频率作用是什么 加速频率作用介绍【详解】
  2. 搞互联网压力真大,我需要给自己减减压
  3. 关于软件“跑跑”的使用体验
  4. 模拟工程师必备——tsmcN28工艺指南学习
  5. win10上使用win-sshfs
  6. 黑白拼多多 一场针对“打假”的“半程”沟通会
  7. Hongkong trip 14th to 16th Sep'18
  8. 百度智能云战略升级,书写新基建的时代“三部曲”
  9. python优雅地实现输入关键词下载图片
  10. “金猿奖”启动 蝴蝶互动CEO凌海坐镇评审