본문 바로가기
프로그래밍/언어 - Java,Kotlin

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;

}

}

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

 
반응형

댓글0