Android AndEngine相机偏移和2个场景
我在Andengine中使用此方法,通过设置相机的偏移量,在项目列表中滚动Android AndEngine相机偏移和2个场景,android,andengine,Android,Andengine,我在Andengine中使用此方法,通过设置相机的偏移量,在项目列表中滚动 @Override public void onScroll(ScrollDetector pScollDetector, int pPointerID, float pDistanceX, float pDistanceY) { //Disable the menu arrows left and right (15px padding)
@Override
public void onScroll(ScrollDetector pScollDetector, int pPointerID,
float pDistanceX, float pDistanceY) {
//Disable the menu arrows left and right (15px padding)
if(mCamera.getXMin()<=15)
menuleft.setVisible(false);
else
menuleft.setVisible(true);
if(mCamera.getXMin()>mMaxX-15)
menuright.setVisible(false);
else
menuright.setVisible(true);
//Return if ends are reached
if ( ((mCurrentX - pDistanceX) < mMinX) ){
return;
}else if((mCurrentX - pDistanceX) > mMaxX){
return;
}
//Center camera to the current point
this.mCamera.offsetCenter(-pDistanceX,0 );
mCurrentX -= pDistanceX;
//Set the scrollbar with the camera
float tempX =mCamera.getCenterX()-CAMERA_WIDTH/2;
// add the % part to the position
tempX+= (tempX/(mMaxX+CAMERA_WIDTH))*CAMERA_WIDTH;
//set the position
//scrollBar.setPosition(tempX, scrollBar.getY());
//set the arrows for left and right
menuright.setPosition(mCamera.getCenterX()+CAMERA_WIDTH/2-menuright.getWidth(),menuright.getY());
menuleft.setPosition(mCamera.getCenterX()-CAMERA_WIDTH/2,menuleft.getY());
//Because Camera can have negativ X values, so set to 0
if(this.mCamera.getXMin()<0){
this.mCamera.offsetCenter(0,0);
mCurrentX=0;
}
}
@覆盖
公共无效onScroll(滚动检测器pScollDetector、int pPointerID、,
浮动pDistanceX,浮动pDistanceY){
//禁用左右菜单箭头(15px填充)
if(mCamera.getXMin()mMaxX-15)
menuright.setVisible(false);
其他的
menuright.setVisible(true);
//到达终点时返回
如果((mCurrentX-pDistanceX)mMaxX,则为其他情况{
返回;
}
//将摄影机居中到当前点
this.mCamera.offsetCenter(-pDistanceX,0);
mCurrentX-=pDistanceX;
//使用相机设置滚动条
float tempX=mCamera.getCenterX()-摄像头宽度/2;
//将%零件添加到该位置
tempX+=(tempX/(mMaxX+摄像头宽度))*摄像头宽度;
//定位
//设置位置(tempX,scrollBar.getY());
//设置左右箭头
menuright.setPosition(mCamera.getCenterX()+摄像头宽度/2-menuright.getWidth(),menuright.getY());
menuleft.setPosition(mCamera.getCenterX()-CAMERA_WIDTH/2,menuleft.getY());
//因为相机可以有负X值,所以设置为0
如果(this.mCamera.getXMin()使用mCamera.setCenter(摄像头宽度/2,摄像头高度/2);
,它将重置摄像头位置
顺便说一句,我看到你一直在根据摄像机的位置改变菜单箭头。你知道,AndEngine有一个类来处理这种情况:)你没有理由手动操作。。。
它被称为HUD
,这意味着。你可以扩展,HUD只是一个场景,它被放置在屏幕上的一个固定位置。你可以向它添加任意多的实体。然后,只需调用mCamera.setHUD(这里是你的HUD对象);
,你就完成了,不需要在摄像机上移动实体
我看到的另一个问题是,您调用mCamera.offsetCenter(0,0);
offsetCenter
只是将参数添加到当前的中心坐标。添加0
完全没有影响,因此此调用是无用的。您试图实现什么?将相机重置回(0,0)
编辑:
下面是我自己游戏中的HUD示例:
public class AttackControl extends HUD {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private Sprite mSprite;
private IAttackControlClickListener mListener;
// ===========================================================
// Constructors
// ===========================================================
public AttackControl(final float pX, final float pY, final Camera pCamera, final TextureRegion pTextureRegion, final IAttackControlClickListener pListener) {
super.setCamera(pCamera);
this.mListener = pListener;
this.mSprite = new Sprite(pX, pY, pTextureRegion) {
@Override
public boolean onAreaTouched(final TouchEvent pTouchEvent, final float pX, final float pY) {
AttackControl.this.mListener.onClick();
return true;
}
};
super.attachChild(this.mSprite);
super.registerTouchArea(this.mSprite);
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
public interface IAttackControlClickListener {
public void onClick();
}
}
然后创建此类的实例:
final AttackControl attackControl = new AttackControl(...);
并将其设置为相机的HUD:
mCamera.setHUD(attackControl);
在任何情况下,如果要使用多个HUD,请将1设置为HUD,然后使下一个HUD成为第一个HUD的子场景。例如,如果我有另一个名为DisplayStats
的HUD,并且我是这样创建的:
final DisplayStats displayStats = new DisplayStats(...);
然后,只需将其设置为攻击控制的子场景。记住-HUD就是场景!这里所有的场景操作都是合法的
attackControl.setChildScene(displayStats);
现在,下一个HUD可能是displayStats
…等的子场景。如果将来有人发现这一点,而其他答案还不够,试试这个
mCamera.setZoomFactor(1.0f);
如果您使用的是ZoomCamera
,则这是必需的。我正在执行此操作,因此如果我“挤压以缩放”然后切换场景,因为我的缩放因子被调整了,所以一切都乱七八糟。再次感谢jong。我正在使用从这里得到的一个示例,以及HUD的代码外观。这是我第一次使用itI。稍后我会给你一个示例,我现在必须开始。关于相机,请尝试mCamera.setCenter(camera\u WIDTH/2,camera\u HEIGHT/2)
如果这不起作用,请在离开第一个场景时保存相机位置,以便以后可以切换回它。mCamera.setCenter(camera_WIDTH/2,camera_HEIGHT/2);工作起来像charmGreat:)你还想要一个HUD示例吗?是的。那太好了!为什么要否决?这是完全必要的,对我来说是有效的。