レベルセレクターに問題があります。このフォーラムのチュートリアルで見つけたコードを使用していますが、正しく動作していません。
実際には、ユーザーが再生をマッシュするときに使用している 2 つのシーンがあり、エンジンを 2 番目のシーンに設定すると、ユーザーはレベルをスクロールできます。
次に、ユーザーが戻るボタンを押すと、離れる前に位置を保存してカメラを初期位置に戻し、camer.setCenter(x,y); を使用して元に戻します。
ユーザーがレベルセレクターシーンに戻ると、正しく心配しません。ユーザーがスクロールすると、画面からスクロールし、正常に動作しません。
これが私のコードです。誰かがより良い方法を持っている場合は、お気軽に私と共有してください.
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
// TODO Auto-generated method stub
clickDetector.onTouchEvent(pSceneTouchEvent);
surfaceScrollDetector.onTouchEvent(pSceneTouchEvent);
return true;
}
@Override
public void onScrollStarted(ScrollDetector pScollDetector,
int pPointerID, float pDistanceX, float pDistanceY) {
// TODO Auto-generated method stub
distanceX = 0;
}
@Override
public void onScroll(ScrollDetector pScollDetector, int pPointerID,
float pDistanceX, float pDistanceY) {
// TODO Auto-generated method stub
camera.offsetCenter(-pDistanceX, 0);
distanceX += pDistanceX;
}
@Override
public void onScrollFinished(ScrollDetector pScollDetector,
int pPointerID, float pDistanceX, float pDistanceY) {
if ((distanceX > TURN_PAGE_DISTANCE) && (page > 0))
{
page--;
camera.offsetCenter(distanceX - CAMERA_WIDTH, 0);
}
else if ((distanceX < -TURN_PAGE_DISTANCE) && (page < LEVEL_PAGES - 1))
{
page++;
camera.offsetCenter(distanceX + CAMERA_WIDTH, 0);
}
else
{
camera.offsetCenter(distanceX, 0);
}
}
@Override
public void onClick(ClickDetector pClickDetector, int pPointerID,
float pSceneX, float pSceneY) {
//loadLeve(levelClicked);
}
private void createHUD()
{
// 不用考虑层
hud = new HUD();
Rectangle hudBox = new Rectangle(20, 700, 80, 80, getVertexBufferObjectManager())
{
@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX,
float pTouchAreaLocalY)
{
// TODO Auto-generated method stub
if (pSceneTouchEvent.isActionUp())
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
// TODO Auto-generated method stub
Toast.makeText(Menu.this, "BACK", Toast.LENGTH_SHORT).show();
}
});
}
return true;
}
};
hudBox.setColor(Color.RED);
hud.attachChild(hudBox);
hud.registerTouchArea(hudBox);
camera.setHUD(hud);
}
@Override
public boolean onKeyDown(final int pKeyCode, final KeyEvent pEvent) {
if (pKeyCode == KeyEvent.KEYCODE_BACK
&& pEvent.getAction() == KeyEvent.ACTION_DOWN
) {
if(level_scene){
level_scene = false;
camera.setCenter(camera_x, camera_y);
mEngine.setScene(MainMenuScene);
}else{
finish();
}
return true;
}
return super.onKeyDown(pKeyCode, pEvent);
}
private void createLevelBoxes()
{
// 计算行间距
int spaceBetweenRaws = (CAMERA_HEIGHT / LEVEL_ROWS_PER_SCREEN) - LEVEL_PADDING;
// 计算列间距
int spaceBetweenColumns = (CAMERA_WIDTH / LEVEL_COLUMNS_PER_SCREEN) - LEVEL_PADDING;
int level = 0;
int boxX = LEVEL_PADDING;
int boxY = LEVEL_PADDING;
for (int i=0; i<LEVEL_PAGES; i++)
{
int startX = i * CAMERA_WIDTH;
for (int j=0; j<LEVEL_ROWS_PER_SCREEN; j++)
{
for (int k=0; k<LEVEL_COLUMNS_PER_SCREEN; k++)
{
final int levelToLoad = level;
box = new Sprite(startX + boxX, boxY, 90,70,this.levelIcon,this.getVertexBufferObjectManager())
{
@Override
public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX,
float pTouchAreaLocalY)
{
// TODO Auto-generated method stub
levelClicked = levelToLoad;
if(levelClicked <= maxLevelReached){
Intent intent = new Intent(Menu.this, GameLevel.class);
intent.putExtra("level", levelClicked);
startActivity(intent);
woodClick.play();
}
return false;
}
};
if (level <= maxLevelReached)
{
}
else
{
box.setColor(0.4117647f, 0.4117647f,0.4117647f);
}
levelScene.attachChild(box);
levelScene.registerTouchArea(box);
int textOffX = 0;
if (level < 10)
{
textOffX = 28;
}
else
{
textOffX = 20;
}
box.attachChild(new Text(textOffX, 20, font, String.valueOf(level + 1),this.getVertexBufferObjectManager()));
level++;
boxX += spaceBetweenColumns + LEVEL_PADDING;
if (level > LEVELS)
{
break;
}
}
if (level > LEVELS)
{
break;
}
boxY += spaceBetweenRaws + LEVEL_PADDING;
boxX = LEVEL_PADDING;
}
boxY = LEVEL_PADDING;
}
}