libgdx [Collision]
2016-03-02 14:21
337 查看
MyGdxGame.java:
Major.java:
效果图:
tiles.tmx:
tiles.png:
animation.png:
package com.mygdx.game; import com.badlogic.gdx.Application; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.maps.MapLayer; import com.badlogic.gdx.maps.MapObject; import com.badlogic.gdx.maps.MapObjects; import com.badlogic.gdx.maps.MapProperties; import com.badlogic.gdx.maps.objects.EllipseMapObject; import com.badlogic.gdx.maps.objects.PolygonMapObject; import com.badlogic.gdx.maps.objects.RectangleMapObject; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TiledMapRenderer; import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.maps.tiled.objects.TiledMapTileMapObject; import com.badlogic.gdx.maps.tiled.renderers.IsometricTiledMapRenderer; import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; import com.badlogic.gdx.maps.tiled.tiles.AnimatedTiledMapTile; import com.badlogic.gdx.math.Ellipse; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Polygon; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.viewport.FitViewport; import com.badlogic.gdx.utils.viewport.ScreenViewport; import com.badlogic.gdx.utils.viewport.Viewport; import org.w3c.dom.css.Rect; public class MyGdxGame extends ApplicationAdapter { private static final float SCALE = 0.5926f; private static final int VIRTUAL_WIDTH = (int)(960 * SCALE); private static final int VIRTUAL_HEIGHT = (int)(540 * SCALE); private static final float CAMERA_SPEED = 100.0f; private OrthographicCamera camera; private Viewport viewport; private SpriteBatch batch; private TiledMap map; private TmxMapLoader loader; private OrthogonalTiledMapRenderer renderer; private Vector2 direction; private Array<Sprite> triggers; private Music song; Stage stage; Major major; @Override public void create() { int screenWidth = Gdx.graphics.getWidth(); int screenHeight = Gdx.graphics.getHeight(); Gdx.app.log("MyGdxGame", "create screenWidth:"+screenWidth+" screenHeight:"+screenHeight); Gdx.app.log("MyGdxGame", "create Gdx.app.getType():"+Gdx.app.getType()+" Application.ApplicationType.Desktop:"+Application.ApplicationType.Desktop); camera = new OrthographicCamera(); //camera.setToOrtho(false, 480, 336); viewport = new FitViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, camera); batch = new SpriteBatch(); loader = new TmxMapLoader(); map = loader.load("data/maps/tiled/tiles.tmx"); renderer = new OrthogonalTiledMapRenderer(map, batch); direction = new Vector2(); stage = new Stage(viewport);//new ScreenViewport()); Gdx.input.setInputProcessor(stage); major = new Major(this, 0, 0, SCALE, map); stage.addActor(major); stage.addActor(major.buttonL); stage.addActor(major.buttonR); processMapMetadata(); } @Override public void dispose() { map.dispose(); renderer.dispose(); stage.dispose(); batch.dispose(); if(song != null) song.dispose(); } @Override public void render() { Gdx.gl.glClearColor(1.0f, 1.0f, 0.0f, 1.0f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); updateCamera(); renderer.setView(camera); renderer.render(); stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f)); stage.draw(); } @Override public void resize(int width, int height) { //viewport.update(width, height); stage.getViewport().update(width, height, true); } int screenPage = -1; int moveDir = 0; public void updateCameraExtenal(int page, int dir){ if(screenPage != page) screenPage = page; moveDir = dir; } private void updateCamera() { direction.set(0.0f, 0.0f); int mouseX = Gdx.input.getX(); int mouseY = Gdx.input.getY(); int width = Gdx.graphics.getWidth(); int height = Gdx.graphics.getHeight(); if (Gdx.input.isKeyPressed(Input.Keys.LEFT) || (Gdx.input.isTouched() && mouseX < width * 0.25f && mouseY < height * 1.0f)) { direction.x = -20; } else if (Gdx.input.isKeyPressed(Input.Keys.RIGHT) || (Gdx.input.isTouched() && mouseX > width * 0.75f && mouseY < height * 1.0f)) { direction.x = 20; } int offset = 0; if(moveDir == 1) offset = 10; else if(moveDir == -1) offset = -10; if(screenPage == 2){ if(moveDir == 1) { if (camera.position.x < 864) direction.x = offset; else screenPage = -1; }else if(moveDir == -1) { if (camera.position.x > 864) direction.x = offset; else screenPage = -1; } }else if(screenPage == 3){ if(moveDir == 1) { if (camera.position.x < 1824) direction.x = offset; else screenPage = -1; }else if(moveDir == -1) { if (camera.position.x > 1824) direction.x = offset; else screenPage = -1; } }else if(screenPage == 1){ if(moveDir == 1) { if (camera.position.x < 0) direction.x = offset; else screenPage = -1; }else if(moveDir == -1) { if (camera.position.x > 0) direction.x = offset; else screenPage = -1; } } //direction.nor().scl(CAMERA_SPEED).scl(Gdx.graphics.getDeltaTime());; camera.position.x += direction.x; camera.position.y += direction.y; //Gdx.app.log("MyGdxGame", "updateCamera camera.position.x:"+camera.position.x); TiledMapTileLayer layer = (TiledMapTileLayer)map.getLayers().get(0); float cameraMinX = viewport.getWorldWidth() * 0.5f; float cameraMinY = viewport.getWorldHeight() * 0.5f; float cameraMaxX = layer.getWidth() * layer.getTileWidth() - cameraMinX; float cameraMaxY = layer.getHeight() * layer.getTileHeight() - cameraMinY; camera.position.x = MathUtils.clamp(camera.position.x, cameraMinX, cameraMaxX); camera.position.y= MathUtils.clamp(camera.position.y, cameraMinY, cameraMaxY); major.setXOffset(camera.position.x /*- (VIRTUAL_WIDTH/2)*/); camera.update(); } private void processMapMetadata() { // Load music String songPath = map.getProperties().get("music", String.class); if(songPath != null) { song = Gdx.audio.newMusic(Gdx.files.internal(songPath)); if(song != null) { song.setLooping(true); song.play(); } } MapLayer mapLayer = map.getLayers().get(0); Gdx.app.log("MyGdxGame", "processMapMetadata mapLayer:" + mapLayer); int width = ((TiledMapTileLayer)mapLayer).getWidth(); int height = ((TiledMapTileLayer)mapLayer).getHeight(); Gdx.app.log("MyGdxGame", "processMapMetadata width:"+width+" height:"+height); float tileWidth = ((TiledMapTileLayer)mapLayer).getTileWidth(); float tileHeight = ((TiledMapTileLayer)mapLayer).getTileHeight(); Gdx.app.log("MyGdxGame", "processMapMetadata tileWidth:"+((TiledMapTileLayer)mapLayer).getTileWidth()+" tileHeight:"+((TiledMapTileLayer)mapLayer).getTileHeight()); major.setTileSize(tileWidth, tileHeight); if(mapLayer instanceof TiledMapTileLayer){ for(int x = 0; x < width; x++) { for(int y = 0; y < height; y++) { if(((TiledMapTileLayer)mapLayer).getCell(x, y) != null) { Gdx.app.log("MyGdxGame", "processMapMetadata x:"+x+" y:"+y); } } } } } }
Major.java:
package com.mygdx.game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TiledMapTileLayer; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; public class Major extends Actor{ float iconWidth = 32.0f, iconHeight = 48.0f; public static float x ; public static float y ; public float statetime; private TiledMap map; Texture texture; TextureRegion currentFrame; ImageButton buttonL; ImageButton buttonR; Animation aniRight; Animation aniLeft; Animation aniIdle; STATE state; float mapWidth, mapHeight; float tileWidth, tileHeight; float scaleSize = 0.0f; float xOffset = 0.0f; MyGdxGame gdxgame; enum STATE { Left,Right,Idel }; public Major(MyGdxGame myGdxGame, float x,float y, float scale, TiledMap tiledMap) { gdxgame = myGdxGame; map = tiledMap; scaleSize = scale; this.x = x; this.y = y; this.statetime = 0; this.show(); state = STATE.Idel; } public void setMapSize(float width, float height){ mapWidth = width; mapHeight = height; } public void setTileSize(float width, float height){ tileWidth = width; tileHeight = height; this.y = tileHeight; } public void setXOffset(float offset){ xOffset = offset; buttonL.setPosition(xOffset, 0); buttonR.setPosition(xOffset + 32 / scaleSize, 0); } @Override public void draw(Batch batch, float parentAlpha) { // TODO Auto-generated method stub statetime += Gdx.graphics.getDeltaTime(); this.update(); this.check(); batch.draw(currentFrame, x, y, 0.0f, 0.0f, iconWidth, iconHeight, 1.0f, 1.0f, 0.0f); } private boolean leftCheck(float x){ float startX = x; int startRow = (int)(startX/32); int startColumn = 1; float endX = x+32; int endRow = (int)(endX/32); int endColumn = 1; if(((TiledMapTileLayer)map.getLayers().get(0)).getCell(startRow, startColumn) != null || ((TiledMapTileLayer)map.getLayers().get(0)).getCell(endRow, endColumn) != null){ this.y = tileHeight * 2; return true; }else { this.y = tileHeight; return false; } } private boolean rightCheck(float x){ float startX = x+32; startX -= 1; if(startX < 0.0f) startX = 0.0f; int startRow = (int)(startX/32); int startColumn = 1; float endX = x; int endRow = (int)(endX/32); int endColumn = 1; if(((TiledMapTileLayer)map.getLayers().get(0)).getCell(startRow, startColumn) != null || ((TiledMapTileLayer)map.getLayers().get(0)).getCell(endRow, endColumn) != null){ this.y = tileHeight * 2; return true; }else { this.y = tileHeight; return false; } } public void update() { if(state == STATE.Left){ if(this.x >= 544 && (this.x - 4) < 544){ gdxgame.updateCameraExtenal(1, -1); }else if(this.x >= 928 && (this.x - 4) < 928){ gdxgame.updateCameraExtenal(2, -1); } leftCheck(this.x); this.x -= 4; if(this.x < 0) this.x = 0; }else if (state == STATE.Right) { if(this.x <= 544 && (this.x + 4) > 544){ gdxgame.updateCameraExtenal(2, 1); }else if(this.x <= 1113 && (this.x + 4) > 1113){ gdxgame.updateCameraExtenal(3, 1); } rightCheck(this.x); this.x +=4; if(this.x >= (45*32-32)) this.x = (45*32-32); }else { gdxgame.updateCameraExtenal(-1, 0); this.y = tileHeight; } this.x = x; } public void check() { if(state == STATE.Left) { currentFrame = aniLeft.getKeyFrame(statetime, true); //state = STATE.Idel; }else if (state == STATE.Right) { currentFrame = aniRight.getKeyFrame(statetime, true); //state = STATE.Idel; }else if (state == STATE.Idel) { currentFrame = aniIdle.getKeyFrame(statetime, true); } } public void show() { texture = new Texture(Gdx.files.internal("data/animation.png")); TextureRegion[][] spilt = TextureRegion.split(texture, (int)iconWidth, (int)iconHeight); TextureRegion[][] buttons = TextureRegion.split(texture, (int)iconWidth, (int)iconHeight); TextureRegion[] regionR = spilt[2]; aniRight = new Animation(0.1f, regionR); TextureRegion[] regionL = spilt[1]; aniLeft = new Animation(0.1f, regionL); TextureRegion[] regionI = new TextureRegion[1]; regionI[0] = spilt[0][0]; aniIdle = new Animation(0.1f, regionI); TextureRegion[] buttonsRegion = new TextureRegion[4]; buttonsRegion[0] = buttonsRegion[1] = new TextureRegion(texture, 0, 192, 64, 64); buttonsRegion[2] = buttonsRegion[3] = new TextureRegion(texture, 64, 192, 64, 64); buttonL = new ImageButton(new TextureRegionDrawable(buttonsRegion[0]), new TextureRegionDrawable(buttonsRegion[1])); buttonR = new ImageButton(new TextureRegionDrawable(buttonsRegion[2]), new TextureRegionDrawable(buttonsRegion[3])); buttonL.setOrigin(0, 0); buttonL.setPosition(xOffset, 0); buttonL.setSize(32, 32); buttonL.setScale(1/scaleSize); buttonL.getImage().setFillParent(true); buttonR.setOrigin(0, 0); buttonR.setPosition(xOffset + 32/scaleSize, 0); buttonR.setSize(32, 32); buttonR.setScale(1/scaleSize); buttonR.getImage().setFillParent(true); buttonL.addListener(new InputListener(){ @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { // TODO Auto-generated method stub state = STATE.Idel; super.touchUp(event, x, y, pointer, button); } @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { // TODO Auto-generated method stub state = STATE.Left; return true; } }); buttonR.addListener(new InputListener(){ @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { // TODO Auto-generated method stub state = STATE.Idel; super.touchUp(event, x, y, pointer, button); } @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { // TODO Auto-generated method stub state = STATE.Right; return true; } }); } }
效果图:
tiles.tmx:
<?xml version="1.0" encoding="UTF-8"?> <map version="1.0" orientation="orthogonal" renderorder="right-down" width="45" height="10" tilewidth="32" tileheight="32"> <tileset firstgid="1" name="tukuai" tilewidth="32" tileheight="32" spacing="1" margin="1"> <image source="tiles.png" width="512" height="256"/> </tileset> <layer name="块层 1" width="45" height="10"> <data encoding="csv"> 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,0,0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,0,0, 37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37 </data> </layer> </map>
tiles.png:
animation.png:
相关文章推荐
- Redis 3.0.7基于Sentinel的高可用安装及配置
- 在命令行中执行python,提示提示No module named "xxx"
- MySQl之常用命令---会不停的补充
- jquery ajaxupload实现打开文件夹上传指定位置的文件
- android 开发技巧(12)--更改 Toast 显示位置的技巧
- sleep和wait有什么区别
- 集成svn到eclipse luna
- 将数据库导入到PowerDesigner中
- poj1080--Human Gene Functions(dp:LCS变形)
- 0302读后感
- [转]Git远程操作详解
- lintcode-easy-Minimum Depth of Binary Tree
- js 利用throw 写的一个小程序
- IOS开发学习之自定义XIB的使用
- maven编译失败
- oracle的触发器
- 百度富文本编辑器ueditor使用总结
- Spring——jar包详解
- 学习Linux决心书
- JVM 运行时数据区及GC机制