Drawing Rectangles 예제 소스는 Drawing Lines 예제(
2011/12/02 - [프로그래밍/안드로이드] - AndEngine - 5 - Drawing Lines
)와 큰 차이는 없다. 다만, onLoadScene() 에서 터치 관련 리스너를 등록하여, 사용자가 해당 씬을 터치할 경우 현재 화면을 캡춰하는 기능이 추가되어있다.(아래 anonymous class 영역)
scene.setOnSceneTouchListener(
new IOnSceneTouchListener() { @Override public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { ... 생략 ... return true; }});
캡춰 관련한 부분은 또 다른 예제 Capturing the Screen 에 있으므로 후에 살펴보자. 일단, org.anddev.andengine.entity.primitive 패키지에 속한 클래스는 다음과 같다.
해당 패키지에 속하지않는 클래스는 회색으로 칠해보았다. 캡춰 부분을 제외하고 Drawing Lines 와의 차이점은 Rectangle 클래스의 사용 부분이다.
/* Create the rectangles. */
final Rectangle rect1 = this.makeColoredRectangle(-180, -180, 1, 0, 0);
final Rectangle rect2 = this.makeColoredRectangle(0, -180, 0, 1, 0);
final Rectangle rect3 = this.makeColoredRectangle(0, 0, 0, 0, 1);
final Rectangle rect4 = this.makeColoredRectangle(-180, 0, 1, 1, 0);
final Entity rectangleGroup = new Entity(CAMERA_WIDTH / 2, CAMERA_HEIGHT / 2);
rectangleGroup.attachChild(rect1);
rectangleGroup.attachChild(rect2);
rectangleGroup.attachChild(rect3);
rectangleGroup.attachChild(rect4);
scene.attachChild(rectangleGroup);
makeColoredRectangle() 메소드는 다음과 같다.
private Rectangle makeColoredRectangle(final float pX, final float pY, final float pRed, final float pGreen, final float pBlue) {
final Rectangle coloredRect = new Rectangle(pX, pY, 180, 180);
coloredRect.setColor(pRed, pGreen, pBlue);
return coloredRect;
}
Rectangle 의 인스턴스를 생성하고 색을 할당한 후에 이를 반환하면, Entity 인 rectangleGroup 에 이를 추가하고~ 끝으로 이 rectangleGroup 을 scene 에 추가한다. 얼핏 보아도 Composite 패턴으로 보인다.
어디 한번 추적해볼까?
Component 에 해당하는 놈은 IEntity 이고, 인터페이스간 다중 상속을 덕지 덕지 붙이고 있다.(이런 설계 별로 안좋아하는데... ㅡㅡ;;) 아무튼 AndEngine 의 설계자는 인터페이스로 기능을 그룹핑하는 걸 좋아하는 거 같다. 개인적으로는 Behavior 를 분류하고 Strategy 처리하는 것을 선호하는 편이라... 이런 다중상속 덩어리들은 단순한 뇌구조인 내겐 정말 복잡하게 느껴진다. ㅠㅠ (얻어쓰는 입장에 뭐 이런 잔소리를....;;)
다이어그램을 뽑아보니 Composite 이긴한데, GoF 패턴과는 좀 다르다. 알고 쓴건지 하다보니 그렇게 된건지는 모르겠는데... 인터페이스를 선호하는 설계자에 의해 Component 가 IEntity 이고 Composite 가 Entity 이고 Leaf 가 IShape 를 상속받은 놈으로 보이는데... 빌어먹을 Leaf 에 해당되는 놈들이 다시 Entity 를 상속받고있다. 이런 구조라면 Shape 를 상속받은 Line 이나 Rectangle 역시 attachChild 가 된다는 소린데... 헛헛.. 그저 웃음밖에 안나온다. 이 시점에 솔직히 이 엔진을 사용해도되나 고민이 된다. 아씨... 닥치고 쓰면 되는 엔진을 가지고 이리저리 까보고 있는 내가 더 이상한 거 겠지만... 전체 소스 올리고 급마무리해야겠다.
package kr.logy.code.AESample1;
import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.Camera;
import org.anddev.andengine.engine.options.EngineOptions;
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation;
import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.anddev.andengine.entity.Entity;
import org.anddev.andengine.entity.primitive.Rectangle;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.util.FPSLogger;
import org.anddev.andengine.ui.activity.BaseGameActivity;
public class AESample1Activity extends BaseGameActivity {
private Camera mCamera;
private static final int CAMERA_WIDTH = 720;
private static final int CAMERA_HEIGHT = 480;
@Override
public void onLoadComplete() {
}
@Override
public Engine onLoadEngine() {
this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mCamera));
}
@Override
public void onLoadResources() {
// TODO Auto-generated method stub
}
@Override
public Scene onLoadScene() {
this.mEngine.registerUpdateHandler(new FPSLogger());
final Scene scene = new Scene();
scene.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));
final Rectangle rect1 = this.makeColoredRectangle(-180, -180, 1, 0, 0);
final Rectangle rect2 = this.makeColoredRectangle(0, -180, 0, 1, 0);
final Rectangle rect3 = this.makeColoredRectangle(0, 0, 0, 0, 1);
final Rectangle rect4 = this.makeColoredRectangle(-180, 0, 1, 1, 0);
final Entity rectangleGroup = new Entity(CAMERA_WIDTH / 2, CAMERA_HEIGHT / 2);
rectangleGroup.attachChild(rect1);
rectangleGroup.attachChild(rect2);
rectangleGroup.attachChild(rect3);
rectangleGroup.attachChild(rect4);
scene.attachChild(rectangleGroup);
return scene;
}
private Rectangle makeColoredRectangle(final float pX, final float pY, final float pRed, final float pGreen, final float pBlue) {
final Rectangle coloredRect = new Rectangle(pX, pY, 180, 180);
coloredRect.setColor(pRed, pGreen, pBlue);
return coloredRect;
}
}
실행하면 다음과 같이 출력된다.
'프로그래밍 > 안드로이드' 카테고리의 다른 글
갤럭시S2 젤리빈 펌웨어 업그레이드 수행기~ (0) | 2013.02.11 |
---|---|
AndEngine - 7 - Drawing a Sprite (0) | 2011.12.12 |
AndEngine - 5 - Drawing Lines (0) | 2011.12.02 |
AndEngine - 4 - Examples (1) | 2011.12.01 |
AndEngine - 3 - Extensions 추가하기 (0) | 2011.12.01 |
댓글