我在Andengine中使用此方法通过设置相机的偏移来滚动项目列表。
@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;
}
}
问题是我用它作为我在Activity中的第二个场景, 因此,当我导航回第一个活动时,由于相机被移动,第一个场景位置不正确。
在回到第一个场景时,我是否可以重置相机?
我试过Camer.reset()无济于事。
有什么建议吗?
答案 0 :(得分:8)
使用mCamera.setCenter(CAMERA_WIDTH / 2, CAMERA_HEIGHT / 2);
。它将重置相机位置。
顺便说一下,我看到你根据相机位置不断更改菜单箭头。你知道,AndEngine有一个类来处理这种情况:)你没有理由手动做...
它被称为HUD
,意思是Head-Up Display。您可以扩展HUD class,HUD只是一个放置在屏幕上恒定位置的场景。您可以根据需要添加任意数量的实体。然后,只需致电mCamera.setHUD(Your HUD object here);
即可完成,无需在相机上移动实体。
我看到的另一个问题是,您致电mCamera.offsetCenter(0, 0);
。 offsetCenter
只是将参数添加到当前中心坐标。添加0
根本没有 no 影响,因此此调用无效。你想要实现什么目标?将相机重置为(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);
在任何情况下,你想要使用超过1个HUD,你将1设置为HUD,然后使下一个成为第一个孩子的场景。例如,如果我有另一个名为DisplayStats
的HUD,我就是这样创建的:
final DisplayStats displayStats = new DisplayStats(...);
然后,将其设置为攻击控制的子场景。记住 - HUD就是场景!所有场景操作都是合法的。
attackControl.setChildScene(displayStats);
现在,下一个HUD可能是displayStats
的子场景......等等。
答案 1 :(得分:0)
如果有人在将来发现这个并且其他答案不够,请尝试这个。
mCamera.setZoomFactor(1.0f);
如果您使用ZoomCamera
,则必须这样做。我正在做这个,所以如果我“捏缩放”然后切换场景,那一切都搞砸了,因为我的缩放系数正在调整。