这次使用了一个64格8向人物行走的图,用法和上次12格的一致。
当点击屏幕某个点时,人物走动到该触摸点后停止人物走动动画。
人物在走动过程中,屏幕中心一直跟随着人物移动。
代码中使用的图片:
代码:
public class MainActivity extends SimpleBaseGameActivity { private static final String LOG_TAG = "test camera"; private static final int CAMERA_WIDTH = 720; private static final int CAMERA_HEIGHT = 480; private static SmoothCamera camera; private static final int PLAYER_VELOCITY = 20; private static float vx;// 人物x轴方向的速度 private static float vy;// 人物y轴方向的速度 private BitmapTextureAtlas backgroundTextureAtlas; private TextureRegion backgroundTextureRegion; private BitmapTextureAtlas playerTextureAtlas; private TiledTextureRegion playerTextureRegion; private static final int STATE_MOVING = 0; private static final int STATE_STANDBY = 1; private int state = STATE_STANDBY;// 人物状态 private static float touchedLocalX; // 记录触摸点的x坐标 private static float touchedLocalY; // 记录触摸点的y坐标 public EngineOptions onCreateEngineOptions() { camera = new SmoothCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT, PLAYER_VELOCITY, PLAYER_VELOCITY, 1.5f); return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera); } @Override protected void onCreateResources() { BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); backgroundTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 2048, 1024); backgroundTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(backgroundTextureAtlas, this, "background.jpg", 0, 0); backgroundTextureAtlas.load(); playerTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 512, 1024); playerTextureRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(playerTextureAtlas, getAssets(), "girl.png", 0, 0, 8, 8); playerTextureAtlas.load(); } @Override protected Scene onCreateScene() { final Scene scene = new Scene(); Sprite background = new Sprite(CAMERA_WIDTH / 2 - backgroundTextureRegion.getWidth() / 2, CAMERA_HEIGHT / 2 - backgroundTextureRegion.getHeight() / 2, backgroundTextureRegion, this.mEngine.getVertexBufferObjectManager()); scene.attachChild(background); final AnimatedSprite player = new AnimatedSprite(CAMERA_WIDTH / 2 - playerTextureRegion.getWidth() / 2, CAMERA_HEIGHT / 2 - playerTextureRegion.getHeight() / 2, playerTextureRegion, this.mEngine.getVertexBufferObjectManager()); scene.attachChild(player); camera.setChaseEntity(player); scene.setOnSceneTouchListener(new IOnSceneTouchListener() { public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { if (!pSceneTouchEvent.isActionDown()) return false; touchedLocalX = pSceneTouchEvent.getX(); touchedLocalY = pSceneTouchEvent.getY(); float angle = (float) (Math.atan2(pSceneTouchEvent.getY() - player.getY(), pSceneTouchEvent.getX() - player.getX()) * 180 / Math.PI); Log.i(LOG_TAG, "angle: " + angle); if (angle >= -45 / 2 && angle < 45 / 2) { // right player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 16, 23, true); } else if (angle >= 45 / 2 && angle < 45 + 45 / 2) { // downright player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 32, 39, true); } else if (angle >= 45 - 45 / 2 && angle < 90 + 45 / 2) { // down player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 0, 7, true); } else if (angle >= 135 - 45 / 2 && angle < 135 + 45 / 2) { // downleft player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 40, 47, true); } else if (angle >= 180 - 45 / 2 || angle < -180 + 45 / 2) { // left player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 8, 15, true); } else if (angle <= -45 + 45 / 2 && angle > -45 - 45 / 2) { // upright player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 48, 55, true); } else if (angle <= -45 - 45 / 2 && angle > -90 - 45 / 2) { // up player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 24, 31, true); } else if (angle <= -90 - 45 / 2 && angle > -135 - 45 / 2) { // upleft player.animate(new long[] { 200, 200, 200, 200, 200, 200, 200, 200 }, 56, 63, true); } // calculate velocity of x & y coordinate axis float a = Math.abs(touchedLocalY - player.getY() - player.getHeight() / 2) / Math.abs(touchedLocalX - player.getX() - player.getWidth() / 2); int sideX = touchedLocalX > player.getX() + player.getWidth() / 2 ? 1 : -1; int sideY = touchedLocalY > player.getY() + player.getHeight() / 2 ? 1 : -1; vx = sideX * (PLAYER_VELOCITY / FloatMath.sqrt(1 + a * a)); vy = sideY * a * Math.abs(vx); state = STATE_MOVING; return false; } }); scene.registerUpdateHandler(new IUpdateHandler() { public void onUpdate(float pSecondsElapsed) { switch (state) { case STATE_MOVING: // calculate move distance of x & y coordinate axis float dx = vx * pSecondsElapsed; float dy = vy * pSecondsElapsed; // move the player player.setPosition(player.getX() + dx, player.getY() + dy); // estimate player's position arrive touchedLocal if (Math.abs(player.getX() + player.getWidth() / 2 - touchedLocalX) < 1.0f && Math.abs(player.getY() + player.getHeight() / 2 - touchedLocalY) < 1.0f) { state = STATE_STANDBY; player.stopAnimation(); } break; case STATE_STANDBY: break; } } public void reset() { } }); return scene; } }