구조는 단순합니다.
helloworld sample을 임포트 해보시면 위와같은 두가지 프로젝트가 생성이 되는데
gdx-helloworld 는 helloworld소스고 -android 는 gdx-helloworld를 android로 포팅한다 라고 생각되네요.
짧으니 -android소스부터.
HelloWorldAndroid.java
소스 자체보다 중요한건 lib폴더쪽인것 같네요.
동영상 tutorial에서도 보시면 이전 글에서 말씀드린 jar파일들을 모두 사용하지 않고 몇가지만 사용하는데(당연하겠지만요.) -android에서는 아래와 같이 몇가지만 사용했습니다. 중요한건 폴더자체도 똑같이 생성해줘야 한다는것??정도랄까요. 자세한건 아직 모르겠네요.
gdx-helloworld의 HelloWorld.java에서 사용된 변수로는
SpriteBatch, Texture, BitmapFont, Vector2 이 전부인데 그래픽과 관련이 없어서 그런지 다 모르겠네요.
문서에서 보면
SpriteBatch :
라고 되어있는데... 일단 대충 이해하길 위 클래스는 2D 사각형을 그리는데에 사용되며, GPU를 통해 처리하고.
begin()메소드를 호출하면서 랜더링 상태를 설정하고, 마지막으로 end()메소드를 호출하며.
화면의 x,y좌표를 사용하고, 원할경우 프로젝션 매트릭스를 제공하며,
OpenGL과 관련된 것들을 관리할 수 있고,
SpriteBatch는 무거운 객체라는 것과, OpenGL ES 1.x, 2.0 에서 모두 작동하며 SpriteBatch는 더이상 사용하지 않을경우 폐기한다 라는 구글번역기에 말씀이시네요.
Texture :
텍스쳐는 표준의 OpenGL ES 텍스처를 래핑합니다.
질감을 관리할 수 있습니다. 는 OpenGL 컨텍스트가 손실되면 관리되는 모든 질감이 무효하십시오. 사용자가 다른 응용 프로그램에 스위치 또는 수신 전화를받을 때 이러한 문제가 발생합니다. 관리 텍스처가 자동으로 다시로드 받으세요.
텍스쳐가 기하학에 적용하기 위해서 bind() 메소드를 통해 바운드되어야한다.질감은 GLCommon.glActiveTexture (INT)를 통해 지정된 현재 활성화된 텍스쳐 유닛에 바인딩됩니다.
언제든지 질감에 Pixmaps을 얻을 수 있습니다.변경 사항은 자동으로 텍스처 메모리에 업로드됩니다. 이것은 당연하지 매우 빠르게 때문에 신경을 써서 그것을 사용합니다. 또한 전용 관리되지 않는 질감과 함께 작동합니다.
그것이 더 이상 사용하지 않은 경우 텍스쳐는 폐기해야합니다
귀차니즘으로 그냥 붙여넣기 했습니다.
택스쳐라는 것은 일반 OpenGL에서 사용하는 택스쳐와 비슷한 뜻인것 같습니다.
BitmapFont :
폰트를 bitmap처럼 사용하기 위한 클래스 이네요. 그냥 그런느낌이에요.....;; 그리고 Matthias Mann님이 만드신거라는 걸까요.. 이분의 코드를 기초로 했다는게 문서에 써있는걸 보면 오픈소스느낌이 확실히 나네요.
Vector2 :
와우 한줄밖에 안되네요.
2D vector를 캡슐화합니다. 2D vector에 대한 정보를 담고있는 VO클래스 정도로 생각할 수 있겠네요.
그래서 드디어 본 소스를 보자면.....
/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.helloworld;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Files.FileType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.Texture.TextureWrap;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
public class HelloWorld implements ApplicationListener {
SpriteBatch spriteBatch;
Texture texture;
BitmapFont font;
Vector2 textPosition = new Vector2(100, 100);
Vector2 textDirection = new Vector2(1, 1);
@Override
public void create () {
font = new BitmapFont(); //BitmapFont 생성
font.setColor(Color.RED);
texture = new Texture(Gdx.files.internal("data/badlogic.jpg")); //badlogic.jpg파일로 Texture객체 생성
spriteBatch = new SpriteBatch(); //SpriteBatch객체 생성
}
@Override
public void render () {
//center를 받아오는 코드입니다.
int centerX = Gdx.graphics.getWidth() / 2;
int centerY = Gdx.graphics.getHeight() / 2;
// opengl쪽을 이용하는 프로그램에서는 거의 대부분 아래와 같은 세팅을 하는데 이유는 모르겠습니다. 아시는분은 말씀좀해주세요.
Gdx.graphics.getGL10().glClear(GL10.GL_COLOR_BUFFER_BIT);
// more fun but confusing :)
//textPosition.add(textDirection.tmp().mul(Gdx.graphics.getDeltaTime()).mul(60)); 움직이게 하는 소스인듯?
textPosition.x += textDirection.x * Gdx.graphics.getDeltaTime() * 60;
textPosition.y += textDirection.y * Gdx.graphics.getDeltaTime() * 60;
//--------------- 여기부터
if (textPosition.x < 0 ) {
textDirection.x = -textDirection.x;
textPosition.x = 0;
}
if(textPosition.x > Gdx.graphics.getWidth()) {
textDirection.x = -textDirection.x;
textPosition.x = Gdx.graphics.getWidth();
}
if (textPosition.y < 0) {
textDirection.y = -textDirection.y;
textPosition.y = 0;
}
if (textPosition.y > Gdx.graphics.getHeight()) {
textDirection.y = -textDirection.y;
textPosition.y = Gdx.graphics.getHeight();
}
//-------------- 여기까지가 화면을 벗어났을때의 처리
//위에서 말씀드린 begin이 나왔네요. 그리고 setColor, draw 등으로 화면을 설정해줍니다.
spriteBatch.begin();
spriteBatch.setColor(Color.WHITE);
spriteBatch.draw(texture,
centerX - texture.getWidth() / 2,
centerY - texture.getHeight() / 2,
0, 0, texture.getWidth(), texture.getHeight());
// font.draw(SpriteBatch, 화면에 띄울 글, 글자의 위치 x, 글자의 위치Y);
font.draw(spriteBatch, "Hello World!", (int)textPosition.x, (int)textPosition.y);
spriteBatch.end();
}
@Override public void resize (int width, int height) {
spriteBatch.getProjectionMatrix().setToOrtho2D(0, 0, width, height);
//setToOrtho2D(float x, float y, float width, float height, float near, float far)
//Sets this matrix to an orthographic projection matrix with the origin at (x,y)
//extending by width and height, having a near and far plane.
textPosition.set(0, 0);
}
@Override public void pause () {
}
@Override public void resume () {
}
@Override public void dispose () {
}
}
마지막에 resize에서 SpriteBatch의 "원할경우 프로젝션 매트릭스를 제공하며,"라는 부분이 더 들어갔네요.
Matrix4쪽에 가서 찾아보시면 위에 setToOrtho2D 메소드에 대한 설명이 있을껍니다.
그래서 실행하게되면....
HelloWorld라는 글자가 화면에서 대각선으로 이동하며 화면끝에 도착하면 바운드(?)되는 화면이 보여지게 됩니다.
'개발 > 안드로이드 개발' 카테고리의 다른 글
Android 휴대폰 전화번호 받아오기 (0) | 2011.08.24 |
---|---|
pixel 로 dip구하기 (0) | 2011.08.24 |
libgdx - 시작하기 (0) | 2011.08.09 |
[안드로이드]rokon engine 활용기 (0) | 2011.06.20 |
[안드로이드] jbox2d 공부합시다. (0) | 2011.06.15 |