主要思路:

通过查资料得知,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中默认相机的使用的更多相关文章

  1. WebView中打开相机,文件选择器的问题和解决方法

    近几年前端开发真是越来越火,H5页面开发的移动端页面甚至有夺我原生开发半壁江山的意思,忧伤忧伤.不过从实际情况考虑,H5一套代码到处跑的特性,我们的Android, IOS ...也就只能呵呵了.然而 ...

  2. 有关默认相机转VR相机

    呃...15年开篇~ 去年想写一个有关默认相机转VR相机的脚本,当时没写完,今天不小心翻到并写完了,而且思路也和原来完全不一样了,增加了是否删除原相机与是否转换所选相机的选项. 由于国内VR版本比较混 ...

  3. .NET平台开源项目速览(20)Newlife.Core中简单灵活的配置文件

    记得5年前开始拼命翻读X组件的源码,特别是XCode,但对Newlife.Core 的东西了解很少,最多只是会用用,而且用到的只是九牛一毛.里面好用的东西太多了. 最近一年时间,零零散散又学了很多,也 ...

  4. 解决select2在bootstrap的modal中默认不显示的问题

    在Bootstrap中的Modal,select2插件会有不显示,因为其z-index小于modal,还有另外一个问题是,修正z-index之后,select2不会自动失去焦点的问题.代码解决如下: ...

  5. 解决Safari高版本浏览器中默认禁用第三方COOKIE(含demo)

    前段时间在项目里遇到了一个比较头疼的问题,就是高版本的Safari中默认会阻止第三方cookie,这使得使用Safari浏览器的用户无法按照正常的业务逻辑进行操作. 问题展现 知识点 什么是第三方co ...

  6. Android系统中默认值的意义列表

    转自:http://blog.csdn.net/yabg_zhi_xiang/article/details/51727844 在SettingsProvider中设置系统中默认值,我们可以在fram ...

  7. 设置sublime text2/3中默认预览浏览器快捷键的方法

    各位前端大神们,大家在用IDE编辑器的时候喜欢用哪些呢?是Dreamweaver.Zend Studio.editplus又或者是sublime text?今天马浩周给大家就要说说设置sublime ...

  8. iOS中默认样式修改-b

    项目中有大量的UITableView都需要显示sectionHeader.iOS中默认sessionHeader上的textLabel样式跟设计图不符. 按照我们之前的解决方案,是在每个UITable ...

  9. QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)

    因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windo ...

随机推荐

  1. 解决import javafx.geometry.Point2D无法导入的问题

    windows->preferences->java->compiler->errors/warning->deprecated and restricted API-& ...

  2. ThinkPHP实现导出Excel表格

    /** * 导出数据为excel表格 *@param $data 一个二维数组,结构如同从数据库查出来的数组 *@param $title excel的第一行标题,一个数组,如果为空则没有标题 *@p ...

  3. 关于 matplotlib

    注意,需要 zlib, 需要 Tkinter pip install matplotlib import numpy as np import matplotlib.pyplot as plt plt ...

  4. HDU4578 Transformation (多操作线段树)

    传送门 终于过了这道题.. 要注意标记之间的影响,和add操作时更新求和的顺序. same 区间每个数设置为x标记 mult  区间每个数乘x标记 add  区间每个数加x标记 ①:当打same标记时 ...

  5. 【solr】Solr5.5.4+Zookeeper3.4.6+Tomcat8搭建SolrCloud集群

    Solr5.5.4+Zookeeper3.4.6+Tomcat8搭建SolrCloud集群 SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力 ...

  6. Django ORM中的查询,删除,更新操作

    ORM查询操作 修改views.py文件 from django.shortcuts import render, HttpResponse from app01 import models from ...

  7. 下载android4.4.2源代码全过程(附已下载的源代码)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/maosidiaoxian/article/details/36625727 今天在下载andriod ...

  8. 有趣的HTML5 Web SQL 数据库

    Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 核心方法 以下是规范中定义的三个核心方法: openD ...

  9. BootStrap 栅格化换行问题

    bootstrap 3的栅格系统有时会出现错位情况,原因是上一行的元素高度不一,导致元素float错误. 解决方法 使用栅格系统的时候,应该在每一行都使用row单独包裹起来,不要直接在一行中连续加入c ...

  10. golang学习资料必备

    核心资料库 https://github.com/yangwenmai/learning-golang