본문 바로가기
프로그래밍/안드로이드

AndEngine - 6 - Drawing Rectangles

by 사악신 2011. 12. 6.

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;
 }
}

 

실행하면 다음과 같이 출력된다.

 

반응형

댓글