티스토리 뷰

- Tile based games (http://www.tonypa.pri.ee/tbw/start.html)
위 튜토리얼을 기본으로 하여 Android에 사용될 수 있게끔 공부한 포스트 입니다.




Jumping을 구현하기 위해 돌아온 길이 너무 험난했다. 여태까지 만들었던 모든 소스와 별개로 구성되어있다. 이전 부터 따라온 경우라면 현재 첨부된 소스로 진행할 것을 권장한다.

버전 이력에도 적었듯이 v2.0으로 소스가 업그레이드 되었으며 머지 않아 마지막 챕터까지 공부를 끝낸다면 그 이후부터는 새로 소스가 구성되게 될 것이다.

현재 계획으로는 타일베이스게임을 통해 기본적인 게임 제작 기법의 습득이 완성 되면
앞으로는 현재 공개된 게임 엔진을 분석하는 것으로 방향을 잡을 생각이다.


1. 이론


뜀뛰기는 위를 향해 하고 있으므로 y축이 점차 감소한다.
물리적인 면을 고려하여 어느 일정 이상을 뛰게 되면 뛴 양을 감소 시켜야 한다.
아래 타일이 없는 경우 낙하하는 모션도 고려해야 한다.


2. 소스

// Chap. Jumping
private int _jumpspeed = 0;
private int _jumpstart = -18;
private int _gravity = 2;
private boolean _jump = false;
// Chap. Jumping
Hero 클래스에 위와 같은 변수를 추가해준다. 

jump 변수를 통해 jump 버튼을 연타하는 경우를 방지 해준다.
jumpspeed와 gravity를 통해 물리적인 효과를 표현 할 수 있다.

//Chap. Jumping 
float y = (mHero.get_tileY() * map.MAP_TILE_HEIGHT) - mHero.get_height();

mHero.get_height() : Hero의 높이는 총 Hero 이미지의 절반임, 이미지는 가운데 점을 기준으로 그려지게 됨
때문에 지면에 닿는 것처럼 만들고 싶다면 위와 같이 표현 하면 지면 위에 그려지게 된다.

다음은 Jump(), fall() 메소드를 구현한다.

//Chap. Jumping 
public void jump(ResObject obj) {
	obj.set_jumpspeed(obj.get_jumpspeed() + obj.get_gravity());
	if(obj.get_jumpspeed() > map.MAP_TILE_HEIGHT-obj.get_height()) {
		obj.set_jumpspeed(map.MAP_TILE_HEIGHT-obj.get_height());
	}
	if(obj.get_jumpspeed() < 0) {
		moveObject(obj,0,-1,-1);
	}else if(obj.get_jumpspeed() > 0) {
		moveObject(obj,0,1,1);
	}
}
	
// Chap. fall
public void fall(ResObject obj) {
	if(obj.is_jump() == false) {
		getMyCorner(obj.get_x(), obj.get_y(), obj);
		if(obj.getDownleft() == 1 && obj.getDownright() == 1) {
			obj.set_jump(true);
			obj.set_jumpspeed(0);
		}
	}
}


Jump의 경우 Jump시 speed를 체크하여 속도를 설정해준 뒤 moveObject()를 통해 hero를 움직이게 된다.

fall()의 경우 하단의 벽 충돌 체크를 한 후 이동 가능한 상태이면 떨어지도록 처리 한다. (변수 처리)
Jump()메소드는 Key 체크를 할때, 즉 매번 불리게 되므로 fall()에서 설정된 변수의 영향을 받아 캐릭터를 움직여 주게 된다.

moveObject() 메소드에서는 speed 값을 변경 시켜 역동적인 움직임을 표시해주게 되는데 첨부된 소스에서는 몇가지 오류가 있어 이를 잠시 주석으로 막아두었다. 원본 강좌에서도 speed값이 object의 speed 값과 동일하다곤 했는데 초기값을 설정해주는 부분이 없어 obj.set_speed(speed)를 해주기에도 뭐했다.

moveObject() 메소드에서는 벽의 충돌 체크를 통해 object를 이동 시키는 작업을 수행하는데, 상단 하단 벽 충돌시 각각 처리 해주고 있다. 이 부분은 소스를 첨가하지 않겠다.

악마성과 같은 2D 게임을 만들때 매우 좋은 예이나 그동안 진도가 너무 안나간데다 서둘로 마지막 챕터까지 본뒤 다시 정리할 생각이므로 후다닥 넘어가도록 하겠다.

 
댓글
댓글쓰기 폼