"Beginning Android Games"라는 책에 실린 코드를 읽었지만 완전히 이해하지 못합니다. 응용 프로그램의 진입 점은 다음과 같습니다서브 클래스의 메소드를 호출하는 추상 클래스. 어떻게 작동합니까?
public class MrNomGame extends AndroidGame {
public Screen getStartScreen() {
return new LoadingScreen(this);
}
}
클래스 여기에 확장되어 'AndroidGame'
public abstract class AndroidGame extends Activity implements Game {
AndroidFastRenderView renderView;
Graphics graphics;
Audio audio;
Input input;
FileIO fileIO;
Screen screen;
WakeLock wakeLock;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
int frameBufferWidth = isLandscape ? 480 : 320;
int frameBufferHeight = isLandscape ? 320 : 480;
Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth,
frameBufferHeight, Config.RGB_565);
float scaleX = (float) frameBufferWidth
/getWindowManager().getDefaultDisplay().getWidth();
float scaleY = (float) frameBufferHeight
/getWindowManager().getDefaultDisplay().getHeight();
renderView = new AndroidFastRenderView(this, frameBuffer);
graphics = new AndroidGraphics(getAssets(), frameBuffer);
fileIO = new AndroidFileIO(this);
audio = new AndroidAudio(this);
input = new AndroidInput(this, renderView, scaleX, scaleY);
screen = getStartScreen();
setContentView(renderView);
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");
}
@Override
public void onResume() {
super.onResume();
wakeLock.acquire();
screen.resume();
renderView.resume();
}
@Override
public void onPause() {
super.onPause();
wakeLock.release();
renderView.pause();
screen.pause();
if (isFinishing())
screen.dispose();
}
public Input getInput() {
return input;
}
public FileIO getFileIO() {
return fileIO;
}
public Graphics getGraphics() {
return graphics;
}
public Audio getAudio() {
return audio;
}
public void setScreen(Screen screen) {
if (screen == null)
throw new IllegalArgumentException("Screen must not be null");
this.screen.pause();
this.screen.dispose();
screen.resume();
screen.update(0);
this.screen = screen;
}
public Screen getCurrentScreen() {
return screen;
}
}
당신은 그 자체로 클래스 확장 '활동'을 참조하십시오. 즉, 휴대 전화에서 앱을 열면 앱이 연결됩니다. onCreate 메서드에는 'getStartScreen()'이라는 메서드가 있습니다. 그것은 구현 된 inferface 'Game'의 한 방법입니다. 그러나 'getStartScreen()'메서드는 'AndroidGame'에 구현되어 있지 않으므로 추상 클래스입니다. 'getStartScreen()'메서드는 'MrNomGame'에 구현되어 있습니다. 앞서 언급했듯이 onCreate 메소드에서 'getStartScreen()'메서드가 호출되었습니다. 그것은 나를 혼란스럽게하는 요점이다. 수퍼 클래스는 서브 클래스에서 메소드를 호출합니다. 어떻게 작동합니까? 그리고 'AndroidGame'을 확장하는 두 개의 하위 클래스가 있다면 어떻게됩니까? 예 :
public class MrNomGame2 extends AndroidGame {
public Screen getStartScreen() {
return new LoadingScreen(this);
}
}
'getStartScreen()'메소드가 호출됩니다. MrNomGame 또는 Mr.NomGame2에서 나온 것?
적어도 게임 인터페이스 :
public interface Game {
public Input getInput();
public FileIO getFileIO();
public Graphics getGraphics();
public Audio getAudio();
public void setScreen(Screen screen);
public Screen getCurrentScreen();
public Screen getStartScreen();
}
나는 그 많은 코드 알고있다. 네가 나를 도울 수 있기를 바랍니다. 고맙습니다.
피터
매니페스트도 표시 할 수 있습니까? – gunar
이것은 Android와 관련이 없습니다. http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html을 참조하십시오. –
코드에 주석을 어떻게 삽입 할 수 있는지 모르겠지만 매니페스트에있는 활동을 알고 싶습니다. . Mr.NomGame 클래스 만 있습니다. –