20.libgdx,stage中默认相机的使用
主要思路:
通过查资料得知,stage中的默认封装的相机为OrthographicCamera,要操纵该相机,直接把他转化为OrthographicCamera即可使用
但是这会导致一个问题,即原本固定位置的ui也会变动
所以用原stage(gameStage)来装载原ui,用另一个自定义stage(smapStage)来装载游戏地图,内容等
通过操纵smapStage的相机来实现镜头切换
在自定义的SMapStage中,对actor做了定义,如果地图循环,则在地图右末多绘制一个地图宽,在指定位置切镜头,原理可以参照前面的随笔18
actor中也不能再定义x,y,因为他会影响框架的监听,使用原生坐标即可,也是因为此原因,我才改为通过镜头观察地图,而不是原来的移动actor位置等...(这样看我以前的移动actor的写法都是吃力不讨好)
所有代码如下
预览图场景
package com.zhfy.game.screen; import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputMultiplexer;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.profiling.GLProfiler;
import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.input.GestureDetector.GestureListener;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.utils.XmlReader;
import com.badlogic.gdx.utils.XmlReader.Element;
import com.badlogic.gdx.utils.viewport.FillViewport;
import com.badlogic.gdx.utils.viewport.StretchViewport;
import com.zhfy.game.MainGame;
import com.zhfy.game.config.ResConfig;
import com.zhfy.game.framework.GameLayout;
import com.zhfy.game.framework.GameUtil;
import com.zhfy.game.model.framework.CamerDAO;
import com.zhfy.game.model.framework.TextureRegionListDAO;
import com.zhfy.game.screen.stage.SMapStage; /**
* 主游戏场景(游戏主界面), 实现 Screen 接口 或者 继承 ScreenAdapter 类 <br/>
* 这里就展示一张图片代表游戏主界面
*/
public class SMapScreen extends ScreenAdapter { private MainGame game; private SMapStage smapStage;
private Stage gameStage; private TextureRegionListDAO imgLists; private ImageButton button;
//使用场景
private int screenId=81; private int stageId;
private CamerDAO cam; InputProcessorEvent processorEvent;
MapListener mapListener;
InputMultiplexer multiplexer; boolean isTouching;
float touchBaseX;
float touchBaseY;
float touch_X;
float touch_Y;
float moveX;
float moveY;
Label label; Label gameTimeLabel;
//中心点位置
float cx;
float cy;
float javaHeap;
float javaMaxHeap;
boolean ifLoop; //游戏舞台的基本宽高
static float GAMESTAGE_WIDTH;
static float GAMESTAGE_HEIGHT;
//GLProfile gp = new GrayFilter();
GLProfiler gp; //ui
private Element uiR;
private List<Element> ui;
private XmlReader reader ;
private String bgTexture;
private float tempX,tempY,tempW,tempH;
private com.badlogic.gdx.utils.Array<Element> buttonEs;
private Map tempMap; private int i;//function的计数标志,从1开始
// private SMapActor mapActor; public SMapScreen(MainGame mainGame) { this.game=mainGame;
GAMESTAGE_WIDTH=game.getWorldWidth();
GAMESTAGE_HEIGHT=game.getWorldHeight(); //ui
{
reader = ResConfig.reader;
uiR=GameLayout.getXmlERootByScreenId(screenId);
ui=GameUtil.getXmlEByRootE(uiR);
} setStageId(mainGame.getStageId()); //1根据mapid读取地图DAO
//2加载地图图片,生成图片作为背景
/*textureMap=framework.getMapByMapId(mapId);
defMap=framework.getDefMapByMapId(mapId);
mapW=defMap.getWidth();
mapH=defMap.getHeight();
mapSprite = new Sprite(textureMap);*/ //3增加拖动等功能,可以拖动地图
//4替换地图dao的地图素材
//5保存地图 gp =new GLProfiler(Gdx. graphics);
gp.enable(); isTouching=false;
multiplexer = new InputMultiplexer();
//根据screenId初始化资源
//获取对应图片
imgLists=GameUtil.getTextureReigonByScreenId( screenId,mainGame.getAssetManager()); // 使用伸展视口创建舞台
smapStage = new SMapStage(mainGame,new FillViewport(GAMESTAGE_WIDTH, GAMESTAGE_HEIGHT),screenId,imgLists);
// 将输入处理设置到舞台(必须设置, 否则点击按钮没效果)
multiplexer.addProcessor(smapStage);
gameStage = new Stage(new FillViewport(GAMESTAGE_WIDTH, GAMESTAGE_HEIGHT));
multiplexer.addProcessor(gameStage); cam=new CamerDAO(((OrthographicCamera)smapStage.getCamera()),GAMESTAGE_WIDTH,GAMESTAGE_HEIGHT,smapStage.getMapW_px(),smapStage.getMapH_px(),0.5f,1.2f,smapStage.getIfLoop());
// 创建游戏人物演员
//mapActor = new mapActor(new TextureRegion(mapSprite),0,0,mapW,mapH,GAMESTAGE_WIDTH, GAMESTAGE_HEIGHT); //mapActor = new MapActor(stageId,GAMESTAGE_WIDTH, GAMESTAGE_HEIGHT,mainGame.getAssetManager(),screenId); // 添加演员到舞台
// gameStage.addActor(mapActor);
//stageId不对,应从中获取对应的mapId,ifLoop也是 TODO
ifLoop=true;
// mapActor = new SMapActor(stageId,GAMESTAGE_WIDTH, GAMESTAGE_HEIGHT,mainGame.getAssetManager(),screenId,imgLists);
// gameStage.addActor(mapActor);
//将来以玩家选择国家首都为位置标准 TODO i=1;
for (int u=0;u<ui.size();u++) {
tempX=ui.get(u).getInt("x");tempY=ui.get(u).getInt("y");tempW=ui.get(u).getInt("w");tempH=ui.get(u).getInt("h"); //遍历window的buttons按钮
buttonEs = ui.get(u).getChildByName("buttons").getChildrenByNameRecursively("button"); // 递归遍历,否则的话返回null
for (int b=0,bMax=buttonEs.size;b<bMax;b++) {
//Gdx.app.log("ui测试", button.get("remark")); button = new ImageButton(new TextureRegionDrawable(imgLists.getTextureByName(buttonEs.get(b).get("imgUpName")).getTextureRegion()),new TextureRegionDrawable(imgLists.getTextureByName(buttonEs.get(b).get("imgDownName")).getTextureRegion()),new TextureRegionDrawable(imgLists.getTextureByName(buttonEs.get(b).get("imgDownName")).getTextureRegion()));
button.setSize(buttonEs.get(b).getInt("w")==0?imgLists.getTextureByName(buttonEs.get(b).get("imgUpName")).getTextureRegion().getRegionWidth():buttonEs.get(b).getInt("w")*imgLists.getTextureByName(buttonEs.get(b).get("imgUpName")).getTextureRegion().getRegionWidth()/100, buttonEs.get(b).getInt("h")==0?imgLists.getTextureByName(buttonEs.get(b).get("imgUpName")).getTextureRegion().getRegionHeight():buttonEs.get(b).getInt("h")*imgLists.getTextureByName(buttonEs.get(b).get("imgUpName")).getTextureRegion().getRegionHeight()/100);
button.setPosition(
buttonEs.get(b).getInt("x")*gameStage.getWidth()/100+button.getWidth()/2>gameStage.getWidth()?gameStage.getWidth()-button.getWidth():buttonEs.get(b).getInt("x")*gameStage.getWidth()/100-button.getWidth()/2<0?0:buttonEs.get(b).getInt("x")*gameStage.getWidth()/100-button.getWidth()/2,
buttonEs.get(b).getInt("y")*gameStage.getWidth()/100+button.getHeight()/2>gameStage.getHeight()?gameStage.getHeight()-button.getHeight():buttonEs.get(b).getInt("y")*gameStage.getHeight()/100-button.getHeight()/2<0?0:buttonEs.get(b).getInt("y")*gameStage.getHeight()/100-button.getHeight()/2);
tempMap=new HashMap();
tempMap.put("FUNCTION_ID", buttonEs.get(b).get("functionId"));
tempMap.put("ID", i);
i++;
function(tempMap);
gameStage.addActor(button);
Gdx.input.setInputProcessor(gameStage);
}
}
//文字示例
label=new Label("FPS:"+Gdx.graphics.getFramesPerSecond(),new LabelStyle(mainGame.getFont(), null)); label.setWidth(200);//设置每行的宽度
label.setWrap(true);//开启换行
label.setPosition(20, 40); gameTimeLabel=new Label(smapStage.getsMapDAO().getTime().getTime(),new LabelStyle(mainGame.getFont(), null));
gameTimeLabel.setPosition(GAMESTAGE_WIDTH/2, GAMESTAGE_HEIGHT*0.95f); gameStage.addActor(label);
gameStage.addActor(gameTimeLabel); processorEvent = new InputProcessorEvent();
mapListener=new MapListener(); //Gdx.app.log("平台", Gdx.app.getType().toString());
switch (Gdx.app.getType()) {
case Desktop:// Code for Desktop applicationbreak;
multiplexer.addProcessor(processorEvent);
case Android:// Code for Android applicationbreak;
multiplexer.addProcessor(new GestureDetector(mapListener));
case WebGL:// Code for WebGL applicationbreak;
multiplexer.addProcessor(processorEvent);
default:// Unhandled (new?) platform applicationbreak;
multiplexer.addProcessor(processorEvent);
multiplexer.addProcessor(new GestureDetector(mapListener));
}
Gdx.input.setInputProcessor(multiplexer); } @Override
public void render(float delta) { handleInput(); smapStage.draw();
smapStage.act(); gameStage.draw();
gameStage.act();
//Gdx.app.log("FPS:", Gdx.graphics.getFramesPerSecond().toString); javaHeap=(Math.round(Gdx.app.getJavaHeap()/1024/1024*10)/10);
if(javaHeap>javaMaxHeap) {
javaMaxHeap=javaHeap;
} label.setText("FPS:"+Gdx.graphics.getFramesPerSecond());
label.getText().appendLine("");
label.getText().appendLine("javaHeap:"+javaHeap+"m/"+javaMaxHeap+"m");
label.getText().appendLine("drawCalls:"+gp.getDrawCalls());
label.getText().appendLine("nativeHeap:"+Math.round(Gdx.app.getNativeHeap()/1024/1024*10)/10+"m");
gameTimeLabel.setText(smapStage.getsMapDAO().getTime().getTime());
//label.getText().appendLine("inputKeyMode:"+mapActor.getKeyMode());//快捷键模式
gp.reset();
} public void dispose() {
super.dispose();
// 场景被销毁时释放资源
if (gameStage != null) {
gameStage.dispose();
gameStage=null;
}
if (smapStage != null) {
smapStage.dispose();
smapStage=null;
}
} //实现的功能
public void function(Map map){
int i=Integer.parseInt(map.get("FUNCTION_ID").toString());
switch(i) {
case 0://返回
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
//Gdx.app.log("点击了第1个按钮", "x:" + x+" y:" + y);
if(game!=null) {
game.showGameScreen(screenId,1);
}
}
});
break;
case 1://加载
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("点击了第2个按钮1", "x:" + x+" y:" + y+" stageId:"+stageId); }
});
break;
case 2://save
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("点击了第3个按钮", "x:" + x+" y:" + y+" stageId:"+stageId); }
});
break;
case 3://上一个时间
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
smapStage.getsMapDAO().getTime().lastTime();
Gdx.app.log("点击了第4个按钮", "x:" + x+" y:" + y+" time:"+smapStage.getsMapDAO().getTime().getTime());
}
});
break;
case 4://下一个时间
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
smapStage.getsMapDAO().getTime().nextTime();
Gdx.app.log("点击了第5个按钮", "x:" + x+" y:" + y+" time:"+smapStage.getsMapDAO().getTime().getTime());
}
});
break;
case 5:
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("点击了第6个按钮", "x:" + x+" y:" + y+" stageId:"+stageId);
}
});
break;
case 6:
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("点击了第7个按钮", "x:" + x+" y:" + y+" stageId:"+stageId); }
});
break;
default://查询绘制省区
button.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("点击了默认按钮", "x:" + x+" y:" + y);
}
});
break;
}
} public void resize(int width, int height) {
// use true here to center the camera
// that's what you probably want in case of a UI
gameStage.getViewport().update(width, height, false);
} //电脑
class InputProcessorEvent implements InputProcessor { @Override
public boolean keyDown(int keycode) {
/*if (keycode == Keys.BACK) {
// 处理返回事件
} else if (keycode == Keys.MENU) {
// 处理菜单事件
}*/
return true; // 如果此处设置为false那么不会执行key up
} @Override
public boolean keyUp(int keycode) {
return true;
}
@Override
public boolean keyTyped(char character) { // 可以输出按键的字母和数字,不过貌似不好使
return true;
} @Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
return true;
} @Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
return true;
} @Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
return true;
} @Override
public boolean mouseMoved(int screenX, int screenY) {
cx=screenX;
cy=screenY;
return true;
} @Override
public boolean scrolled(int amount) { if(amount>0) {
smapStage.setDrawLoop(cam.setZoomForMouse(cx,cy,-0.01f));
//((OrthographicCamera) smapStage.getCamera()).zoom -=0.01f;
// Gdx.app.log("scrolled","zoom:"+smapStage.getZoom()+" moveX:"+smapStage.getMoveX()+" moveY:"+smapStage.getMoveY()); //gameStage.setZoom(gameStage.getZoom()+0.01f,cx,cy);
//if(smapStage.setZoom(smapStage.getZoom()+0.01f,cx,cy)){ }
}else {
smapStage.setDrawLoop(cam.setZoomForMouse(cx,cy,0.01f));
//((OrthographicCamera) smapStage.getCamera()).zoom +=0.01f; //gameStage.setZoom(gameStage.getZoom()-0.01f,cx,cy);
//gameStage.getCamera().view.setToScaling(gameStage.getCamera().view.getScaleX()-0.01f,gameStage.getCamera().view.getScaleY()-0.01f,gameStage.getCamera().view.getScaleZ());
//if(smapStage.setZoom(smapStage.getZoom()-0.01f,cx,cy)){ } // ((OrthographicCamera) smapStage.getCamera()).translate(smapStage.getMoveX(),smapStage.getMoveY(),0 ); // Gdx.app.log("scrolled","zoom:"+smapStage.getZoom()+" moveX:"+smapStage.getMoveX()+" moveY:"+smapStage.getMoveY()); }
//Gdx.app.log("", mapActor.getZoom()+"");
return true;
} }
//触摸屏 class MapListener implements GestureListener{ @Override
public boolean touchDown(float x, float y, int pointer, int button) {
//Gdx.app.log("touchDown", "x:" + x+" y:" + y);
return false;
} @Override
public boolean tap(float x, float y, int count, int button) {
//Gdx.app.log("tap", "x:" + x+" y:" + y);
return false;
} @Override
public boolean longPress(float x, float y) {
Gdx.app.log("longPress", "x:" + x+" y:" + y);
return false;
} @Override
public boolean fling(float velocityX, float velocityY, int button) {
Gdx.app.log("fling", "velocityX:" + velocityX+" velocityY:" + velocityY);
return false;
} @Override
public boolean pan(float x, float y, float deltaX, float deltaY) {
Gdx.app.log("touchDown", "x:" + x+" y:" + y);
return false;
} @Override
public boolean panStop(float x, float y, int pointer, int button) {
//Gdx.app.log("touchDown", "x:" + x+" y:" + y);
return false;
} @Override
public boolean zoom (float originalDistance, float currentDistance){
Gdx.app.log("zoom", "originalDistance:" + originalDistance+" currentDistance:" + currentDistance);
//TODO 触摸缩放事件
return false;
} @Override
public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer){
Gdx.app.log("pinch", "");
return false;
}
@Override
public void pinchStop () {
Gdx.app.log("pinchStop", "");
} } private void handleInput() { // justTouched 是开始按下手指的第一个点。
if (Gdx.input.justTouched() && isTouching == false) {
isTouching = true;
touchBaseX = Gdx.input.getX(0);
touchBaseY = Gdx.input.getY(0);
//touchBaseX += cam.position.x - GAMESTAGE_WIDTH / 2;
//Gdx.app.log("触摸", "1"); // isTouched 是结束时,手指按下的点。
} else if (Gdx.input.isTouched(0) && isTouching == true) {
touch_X = Gdx.input.getX(0);
touch_Y = Gdx.input.getY(0);
moveX=(touchBaseX-touch_X)/20;
moveY=(touch_Y-touchBaseY)/20;
if(moveX>50) {
moveX=50;
}
if(moveX<-50) {
moveX=-50;
}
if(moveY>50) {
moveY=50;
}
if(moveY<-50) {
moveY=-50;
}
smapStage.setDrawLoop(cam.translateCam(moveX, moveY));
}else {
isTouching =false;
}
/*
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
mapActor.setZoom(mapActor.getZoom()+0.0001f,cx,cy);
}
if (Gdx.input.isKeyPressed(Input.Keys.Q)) {
mapActor.setZoom(mapActor.getZoom()-0.0001f,cx,cy);
}*/ /*if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
gameStage.setX(gameStage.getX()+1);
}
if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
gameStage.setX(gameStage.getX()-1);
}
if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
gameStage.setY(gameStage.getY()+1);
}
if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
gameStage.setY(gameStage.getY()-1);
}*/
} public int getStageId() {
return stageId;
} public void setStageId(int stageId) {
this.stageId = stageId;
} /* private void moveCam(float x,float y){
x=((OrthographicCamera) smapStage.getCamera()).position.x+x;
y= ((OrthographicCamera) smapStage.getCamera()).position.y+y;
y=Math.max(0,y);
y=Math.min(y,smapStage.getMapH_px());
//((OrthographicCamera) smapStage.getCamera()).translate(x,y,0 );
((OrthographicCamera) smapStage.getCamera()).position.x=x;
((OrthographicCamera) smapStage.getCamera()).position.y=y;
Gdx.app.log("moveCam"," x:"+((OrthographicCamera) smapStage.getCamera()).position.x+" y:"+((OrthographicCamera) smapStage.getCamera()).position.y);
}*/ }
SMapScreen
SMapstage,用来容纳游戏元素的容器
package com.zhfy.game.screen.stage; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.InputListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Pool;
import com.badlogic.gdx.utils.Pools;
import com.badlogic.gdx.utils.XmlReader;
import com.badlogic.gdx.utils.viewport.Viewport;
import com.zhfy.game.MainGame;
import com.zhfy.game.config.ResConfig;
import com.zhfy.game.framework.GameFramework;
import com.zhfy.game.framework.tool.BTLTooL;
import com.zhfy.game.model.content.BTLDAO;
import com.zhfy.game.model.content.MapBinDAO;
import com.zhfy.game.model.content.SMapDAO;
import com.zhfy.game.model.framework.TextureRegionListDAO;
import com.zhfy.game.screen.actor.SMapActor;
import com.zhfy.game.screen.actor.framework.ImageActor;
import com.zhfy.game.screen.actor.map.MapImageActor;
import com.zhfy.game.screen.stage.base.BaseStage; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List; public class SMapStage extends BaseStage { //实现功能
//地图对象与stage分离 SMapActor smapBg;
SMapDAO sMapDAO;
BTLDAO sMapBin;
int screenId;
TextureRegionListDAO imgLists; private boolean ifLoop;// 是否循环
private boolean drawLoop;
private float x;//玩家起始位置
private float y;
private float lastX;
private float lastY; private float zoom;
private float zoomMax;
private float zoomMin;
private float xMin;
private float yMin;
private float xMax;
private float yMax;
private int mapW_px;
private int mapH_px;
private MapBinDAO mapBinDAO; private HashMap playerMap;
private XmlReader.Element defStage;
private XmlReader.Element defHistory; private GameFramework gameFramework;
private MapImageActor battleMark; /** 当前界面可见的所有图像集合 */
private final ArrayList<MapImageActor> mapImageActorList = new ArrayList<MapImageActor>();
/** 图像对象缓存池, 因为需要频繁生成和移除, 所有使用对象池减少对象的频繁创建 */
private Pool<MapImageActor> mapImageActorPool; private List<Integer> newBattleList; public SMapStage(MainGame mainGame, Viewport viewport, int screenId, TextureRegionListDAO imgLists) {
super(mainGame, viewport);
this.screenId=screenId;
this.imgLists=imgLists;
this.gameFramework=mainGame.getGameFramework();
init();
} private void init() {
//getMainGame().getLogTime().reStar(); defStage = gameFramework.getDefStageByStageId(getMainGame().getStageId());
ifLoop = defStage.getBoolean("ifLoop"); playerMap=new HashMap();//TODO
playerMap.put("playerCountry",0);
playerMap.put("playerScore",0);
playerMap.put("gameMode",0); StringBuilder path=new StringBuilder("sav/");
path.append(defStage.get("name")).append(".bin");
boolean ifInit = Gdx.files.local(path.toString()).exists();
//boolean ifInit = Gdx.files.local("sav/"+defStage.get("name")+".bin").exists();
if(!ifInit){//如果不存在则生成
for(XmlReader.Element his:ResConfig.Config.DEF_HISTORY.getChildrenByName("hostory")){
if(his.getInt("id")==defStage.getInt("id")){
defHistory=his;
}
} BTLDAO historyDao = gameFramework.getBinDaoById(defHistory.get("name"), ResConfig.Rules.RULE_FB1_HISTORY);
mapBinDAO = gameFramework.getMapDaoByMapId(historyDao.getBm0().getBm0_2());
sMapDAO=new SMapDAO(historyDao,mapBinDAO,defHistory.getInt("mapId"),playerMap,defStage.getInt("year"),defStage.get("name"));
sMapBin=sMapDAO.getSmapBin(); historyDao=null;
}else{ try {
//sMapBin = BTLTooL.LoadBtl(ResConfig.Rules.RULE_FB1_SMAP,Gdx.files.local("sav/" +defStage.get("name") + ".bin").readBytes());
sMapBin = BTLTooL.LoadBtl(ResConfig.Rules.RULE_FB1_SMAP,Gdx.files.local(path.toString()).readBytes()); } catch (Exception e) {
e.printStackTrace();
}
mapBinDAO = gameFramework.getMapDaoByMapId(sMapBin.getBm0().getBm0_2());
//BTLDAO smapBin,MapBinDAO mapBin,,Map map
sMapDAO=new SMapDAO(sMapBin,playerMap);
}
//Gdx.app.log("ifInit",defStage.get("name")+":"+ifInit); smapBg=new SMapActor(getMainGame(),screenId,sMapDAO.getRegionColors());
addActor(smapBg); //TODO 玩家起始位置
this.x=10;
this.y=10;
this.zoom = 1f;
this.zoomMax = 1.2f;
this.zoomMin = 0.8f;
// 实际宽高
this.mapW_px = smapBg.gettextureMain().getWidth();
this.mapH_px = smapBg.gettextureMain().getHeight();
this.xMax = mapW_px*this.zoom-getMainGame().getWorldWidth();;
this.yMax = mapH_px*this.zoom-getMainGame().getWorldHeight();
this.yMin = 0;
this.xMin = 0;
drawLoop=false; /*
* 战斗标志
*/
mapImageActorPool = Pools.get(MapImageActor.class, 10);
initBattleMark();
syncPotion();
} @Override
public void dispose() {
super.dispose(); if(smapBg!=null){
smapBg.dispose();
smapBg=null;
}
defStage=null;
defHistory=null;
} public SMapActor getSmapBg() {
return smapBg;
} public void setSmapBg(SMapActor smapBg) {
this.smapBg = smapBg;
} public float getX() {
return x;
}
public void setX(float x) {
if(ifLoop){////判断当前坐标是否需要循环显示右边
if(x<=xMin&&x >= (-xMax * zoom + getMainGame().getWorldWidth())){
drawLoop=false;
//Gdx.app.log("x","1");
}else if(x>xMin){//从起点向左
drawLoop=true; x=(-xMax -getMainGame().getWorldWidth())+x;
// Gdx.app.log("x","2");
}else if(x < (-xMax + getMainGame().getWorldWidth())&&x>(-xMax )){//划入右边,接近循环
drawLoop=true;
// Gdx.app.log("x","3");
}else if(x<=(-xMax -getMainGame().getWorldWidth())) {//划出并还原
drawLoop=false;
x = x + xMax +getMainGame().getWorldWidth();
// Gdx.app.log("x","4");
}/**/
}else {
if (x > xMin) {
x = xMin;
} else if (x < -(xMax)) {
x = -(xMax);
}
}
lastX=this.x;
this.x = x;
syncPotion();
} public float getZoomMax() {
return zoomMax;
} public void setZoomMax(float zoomMax) {
this.zoomMax = zoomMax;
} public float getZoom() {
return zoom;
} public boolean setZoom(float zoom,float cx,float cy) { if(zoom < zoomMax&&zoom > zoomMin){
this.xMax = mapW_px*zoom-getMainGame().getWorldWidth();;
this.yMax = mapH_px*zoom-getMainGame().getWorldHeight();
this.xMin = 0;
this.yMin = 0;
}
if (zoom > zoomMax) {
zoom = zoomMax;
return false; } else if (zoom < zoomMin) {
zoom = zoomMin;
return false;
} else {
setX( x + ((x - cx) * (zoom-this.zoom)) / zoom);
setY( y + ((y - (getMainGame().getWorldHeight()-cy)) * (zoom-this.zoom)) / zoom);
this.zoom = zoom;
return true;
}
} public float getY() {
return y;
}
public void setY(float y) {
if (y > yMin) {
lastY=this.y;
y = yMin;
//Gdx.app.log("y","1");
} else if (y < -yMax) {
lastY=this.y;
y = -yMax;
//Gdx.app.log("y","2");
}
lastY=this.y;
this.y = y;
syncPotion();
//Gdx.app.log("y","Y"+y+" yMax:"+yMax+" zoom:"+zoom);
} public SMapDAO getsMapDAO() {
return sMapDAO;
} public void setsMapDAO(SMapDAO sMapDAO) {
this.sMapDAO = sMapDAO;
} public BTLDAO getsMapBin() {
return sMapBin;
} public void setsMapBin(BTLDAO sMapBin) {
this.sMapBin = sMapBin;
} public int getMapW_px() {
return mapW_px;
} public void setMapW_px(int mapW_px) {
this.mapW_px = mapW_px;
} public int getMapH_px() {
return mapH_px;
} public void setMapH_px(int mapH_px) {
this.mapH_px = mapH_px;
} public void initBattleMark(){
//初始化新增
initNewBattleMark();
//绘制新增
if(newBattleList.size()<1){
Gdx.app.log("SMapStage initBattleMark","无战斗地区");
return;
}
for(int i=0,iMax=newBattleList.size(),j;i<iMax;i++){
j=sMapDAO.getRegionSortMap().get(newBattleList.get(i));
if( sMapDAO.getSmapBin().getBm1().get(j).getBm1_6()==1){
//1战斗中
MapImageActor battleMarketActor = mapImageActorPool.obtain();
battleMarketActor.init(imgLists.getTextureByName(ResConfig.Image.BATTLE_MARK_1),smapBg.getMapW_px(),smapBg.getMapH_px(),smapBg.getW(),newBattleList.get(i));
battleMarketActor.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("12", "x:" + x+" y:" + y);
}
});
addActor(battleMarketActor);
mapImageActorList.add(battleMarketActor);
}else if(sMapDAO.getSmapBin().getBm1().get(j).getBm1_6()==2){
//2可参战
MapImageActor battleMarketActor = mapImageActorPool.obtain();
battleMarketActor.init(imgLists.getTextureByName(ResConfig.Image.BATTLE_MARK_2),smapBg.getMapW_px(),smapBg.getMapH_px(),smapBg.getW(),newBattleList.get(i));
battleMarketActor.addListener(new ClickListener() {
public void clicked(InputEvent event, float x, float y) {
Gdx.app.log("13", "x:" + x+" y:" + y);
}
});
addActor(battleMarketActor);
mapImageActorList.add(battleMarketActor);
}else{
Gdx.app.error("initBattleMark",newBattleList.get(i)+":"+j+":"+sMapDAO.getSmapBin().getBm1().get(j).getBm1_6());
}
}
} //清除图像并返回需创建的id集合
private void initNewBattleMark(){
if(mapImageActorList.size()==0){
newBattleList=sMapDAO.getBattleRegions();
}else {
newBattleList.clear();
Iterator<MapImageActor> it = mapImageActorList.iterator();
MapImageActor bmActor = null;//BattleMarket
while (it.hasNext()) {
bmActor = it.next();
if (!sMapDAO.getBattleRegions().contains(bmActor.getId())) {
// 从舞台中清除图像
getRoot().removeActor(bmActor);
// 从集合中清除该对象
it.remove();
// 回收对象(放回到对象池中)
mapImageActorPool.free(bmActor);
bmActor.clearListeners();
Gdx.app.log("clearListener","");
} else {
newBattleList.add(bmActor.getId());
}
}
}
}
// 同步移动,现在改为相机,只负责通知是否循环地图
private void syncPotion(){
smapBg.setDrawLoop(drawLoop);
//smapBg.syncPotion(getX(),getY(),getZoom(),drawLoop);
for(MapImageActor mapImage:mapImageActorList){
if(mapImage.isIfEable()){
mapImage.syncPotion(drawLoop);
}
}
} public void setDrawLoop(boolean drawLoop) {
this.drawLoop = drawLoop;
syncPotion();
} public boolean getIfLoop() {
return ifLoop;
}
}
SMapStage
对场景的相机进行封装
package com.zhfy.game.model.framework; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Camera;
import com.badlogic.gdx.graphics.OrthographicCamera; public class CamerDAO { private boolean ifLoop;
private float camZoomMax;
private float camZoomMin;
private float camXMin;
private float camYMin;
private float camXMax;
private float camYMax;
private float vw;
private float vh;
private OrthographicCamera camera; public CamerDAO (OrthographicCamera camera,float viewW,float viewH,int mapW_px,int mapH_px,float zoomMin,float zoomMax,boolean ifLoop){
this.camera=camera;
vw=viewW;
vh=viewH;
camXMin=viewW/2;
camYMin=viewH/2;
camXMax=mapW_px;
camYMax=mapH_px;
camZoomMax=zoomMax;
camZoomMin=zoomMin;
this.ifLoop=ifLoop;
} public boolean translateCam(float x,float y){
return setPotion(camera.position.x+x,camera.position.y+y);
// camera.translate(x,y,0);
}
//!对x,y进行检查
public boolean setPotion(float x,float y){
boolean state=false;//是否是循环
if(ifLoop) {
if(x>=camXMin*camera.zoom&&x<=(camXMax+camXMin*camera.zoom-vw*camera.zoom)){//原
//Gdx.app.log("setPotion0","x:"+x+" y:"+y+" state:"+state);
}else if(x<camXMin*camera.zoom){//起点向左
state=true;
x=(camXMax+camXMin*camera.zoom-vw*camera.zoom)+camXMin*camera.zoom+x;
//Gdx.app.log("setPotion1","x:"+x+" y:"+y+" state:"+state);
}else if(x>(camXMax+camXMin*camera.zoom-vw*camera.zoom)&&x<(camXMax+camXMin*camera.zoom-vw*camera.zoom)+camXMax){///划入右边,接近循环
state=true;
//Gdx.app.log("setPotion2","x:"+x+" y:"+y+" state:"+state);
}else if(x>=(camXMax+camXMin*camera.zoom-vw*camera.zoom)-camXMax){//划出并还原
state=false;
x=x-(camXMax+camXMin*camera.zoom-vw*camera.zoom)-camXMin*camera.zoom;
//Gdx.app.log("setPotion3","x:"+x+" y:"+y+" state:"+state);
}
}else{
if(x<camXMin*camera.zoom){
x=camXMin*camera.zoom;
}else if(x>(camXMax+camXMin*camera.zoom-vw*camera.zoom)){
x=(camXMax+camXMin*camera.zoom-vw*camera.zoom);
}
}
if(y<camYMin*camera.zoom){
y=camYMin*camera.zoom;
}else if(y>(camYMax+camYMin*camera.zoom-vh*camera.zoom)){
y=(camYMax+camYMin*camera.zoom-vh*camera.zoom);
}
camera.position.x=x;
camera.position.y=y;
//Gdx.app.log("setPotion","x:"+x+" y:"+y+" state:"+state);
return state;
} //中心点缩放 根据鼠标中心点缩放
public boolean setZoomForMouse(float cx,float cy,float zoomV){
camera.zoom +=zoomV;
//Gdx.app.log("Zoom","cx:"+cx+" cy:"+cy+" zoomV:"+zoomV);
return setPotion(camera.position.x+(vw/2-cx)*zoomV,camera.position.y-(vh/2-cy)*zoomV);// -(cy-vh)
} public void setZoom(float v){
camera.zoom +=v;
} public float getCamZoomMax() {
return camZoomMax;
} public void setCamZoomMax(float camZoomMax) {
this.camZoomMax = camZoomMax;
} public float getCamZoomMin() {
return camZoomMin;
} public void setCamZoomMin(float camZoomMin) {
this.camZoomMin = camZoomMin;
} public float getCamXMin() {
return camXMin;
} public void setCamXMin(float camXMin) {
this.camXMin = camXMin;
} public float getCamYMin() {
return camYMin;
} public void setCamYMin(float camYMin) {
this.camYMin = camYMin;
} public float getCamXMax() {
return camXMax;
} public void setCamXMax(float camXMax) {
this.camXMax = camXMax;
} public float getCamYMax() {
return camYMax;
} public void setCamYMax(float camYMax) {
this.camYMax = camYMax;
} public OrthographicCamera getCamera() {
return camera;
} public void setCamera(OrthographicCamera camera) {
this.camera = camera;
}
}
CamerDAO
SMapStage的演员:
1.战斗标记(主要监听它)
package com.zhfy.game.screen.actor.map; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Pool;
import com.zhfy.game.config.ResConfig;
import com.zhfy.game.framework.GameMap;
import com.zhfy.game.model.content.DefDAO;
import com.zhfy.game.model.framework.TextureRegionDAO;
import com.zhfy.game.model.framework.TextureRegionListDAO; import java.util.Map; /**
* 游戏中的演员,适用于;六边形地图内
*
*/
public class MapImageActor extends Actor implements Pool.Poolable { private boolean ifEable;
private TextureRegion region;
private float sourceX;//初始位置
private float sourceY;//初始位置 private float zoom; private int mapW_px;//横向移动需要的值 像素
private int mapH_px;
private int mapW;//格子数,辅助计算坐标
private boolean drawLoop;
private int id; public MapImageActor(TextureRegionDAO regionDAO, int mapW_px,int mapH_px,int mapW,int id) {
ifEable=false;
this.mapW_px=mapW_px;
this.mapH_px=mapH_px;
this.mapW=mapW;
this.region=regionDAO.getTextureRegion();;
this.drawLoop=false;
setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
this.id=id;
initPotionById(regionDAO.getRefx(),regionDAO.getRefy());
ifEable=true;
} public MapImageActor(){} public void init(TextureRegionDAO regionDAO, int mapW_px, int mapH_px,int mapW, int id){
//imgLists.getTextureByName("task_battle")
ifEable=false;
this.mapW_px=mapW_px;
this.mapH_px=mapH_px;
this.mapW=mapW;
this.zoom=1f;
this.region=regionDAO.getTextureRegion();
this.drawLoop=false;
setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
this.id=id;
initPotionById(regionDAO.getRefx(),regionDAO.getRefy());
setWidth(region.getRegionWidth());
setHeight(region.getRegionHeight());
setX(sourceX*zoom+getX());
setY(sourceY*zoom+getY());
//TODO
//this.x=300;
//this.y=300;
ifEable=true;
//Gdx.app.log("imgActor"," x:"+getX()+" y:"+getY());
} //同步坐标
public void syncPotion(boolean drawLoop){
if(ifEable){
//this.x=sourceX*zoom+x;
//this.y=-sourceY*zoom+y;
//this.zoom=zoom;
this.drawLoop=drawLoop;
}else{
Gdx.app.error("MapImageActor initError","id"+id);
} } /*public ImageActor(TextureRegion region) {
this.region = region;
this.drawLoop=false;
this.mapW=0;
setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
} public ImageActor(Texture texture) {
this.region = new TextureRegion(texture);
this.drawLoop=false;
this.mapW=0;
setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
}*/ public TextureRegion getRegion() {
return region;
} public void setRegion(TextureRegion region) {
this.region = region;
if (this.region != null) {
setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
} else {
setSize(0, 0);
}
} @Override
public void draw(Batch batch, float parentAlpha) {
super.draw(batch, parentAlpha);
if (region == null || !isVisible()||!isIfEable()) {
return;
} // 备份 batch 原本的 Color
// Color tempBatchColor = batch.getColor(); // 获取演员的 Color
//Color color = getColor(); // 将演员的 Color 结合 parentAlpha 设置到 batch
//batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); // 结合演员的属性绘制表示演员的纹理区域
batch.draw(
region,
getX(), getY(),
getOriginX(), getOriginY(),
getWidth()*zoom, getHeight()*zoom,
getScaleX(), getScaleY(),
getRotation()
);
if(drawLoop){//如果循环,则添加一部分
batch.draw(
region,
getX()+getMapW_px(), getY(),
getOriginX(), getOriginY(),
getWidth()*zoom, getHeight()*zoom,
getScaleX(), getScaleY(),
getRotation()
);
} // 还原 batch 原本的 Color
// batch.setColor(tempBatchColor);
} public float getZoom() {
return zoom;
} public void setZoom(float zoom) {
this.zoom = zoom;
} public int getMapW_px() {
return mapW_px;
} public void setMapW_px(int mapW_px) {
this.mapW_px = mapW_px;
} public boolean isDrawLoop() {
return drawLoop;
} public void setDrawLoop(boolean drawLoop) {
this.drawLoop = drawLoop;
} public boolean isIfEable() {
return ifEable;
} public void setIfEable(boolean ifEable) {
this.ifEable = ifEable;
} public int getMapW() {
return mapW;
} public void setMapW(int mapW) {
this.mapW = mapW;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} @Override
public void reset() {
ifEable=false;
} private void initPotionById(float refx,float refy){
Map<String,Integer> rs= GameMap.getDownleftPotionById(mapW,mapH_px, ResConfig.Map.SMALLMAP_SCALE,id);
this.sourceX=rs.get("sourceX")-refx;
this.sourceY=rs.get("sourceY")-refy;
//Gdx.app.log("initPotionById","id:"+id+" sourceX:"+sourceX+" sourceY:"+sourceY);
} }
MapImageActor
2.小地图
package com.zhfy.game.screen.actor; import java.util.List;
import java.util.Map; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.PixmapIO;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.zhfy.game.MainGame;
import com.zhfy.game.config.ResConfig;
import com.zhfy.game.framework.ComUtil;
import com.zhfy.game.framework.GameFramework;
import com.zhfy.game.framework.GameMap;
import com.zhfy.game.framework.GameUtil;
import com.zhfy.game.model.content.MapBinDAO;
import com.zhfy.game.model.content.SMapDAO;
import com.zhfy.game.model.framework.Coord;
import com.zhfy.game.model.framework.SpriteDAO;
import com.zhfy.game.model.framework.SpriteListDAO;
import com.zhfy.game.model.framework.TextureRegionListDAO; public class SMapActor extends Actor {
//加载history来生成剧本 // 本类用来存放背景地图,获取地图范围,移动,缩放背景地图,确定点击位置等,以及环状地图
//private DefMap defMap;
private Pixmap pixmap;// 临时画布
//private MapBinDAO mapBinDAO; private Texture textureMain;// 主图
private Texture textureCountry;
private Pixmap pixmapCountry; private Sprite spriteMain;// 主图
private Sprite spriteCountry; private int w;
private int h; private int mapId;
private float x;
private float y;
private float zoom;
private int mapW_px;
private int mapH_px;
private boolean drawLoop; private float vx;
private float vy; private AssetManager am;
private int screenId;
private boolean ifNeedUnload;//是否需要卸载,在资源加载完后卸载,如果未加载完退出,在退出时顺带清理资源 private int mapTimeMax; public float getVx() {
return vx;
} public void setVx(float vx) {
this.vx = vx;
} public float getVy() {
return vy;
} public void setVy(float vy) {
this.vy = vy;
} //private DrawListDAO drawBattleList;
//private DrawDAO drawBattle;
private int drawX,drawY;
private int drawI;
// 颜色层
//private Texture textureGrid;
private SpriteDAO spriteGrid;
private SpriteListDAO spriteGrids;
private int gw;
private int gh;
//private TextureRegionDAO battleTaskTR; public SMapActor(MainGame game, int screenId, Map regionColors) {
super();
this.am=game.getAssetManager();
ifNeedUnload=false;
this.screenId=screenId; this.x=0;
this.y=0;
this.zoom=1f;
drawLoop=false;
{
// 绘制主要图
textureMain= (GameMap.drawSmallMapAndClearPixmap2(game.getStageId(),am));
spriteMain= new Sprite(textureMain);
}
this.mapW_px = textureMain.getWidth();
this.mapH_px = textureMain.getHeight();
this.w = game.getMapBinDao().getMapWidth();
this.h = game.getMapBinDao().getMapHeight(); /*if(!ifInit)*/{//绘制一个区域图
// 绘制画布转为装饰
long startTime = System.currentTimeMillis();
pixmapCountry = GameMap.createPixmap((int)(w*ResConfig.Map.SMALLMAP_SCALE),(int)(h*ResConfig.Map.SMALLMAP_SCALE)); GameMap.getPixmapByHistoryForLegionColor(game.getMapBinDao(),pixmapCountry,ResConfig.Map.SMALLMAP_SCALE,game.getMapBinDao().getCoastGrid(), ResConfig.Config.COUNTRY_COLORS,regionColors); //PixmapIO.writePNG(Gdx.files.external("textureColor.png"), pixmapCountry);
textureCountry=new Texture(pixmapCountry);
long endTime = System.currentTimeMillis(); //获取结束时间
//Gdx.app.log("色图构建", " 运行时间:"+(endTime - startTime) + "ms");
spriteCountry= new Sprite(textureCountry);
spriteCountry.setSize(textureMain.getWidth(),textureMain.getHeight());
//PixmapIO.writePNG(Gdx.files.local("sav/"+sMapName+".png"), pixmapCountry);
}/*else{
textureCountry=new Texture(Gdx.files.local("sav/"+sMapName+".png"));
spriteCountry= new Sprite(textureCountry);
spriteCountry.setSize(textureMain.getWidth(),textureMain.getHeight());
}*/ //pixmapCountry=GameMap.updateColorByRegion(mapBinDAO,pixmapCountry, ResConfig.Map.SMALLMAP_SCALE,sMapDAO.getBattleRegions(),coastGrid,legionColors,sMapDAO.getRegionColors());
//textureCountry.draw(pixmapCountry,0,0); /*{
// 绘制画布转为装饰
pixmap = GameMap.createPixmap((int)(w*ResConfig.Map.SMALLMAP_SCALE),(int)(h*ResConfig.Map.SMALLMAP_SCALE));
pixmap=GameMap.coverImgByPtimgId(pixmap, 2);
gameFramework.getPixmapDecorateByDao(pixmap, mapBinDAO,am,ResConfig.Map.SMALLMAP_SCALE);
PixmapIO.writePNG(Gdx.files.external("textureDecorate.png"), pixmap);
pixmap.dispose();
}*/ setSize(spriteMain.getWidth(), spriteMain.getHeight());
/**/
/*addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) { //随机绘图
pixmapCountry=GameMap.updateColorByRegion(mapBinDAO,pixmapCountry, ResConfig.Map.SMALLMAP_SCALE, ComUtil.getNByListRand(regionGrid,3),coastGrid,legionColors,sMapDAO.getRegionColors());
textureCountry.draw(pixmapCountry,0,0); }
});*/
//battleTaskTR=imgLists.getTextureByName("task_battle");
//drawBattleList=new DrawListDAO();
//createBattle();
} @Override
public void act(float delta) {
super.act(delta);
} @Override
public void draw(Batch batch, float parentAlpha) {
super.draw(batch, parentAlpha);
if (spriteMain == null || !isVisible()) {
return;
} {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.draw(spriteMain, getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(),
getZoom(), getZoom(), getRotation());
batch.draw(spriteCountry, getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(),
getZoom(), getZoom(), getRotation()); if(drawLoop){
//Color oldColor=batch.getColor();
//batch.setColor(Color.RED);
batch.draw(spriteMain, getX()+mapW_px*this.zoom, getY(), getOriginX(), getOriginY(), getWidth(), getHeight(),
getZoom(), getZoom(), getRotation());
batch.draw(spriteCountry, getX()+mapW_px*this.zoom, getY(), getOriginX(), getOriginY(), getWidth(), getHeight(),
getZoom(), getZoom(), getRotation());
//batch.setColor(oldColor);
} } } @Override
public float getX() {
return x;
} @Override
public void setX(float x) {
this.x = x;
} @Override
public float getY() {
return y;
} @Override
public void setY(float y) {
this.y = y;
} public float getZoom() {
return zoom;
} public void setZoom(float zoom) {
this.zoom = zoom;
} public int getW() {
return w;
} public void setW(int w) {
this.w = w;
} public int getH() {
return h;
} public void setH(int h) {
this.h = h;
} // 将↓→坐标(左上角为0,0,越向右下越大)转为←↓act坐标(左下角为0,0,越向右上越小)
public float getActXCoordByImgX(float print_x) {
return (-print_x);
} public float getActYCoordByImgY(float print_y) {
return (print_y - spriteMain.getHeight());
} // 将←↓act坐标(左下角为0,0,越向右上越小)转化为↓→坐标(左上角为0,0,越向右下越大)
// 将↓→坐标(左上角为0,0,越向右下越大)转为←↓act坐标(左下角为0,0,越向右上越小)
public float getImgXCoordByActX(float print_x) {
if(print_x!=0f) {
return (-print_x);
}else {
return 0f;
}
} public float getImgYCoordByActY(float print_y) {
return (spriteMain.getHeight() + print_y);
} // 清理5张图层
public void dispose() {
if(pixmapCountry!=null){
pixmapCountry.dispose();
pixmapCountry=null;
}
if (textureMain != null) {
textureMain.dispose();
textureMain=null;
}
if (textureCountry!=null){
textureCountry.dispose();
textureCountry=null;
}
if (ifNeedUnload) {
GameUtil.unloadSingleResByScreenId(am, screenId);
} } public Pixmap getPixmap() {
return pixmap;
} public void setPixmap(Pixmap pixmap) {
this.pixmap = pixmap;
} public Texture gettextureMain() {
return textureMain;
} public void settextureMain(Texture textureMain) {
this.textureMain = textureMain;
} public Sprite getspriteMain() {
return spriteMain;
} public void setspriteMain(Sprite spriteMain) {
this.spriteMain = spriteMain;
} public SpriteDAO getSpriteGrid() {
return spriteGrid;
} public void setSpriteGrid(SpriteDAO spriteGrid) {
this.spriteGrid = spriteGrid;
} public int getGw() {
return gw;
} public void setGw(int gw) {
this.gw = gw;
} public int getGh() {
return gh;
} public void setGh(int gh) {
this.gh = gh;
} public SpriteListDAO getSpriteGrids() {
return spriteGrids;
} public void setSpriteGrids(SpriteListDAO spriteGrids) {
this.spriteGrids = spriteGrids;
} /*public void createBattle(){
drawBattleList.clear();
for(int i: sMapDAO.getBattleRegions()){
drawBattle=new DrawDAO();
drawBattle.setTextureName("task_battle");
GameMap.getCenterPotionById(mapBinDAO,drawX,drawY,ResConfig.Map.SMALLMAP_SCALE,mapBinDAO.getIdByRegionId(i)); drawBattle.setLx_px(drawX);
drawBattle.setLx_px(drawY);
drawBattleList.add(drawBattle);
}
}*/ public boolean isDrawLoop() {
return drawLoop;
} public void syncPotion(float x, float y, float zoom,boolean drawLoop){
this.x=x;
this.y=y;
this.zoom=zoom;
this.drawLoop=drawLoop;
} public int getMapW_px() {
return mapW_px;
} public int getMapH_px() {
return mapH_px;
} public void setDrawLoop(boolean drawLoop) {
this.drawLoop = drawLoop;
}
}
SMapActor
20.libgdx,stage中默认相机的使用的更多相关文章
- WebView中打开相机,文件选择器的问题和解决方法
近几年前端开发真是越来越火,H5页面开发的移动端页面甚至有夺我原生开发半壁江山的意思,忧伤忧伤.不过从实际情况考虑,H5一套代码到处跑的特性,我们的Android, IOS ...也就只能呵呵了.然而 ...
- 有关默认相机转VR相机
呃...15年开篇~ 去年想写一个有关默认相机转VR相机的脚本,当时没写完,今天不小心翻到并写完了,而且思路也和原来完全不一样了,增加了是否删除原相机与是否转换所选相机的选项. 由于国内VR版本比较混 ...
- .NET平台开源项目速览(20)Newlife.Core中简单灵活的配置文件
记得5年前开始拼命翻读X组件的源码,特别是XCode,但对Newlife.Core 的东西了解很少,最多只是会用用,而且用到的只是九牛一毛.里面好用的东西太多了. 最近一年时间,零零散散又学了很多,也 ...
- 解决select2在bootstrap的modal中默认不显示的问题
在Bootstrap中的Modal,select2插件会有不显示,因为其z-index小于modal,还有另外一个问题是,修正z-index之后,select2不会自动失去焦点的问题.代码解决如下: ...
- 解决Safari高版本浏览器中默认禁用第三方COOKIE(含demo)
前段时间在项目里遇到了一个比较头疼的问题,就是高版本的Safari中默认会阻止第三方cookie,这使得使用Safari浏览器的用户无法按照正常的业务逻辑进行操作. 问题展现 知识点 什么是第三方co ...
- Android系统中默认值的意义列表
转自:http://blog.csdn.net/yabg_zhi_xiang/article/details/51727844 在SettingsProvider中设置系统中默认值,我们可以在fram ...
- 设置sublime text2/3中默认预览浏览器快捷键的方法
各位前端大神们,大家在用IDE编辑器的时候喜欢用哪些呢?是Dreamweaver.Zend Studio.editplus又或者是sublime text?今天马浩周给大家就要说说设置sublime ...
- iOS中默认样式修改-b
项目中有大量的UITableView都需要显示sectionHeader.iOS中默认sessionHeader上的textLabel样式跟设计图不符. 按照我们之前的解决方案,是在每个UITable ...
- QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)
因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windo ...
随机推荐
- Shell脚本编程中截取字符串方法
例如: 假设变量var=http://www.baidu.com/111.png 1.#号截取(删左留右) echo ${var#*//} # 号是运算符,*// 表示从左边开始删除第一个 // 号及 ...
- 微信网页授权demo2
1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名.请注意,这里填写的是 ...
- Highcharts 饼图数值显示在图形上
1.引用js文件 <script type="text/javascript" src="http://cdn.hcharts.cn/jquery/jquery-1 ...
- fill memset, for小测试
/*很无聊写着玩玩,后来发现memset效率会比fill高出这么多,可惜一般只用来赋值0,-1......以后可以用fill来偷偷懒了...*/ #include<iostream> #i ...
- phpstudy安装好之后mysql无法启动(亲测可行)
安装好phpstudy后,Apache可以启动,Mysql无法启动. 尝试解决办法:可能是之前已经装过Mysql,要把系统服务里面的MySQL删除,留下MySQLa服务. 在cmd命令行下输入:sc ...
- jeecms内容管理系统使用了哪些技术
jeeecms作为国内Java开源内容管理系统的龙头老大(感谢jeecms研发小组的辛苦劳作),技术架构也是比较成熟的,当然涉及到的技术也就相对多一些 看看jeecms内容管理系统使用了哪些技术 we ...
- jnhs-springmvc 请求组合不正确,比如请求路径出现两次
初学springmvc 向后台传参数,结果发现,一直404 404后没有路径,说明 没有进入controller 仔细一看,请求路径不对,重复出现 页面是这样写的 页面是这样写的 原因是,请求链接和当 ...
- GIT → 09:TortoiseGit 图形化工具
GIT → 09:TortoiseGit 图形化工具
- linux基础指令参数
eth0,eth1,eth2--代表网卡一,网卡二,网卡三-- lo代表127.0.0.1,即localhost 参考: Linux命令:ifconfig 功能说明:显示或设置网络设备 语 法:ifc ...
- SQL Server导入数据报错"无法在只读列“Id”中插入数据"
使用sql server 导入数据报错:无法在只读列'id'中插入数据.如下图所示: 查找出现该问题的原因是表中id为自动增长的标识列,需要在[编辑映射]中勾选"启用标识插入": ...