본문 바로가기

개발/안드로이드 개발

libgdx - sample

기본적인 sample로 어디에나 있는 helloworld 를 실행해 보았습니다.
구조는 단순합니다.


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라는 글자가 화면에서 대각선으로 이동하며 화면끝에 도착하면 바운드(?)되는 화면이 보여지게 됩니다.