我在 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 中的第二个场景, 因此,当我导航回第一个 Activity 时,第一个场景由于移动了相机而错位了。
回到第一个场景时,有没有办法重置相机?
我尝试了 Camer.reset() 无济于事。
有什么建议吗?
最佳答案
使用 mCamera.setCenter(CAMERA_WIDTH/2, CAMERA_HEIGHT/2);
。它将重置相机位置。
顺便说一句,我看到你不断根据相机位置更改菜单箭头。你知道,AndEngine 有一个类来处理这种情况 :) 你没有理由手动做......
它叫做 HUD
,意思是 Head-Up Display .您可以扩展 HUD class , 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);
在任何情况下你想使用超过 1 个 HUD,你设置 1 作为一个 HUD 然后让下一个成为第一个的子场景。例如,如果我有另一个名为 DisplayStats
的 HUD,并且我是这样创建的:
final DisplayStats displayStats = new DisplayStats(...);
然后,将其设置为攻击控件的子场景即可。记住 - HUD 就是场景!所有场景操作在这里都是合法的。
attackControl.setChildScene(displayStats);
现在,下一个 HUD 可能是 displayStats
的子场景……等等。
关于android - AndEngine相机偏移和2个场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783729/