2015년 10월 12일 월요일
2015년 9월 29일 화요일
2015년 7월 13일 월요일
2015년 7월 9일 목요일
2015년 6월 23일 화요일
2015년 6월 22일 월요일
unity android setting
unity Build for Android
1.Java JDK install -http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.Android SDK Download and Install
-http://developer.android.com/sdk/installing/index.html
3.unity
-File ->BuildSetting -> android swithch platform ->Build
Android Debug in Unity
1.Google play -> unity remote 4 install
2.unity -> Edit->Project Setting -> Editor -> Device Any Android device
3. USB Cable Connect
4. unity Play!
Link
JDK Setting
- http://mrhook.co.kr/204
Android Setting
- http://mrhook.co.kr/205
Debug Setting
-http://mrhook.co.kr/206
1.Java JDK install -http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.Android SDK Download and Install
-http://developer.android.com/sdk/installing/index.html
3.unity
-File ->BuildSetting -> android swithch platform ->Build
Android Debug in Unity
1.Google play -> unity remote 4 install
2.unity -> Edit->Project Setting -> Editor -> Device Any Android device
3. USB Cable Connect
4. unity Play!
Link
JDK Setting
- http://mrhook.co.kr/204
Android Setting
- http://mrhook.co.kr/205
Debug Setting
-http://mrhook.co.kr/206
2015년 5월 28일 목요일
2015년 5월 17일 일요일
2015년 5월 13일 수요일
delegate 란? 람다식이란?
델리게이트란 메서드에 대한 참조이다.
델리게이트에 메소드의 주소를 할당한 후 델리게이트를 호출하면 델리게이트가 메서드를
호출해준다.
선언 방법
ex) public delegate void Name(int a);
람다식은 익명메소드를 만드는 또하나의 방법이다.
기존의 익명메소드는
delegate int Calculate(int a, int b);
..
static void Main(string[] args)
{
Calculate calc = delegate( int a, int b)
{
return a+b;
};
}
이지만 람다식을 쓰게 되면
delegate int Calculate(int a, int b);
..
static void Main(string[] args)
{
Calculate calc = ( a , b ) => a+b;
}
로 간편하게 사용 할 수 있다.
델리게이트에 메소드의 주소를 할당한 후 델리게이트를 호출하면 델리게이트가 메서드를
호출해준다.
선언 방법
ex) public delegate void Name(int a);
람다식은 익명메소드를 만드는 또하나의 방법이다.
기존의 익명메소드는
delegate int Calculate(int a, int b);
..
static void Main(string[] args)
{
Calculate calc = delegate( int a, int b)
{
return a+b;
};
}
이지만 람다식을 쓰게 되면
delegate int Calculate(int a, int b);
..
static void Main(string[] args)
{
Calculate calc = ( a , b ) => a+b;
}
로 간편하게 사용 할 수 있다.
2015년 4월 15일 수요일
unity GUI를 이용한 file explorer
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System;
using System.Collections.Generic;
public class FinderWindow : EditorWindow
{
[MenuItem("Game/Finder Window")]
public static void Init()
{
var window = EditorWindow.GetWindow<FinderWindow>(false, "Finder");
window.Show();
}
string[] m_Directories;
string[] m_Files;
string m_SelectionPath;
string m_PathButtonName;
Rect m_RectTextField;
Rect m_RectPathButton;
Rect m_RectBeginArea;
Rect m_RectSelectButton;
Rect m_RectCancelButton;
List<String> m_Items;
List<String> m_Path;
Vector2 m_ScrollVector;
GUIStyle[] m_LabelStyle;
bool m_StyleCheck;
int m_SelectNum;
void OnEnable()
{
m_Path = new List<string>();
m_Items = new List<string>();
m_Directories = new String[m_Items.Count];
m_Files = new String[m_Items.Count];
m_SelectionPath = "";
m_PathButtonName = "...";
m_RectTextField = new Rect(10, 10, 400, 20);
m_RectPathButton = new Rect(420, 10, 30, 20);
m_RectBeginArea = new Rect(10, 40, 440, 300);
m_RectSelectButton = new Rect(390, 350, 60, 20);
m_RectCancelButton = new Rect(325, 350, 60, 20);
m_StyleCheck = false;
m_SelectNum = -1;
}
void OnDestroy()
{
}
void Update()
{
}
void OnGUI()
{
GUI.TextField(m_RectTextField, m_SelectionPath);
if (GUI.Button(m_RectPathButton, m_PathButtonName))
{
string folder_path = EditorUtility.OpenFolderPanel("Select Floder", "", "");
m_SelectionPath = folder_path;
if (m_SelectionPath != "")
{
FileList(m_SelectionPath);
}
}
GUILayout.BeginArea(m_RectBeginArea, GUI.skin.box);
m_ScrollVector = GUILayout.BeginScrollView(m_ScrollVector);
if (m_Items.Count != 0)
{
if (GUILayout.Button("...", GUI.skin.label))
{
m_SelectionPath = RemoveLastWord(m_SelectionPath);
if (m_SelectionPath != "")
{
FileList(m_SelectionPath);
}
}
}
if (m_Items.Count != 0 && !m_StyleCheck)
{
m_LabelStyle = new GUIStyle[m_Items.Count];
m_StyleCheck = true;
}
for (int i = 0; i < m_Items.Count; i++)
{
if (m_LabelStyle[i] == null)
{
m_LabelStyle[i] = new GUIStyle();
}
if (GUILayout.Button(m_Items[i], m_LabelStyle[i]))
{
if (m_LabelStyle[i].normal.textColor == Color.magenta)
{
m_LabelStyle[i].normal.textColor = Color.black;
m_SelectionPath = m_SelectionPath + "/" + m_Items[i];
m_StyleCheck = false;
if (Directory.Exists(m_SelectionPath))
{
FileList(m_SelectionPath);
}
else
{
m_SelectionPath = RemoveLastWord(m_SelectionPath);
}
m_SelectNum = -1;
break;
}
else
{
for (int j = 0; j < m_Items.Count; j++)
{
m_LabelStyle[j].normal.textColor = Color.black;
}
m_LabelStyle[i].normal.textColor = Color.magenta;
m_SelectNum = i;
}
}
}
GUILayout.EndScrollView();
GUILayout.EndArea();
if (GUI.Button(m_RectSelectButton, "Select"))
{
if (m_SelectNum != -1)
{
Debug.Log(m_Path[m_SelectNum]);
}
}
if (GUI.Button(m_RectCancelButton, "Cancel"))
{
}
}
void FileList(string path)
{
m_Items.Clear();
m_Path.Clear();
m_StyleCheck = false;
m_Directories = Directory.GetDirectories(path);
for (int i = 0; i < m_Directories.Length; i++)
{
// Debug.Log(m_Directories[i]);
int subNum = m_Directories[i].IndexOf('\\');
m_Directories[i] = m_Directories[i].Replace('\\', '/');
m_Path.Add(m_Directories[i]);
if (subNum == -1)
{
m_Items.Add(GetLastWord(m_Directories[i]));
}
else
{
string dirName = m_Directories[i].Substring(subNum + 1);
m_Items.Add(dirName);
}
}
m_Files = Directory.GetFiles(path);
for (int i = 0; i < m_Files.Length; i++)
{
int subNum = m_Files[i].IndexOf('\\');
m_Files[i] = m_Files[i].Replace('\\', '/');
m_Path.Add(m_Files[i]);
if (subNum == -1)
{
m_Items.Add(GetLastWord(m_Files[i]));
}
else
{
string fileName = m_Files[i].Substring(subNum + 1);
m_Items.Add(fileName);
}
//Debug.Log(m_Files[i]);
}
}
public static string GetLastWord(string text)
{
string[] lastWord = text.Split('/');
return lastWord[lastWord.Length - 1];
}
public static string RemoveLastWord(string text)
{
string[] lastWord = text.Split('/');
string word = GetLastWord(text);
if (word == text)
{
return text;
}
text = null;
for (int i = 0; i < lastWord.Length; i++)
{
if (i == lastWord.Length - 1)
{
break;
}
if (i == lastWord.Length - 2)
{
text += lastWord[i];
}
else
{
text += lastWord[i] + "/";
}
}
// Debug.Log(text);
return text;
}
}
using System.Collections;
using UnityEditor;
using System.IO;
using System;
using System.Collections.Generic;
public class FinderWindow : EditorWindow
{
[MenuItem("Game/Finder Window")]
public static void Init()
{
var window = EditorWindow.GetWindow<FinderWindow>(false, "Finder");
window.Show();
}
string[] m_Directories;
string[] m_Files;
string m_SelectionPath;
string m_PathButtonName;
Rect m_RectTextField;
Rect m_RectPathButton;
Rect m_RectBeginArea;
Rect m_RectSelectButton;
Rect m_RectCancelButton;
List<String> m_Items;
List<String> m_Path;
Vector2 m_ScrollVector;
GUIStyle[] m_LabelStyle;
bool m_StyleCheck;
int m_SelectNum;
void OnEnable()
{
m_Path = new List<string>();
m_Items = new List<string>();
m_Directories = new String[m_Items.Count];
m_Files = new String[m_Items.Count];
m_SelectionPath = "";
m_PathButtonName = "...";
m_RectTextField = new Rect(10, 10, 400, 20);
m_RectPathButton = new Rect(420, 10, 30, 20);
m_RectBeginArea = new Rect(10, 40, 440, 300);
m_RectSelectButton = new Rect(390, 350, 60, 20);
m_RectCancelButton = new Rect(325, 350, 60, 20);
m_StyleCheck = false;
m_SelectNum = -1;
}
void OnDestroy()
{
}
void Update()
{
}
void OnGUI()
{
GUI.TextField(m_RectTextField, m_SelectionPath);
if (GUI.Button(m_RectPathButton, m_PathButtonName))
{
string folder_path = EditorUtility.OpenFolderPanel("Select Floder", "", "");
m_SelectionPath = folder_path;
if (m_SelectionPath != "")
{
FileList(m_SelectionPath);
}
}
GUILayout.BeginArea(m_RectBeginArea, GUI.skin.box);
m_ScrollVector = GUILayout.BeginScrollView(m_ScrollVector);
if (m_Items.Count != 0)
{
if (GUILayout.Button("...", GUI.skin.label))
{
m_SelectionPath = RemoveLastWord(m_SelectionPath);
if (m_SelectionPath != "")
{
FileList(m_SelectionPath);
}
}
}
if (m_Items.Count != 0 && !m_StyleCheck)
{
m_LabelStyle = new GUIStyle[m_Items.Count];
m_StyleCheck = true;
}
for (int i = 0; i < m_Items.Count; i++)
{
if (m_LabelStyle[i] == null)
{
m_LabelStyle[i] = new GUIStyle();
}
if (GUILayout.Button(m_Items[i], m_LabelStyle[i]))
{
if (m_LabelStyle[i].normal.textColor == Color.magenta)
{
m_LabelStyle[i].normal.textColor = Color.black;
m_SelectionPath = m_SelectionPath + "/" + m_Items[i];
m_StyleCheck = false;
if (Directory.Exists(m_SelectionPath))
{
FileList(m_SelectionPath);
}
else
{
m_SelectionPath = RemoveLastWord(m_SelectionPath);
}
m_SelectNum = -1;
break;
}
else
{
for (int j = 0; j < m_Items.Count; j++)
{
m_LabelStyle[j].normal.textColor = Color.black;
}
m_LabelStyle[i].normal.textColor = Color.magenta;
m_SelectNum = i;
}
}
}
GUILayout.EndScrollView();
GUILayout.EndArea();
if (GUI.Button(m_RectSelectButton, "Select"))
{
if (m_SelectNum != -1)
{
Debug.Log(m_Path[m_SelectNum]);
}
}
if (GUI.Button(m_RectCancelButton, "Cancel"))
{
}
}
void FileList(string path)
{
m_Items.Clear();
m_Path.Clear();
m_StyleCheck = false;
m_Directories = Directory.GetDirectories(path);
for (int i = 0; i < m_Directories.Length; i++)
{
// Debug.Log(m_Directories[i]);
int subNum = m_Directories[i].IndexOf('\\');
m_Directories[i] = m_Directories[i].Replace('\\', '/');
m_Path.Add(m_Directories[i]);
if (subNum == -1)
{
m_Items.Add(GetLastWord(m_Directories[i]));
}
else
{
string dirName = m_Directories[i].Substring(subNum + 1);
m_Items.Add(dirName);
}
}
m_Files = Directory.GetFiles(path);
for (int i = 0; i < m_Files.Length; i++)
{
int subNum = m_Files[i].IndexOf('\\');
m_Files[i] = m_Files[i].Replace('\\', '/');
m_Path.Add(m_Files[i]);
if (subNum == -1)
{
m_Items.Add(GetLastWord(m_Files[i]));
}
else
{
string fileName = m_Files[i].Substring(subNum + 1);
m_Items.Add(fileName);
}
//Debug.Log(m_Files[i]);
}
}
public static string GetLastWord(string text)
{
string[] lastWord = text.Split('/');
return lastWord[lastWord.Length - 1];
}
public static string RemoveLastWord(string text)
{
string[] lastWord = text.Split('/');
string word = GetLastWord(text);
if (word == text)
{
return text;
}
text = null;
for (int i = 0; i < lastWord.Length; i++)
{
if (i == lastWord.Length - 1)
{
break;
}
if (i == lastWord.Length - 2)
{
text += lastWord[i];
}
else
{
text += lastWord[i] + "/";
}
}
// Debug.Log(text);
return text;
}
}
2015년 4월 14일 화요일
top down RPG 예제
2.5D 형식
http://singletechgames.com/2014/08/19/tutorial-de-unity-2-5d-como-crear-un-juego-isometrico-estilo-diablo-vista-top-down/
비행기
http://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/top-down-2d
http://singletechgames.com/2014/08/19/tutorial-de-unity-2-5d-como-crear-un-juego-isometrico-estilo-diablo-vista-top-down/
비행기
http://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/top-down-2d
2015년 3월 25일 수요일
2015.03.26 전라북도게임아카데미 클래스와 메서드
클래스를 예제로 쉽게 말하면
클래스를 만들면 사용하기 위해서 RAM에 올라가는데 이 올라간 것을 인스턴스라 부르는
자동차 카니발이라는 차종이 있다.
그리고 지금 내 앞에 카니발이 3대가 있다.
여기서 앞에 있는 카니발 한대한대를 인스턴스라고 부르고
이 3대를 부르는 것을 객체라고 한다. 그리고 카니발이라는 차 자체를 클래스라고 한다.
클래스를 만들면 사용하기 위해서 RAM에 올라가는데 이 올라간 것을 인스턴스라 부르는
것이다.
클래스는 데이터와 메소드의 집합이다.
데이터들은 값들이고 변수에 할당 되어진다.
메서드는 이러한 데이터들을 이용하여 어떠한 기능은 수행하는 역할을 한다.
메서드는 이러한 데이터들을 이용하여 어떠한 기능은 수행하는 역할을 한다.
2015년 3월 24일 화요일
2015.03.25 전라북도게임아카데미 Data Size 알아보기
using UnityEngine;
using System.Collections;
public class CsDataSize : MonoBehaviour {
// Use this for initialization
void Start()
{
Debug.Log("Size of byte: " + sizeof(byte));
Debug.Log("Size of short: " + sizeof(short));
Debug.Log("Size of int: " + sizeof(int));
Debug.Log("Size of long: " + sizeof(long));
Debug.Log("Size of double: " + sizeof(double));
Debug.Log("Size of float: " + sizeof(float));
}
// Update is called once per frame
void Update()
{
}
}
using System.Collections;
public class CsDataSize : MonoBehaviour {
// Use this for initialization
void Start()
{
Debug.Log("Size of byte: " + sizeof(byte));
Debug.Log("Size of short: " + sizeof(short));
Debug.Log("Size of int: " + sizeof(int));
Debug.Log("Size of long: " + sizeof(long));
Debug.Log("Size of double: " + sizeof(double));
Debug.Log("Size of float: " + sizeof(float));
}
// Update is called once per frame
void Update()
{
}
}
sizeof() 를 이용하자.
2015.03.24 전주게임아카데미 개발 환경설정
1.윈도우 8.1
2.Visual Studio 2013 community 설치 -> 계정 등록
3.언어팩 설치후 tools->option->international setting
4.C#프로젝트 생성 및 Hello 찍어보기
5.Unity 4.6.3f 설치
6.Unity 실행 및 monodevelop으로 C#스크립트 작성후 hello 찍어보기
7.Visual Studio 2013 Tools for Unity 설치
8. Unity 실행후 Assets->Import pakege->Visual Studio 2013 Tools
9.만약 Assets에 없다면 C:\ 에서 Visual Studio 2013 Tools 패키지 찾은 다음
Unity 경로 C:\Unity\Unity4.6.3f\Editor\Standard Packages 에 패키지 추가하면 Assets
에 보임
10. Import후 스크립트 실행-> vs뜨면 성공!
2.Visual Studio 2013 community 설치 -> 계정 등록
3.언어팩 설치후 tools->option->international setting
4.C#프로젝트 생성 및 Hello 찍어보기
5.Unity 4.6.3f 설치
6.Unity 실행 및 monodevelop으로 C#스크립트 작성후 hello 찍어보기
7.Visual Studio 2013 Tools for Unity 설치
8. Unity 실행후 Assets->Import pakege->Visual Studio 2013 Tools
9.만약 Assets에 없다면 C:\ 에서 Visual Studio 2013 Tools 패키지 찾은 다음
Unity 경로 C:\Unity\Unity4.6.3f\Editor\Standard Packages 에 패키지 추가하면 Assets
에 보임
10. Import후 스크립트 실행-> vs뜨면 성공!
2015년 3월 13일 금요일
2015 03 13 unity2d mouse drag
using UnityEngine;
using System.Collections;
public class CsDrag : MonoBehaviour {
Ray ray;
RaycastHit2D hit;
Rigidbody2D grabbedObject=null;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown (0)) {
Vector3 mouseWorldPos3D = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 mousePos2D= new Vector2(mouseWorldPos3D.x,mouseWorldPos3D.y);
//Debug.Log(mousePos2D);
Vector2 dir = Vector2.zero;
hit = Physics2D.Raycast (mousePos2D,dir);
if (hit!=null&&hit.collider!=null){
//Debug.Log (hit);
if(hit.collider.attachedRigidbody!=null){
grabbedObject=hit.collider.attachedRigidbody;
}
}
}
if (Input.GetMouseButtonUp (0)) {
grabbedObject=null;
}
}
void FixedUpdate(){
if (grabbedObject != null) {
Vector3 mouseWorldPos3D = Camera.main.ScreenToWorldPoint (Input.mousePosition);
Vector2 mousePos2D = new Vector2 (mouseWorldPos3D.x, mouseWorldPos3D.y);
grabbedObject.position = mousePos2D;
}
}
}
MainCamera Projection -> Orthographic!!!!!!!! 필수
using System.Collections;
public class CsDrag : MonoBehaviour {
Ray ray;
RaycastHit2D hit;
Rigidbody2D grabbedObject=null;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown (0)) {
Vector3 mouseWorldPos3D = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 mousePos2D= new Vector2(mouseWorldPos3D.x,mouseWorldPos3D.y);
//Debug.Log(mousePos2D);
Vector2 dir = Vector2.zero;
hit = Physics2D.Raycast (mousePos2D,dir);
if (hit!=null&&hit.collider!=null){
//Debug.Log (hit);
if(hit.collider.attachedRigidbody!=null){
grabbedObject=hit.collider.attachedRigidbody;
}
}
}
if (Input.GetMouseButtonUp (0)) {
grabbedObject=null;
}
}
void FixedUpdate(){
if (grabbedObject != null) {
Vector3 mouseWorldPos3D = Camera.main.ScreenToWorldPoint (Input.mousePosition);
Vector2 mousePos2D = new Vector2 (mouseWorldPos3D.x, mouseWorldPos3D.y);
grabbedObject.position = mousePos2D;
}
}
}
MainCamera Projection -> Orthographic!!!!!!!! 필수
2015년 3월 11일 수요일
2015 03 11 게임 아카데미 apk추출과 C# 열거체
응용프로그램 (APK) 공유 및 백업 구글 스토어에서 다운
파일 체크후 back up 하면 끝
추출한 apk 파일은 압축파일이다. 압축을 풀고
ILSpy 파일을 이용하여 C#코드를 확인 할 수 있다.
c#열거체란
상징적인 문자에 고유번호(상수)를 넣어 사용하는 방법
using System;
public class EnumTest
{
enum Days{Sun, Mon, Tue, Wed, Thu, Fri, Sat};
static void main()
{
int x = (int) Days.Sun;
int y = (int) Days.Fri;
Console.WriteLine("sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
Console.WriteLine("Days = {0}", (Days)Enum.Pasre(Days.Sun.GetTypes(),"Sun",True)); // 이런식으로 표현가능
}
}
파일 체크후 back up 하면 끝
추출한 apk 파일은 압축파일이다. 압축을 풀고
ILSpy 파일을 이용하여 C#코드를 확인 할 수 있다.
c#열거체란
상징적인 문자에 고유번호(상수)를 넣어 사용하는 방법
using System;
public class EnumTest
{
enum Days{Sun, Mon, Tue, Wed, Thu, Fri, Sat};
static void main()
{
int x = (int) Days.Sun;
int y = (int) Days.Fri;
Console.WriteLine("sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
Console.WriteLine("Days = {0}", (Days)Enum.Pasre(Days.Sun.GetTypes(),"Sun",True)); // 이런식으로 표현가능
}
}
위의 열거자 enum Days{ Sun,Mon,Tue,Wed,Thu,Fri,Sat} 는
Sun의 값은 0이며 순차적으로 1,2,3,4...로 증가한다.
2015년 1월 12일 월요일
cocos2d-x tiled를 이용한 타일게임 제작 -cocos2d-x 에 타일맵 블루베리 먹기
이번엔 저번 충돌방식과 같은 방법으로 블루베리를 먹어볼것이다.
방법은 저번과 동일하다.
case cocos2d::EventKeyboard::KeyCode::KEY_E:{
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos);
int tileGid = _meta->tileGIDAt(tileCoord);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Eat"].asString();
if (propertyValue.compare("True") == 0) {
_meta->removeTileAt(tileCoord);
_tree->removeTileAt(tileCoord);
}
break;
}
키보드 E를 눌렀을경우 적용시킨다.
타일의 id를 알고 타일의 Eat 이 True 일경우 그 타일을 삭제 시킨다.
방법은 저번과 동일하다.
case cocos2d::EventKeyboard::KeyCode::KEY_E:{
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos);
int tileGid = _meta->tileGIDAt(tileCoord);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Eat"].asString();
if (propertyValue.compare("True") == 0) {
_meta->removeTileAt(tileCoord);
_tree->removeTileAt(tileCoord);
}
break;
}
키보드 E를 눌렀을경우 적용시킨다.
타일의 id를 알고 타일의 Eat 이 True 일경우 그 타일을 삭제 시킨다.
cocos2d-x tiled를 이용한 타일게임 제작 -cocos2d-x 에 타일맵 충돌 판정
캐릭터까지 움직이는 것을 다 했다면 타일맵으로 물체와 충돌하여 보자.
우선 tiled에서 아래 보이는 것처럼 레이어를 2개 추가 하고 tileset 을 하나 추가하자.
tileset은 분홍색과 파란색 타일 두개가 있다.

레이어는 Tree와 Meta 라는 이름으로 2가지를 만들었고
Tree레이어로 나무와 물등 각각의 지형을 추가하자.
그후 Meta레이어로 분홍색 타일을 고른다음 충돌판정을 일으키고 싶은 곳에 타일을 두면 위
화면처럼 보일 것이다.
그후 분홍 타일의 Properties 에 property를 하나 추가한 다음 이름을 Collidable 이라하고 값을
True로 설정해놓는다.
헤더에 아래함수를 추가하고
CCPoint tileCoordForPosition(CCPoint position);
그후 cpp 코드에서 함수를 정의해준다.
CCPoint HelloWorld::tileCoordForPosition(CCPoint position)
{
int x = position.x / _tileMap->getTileSize().width;
int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height;
return ccp(x, y);
}
그다음 update에서 지속적으로 체크해준다 .
void HelloWorld::update(float delta){
auto sprPlayer = (Sprite*)this->getChildByTag(TAG_SPRITE_PLAYER);
this->setViewPointCenter(_player->getPosition());
if (wKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(0, 10));
int tileGid = _meta->tileGIDAt(tileCoord);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->getActionManager()->removeAction(action);
wMoveCheck = false;
}
else{
if (!wMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(0, TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->runAction(action_1);
wMoveCheck = true;
}
}
}
if (sKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(0, -10));
int tileGid = _meta->tileGIDAt(tileCoord);
CCLOG("tileGID:%d", tileGid);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->getActionManager()->removeAction(action);
sMoveCheck = false;
CCLOG("sussece");
}
else{
if (!sMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(0, -TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->runAction(action_1);
sMoveCheck = true;
}
}
}
if (dKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(10, 0));
int tileGid = _meta->tileGIDAt(tileCoord);
CCLOG("tileGID:%d", tileGid);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->getActionManager()->removeAction(action);
dMoveCheck = false;
CCLOG("sussece");
}
else{
if (!dMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->runAction(action_1);
dMoveCheck = true;
}
}
}
if (aKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(-10, 0));
int tileGid = _meta->tileGIDAt(tileCoord);
CCLOG("tileGID:%d", tileGid);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->getActionManager()->removeAction(action);
aMoveCheck = false;
CCLOG("sussece");
}
else{
if (!aMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(-TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->runAction(action_1);
aMoveCheck = true;
}
}
}
}
위 소스에서 중요한 부분은 플레이어의 위치로부터 그 위치에있는 포인트를 tileCoord 로 변환
한 다음 그곳의 타일 ID를 가져온다. 그후
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
과정을 통해서 propertyValue 에 값을 넣은 다음 그 값이
if (propertyValue.compare("True") == 0) 이면
다음에 취할 명령을 넣으면 된다.
우선 tiled에서 아래 보이는 것처럼 레이어를 2개 추가 하고 tileset 을 하나 추가하자.
tileset은 분홍색과 파란색 타일 두개가 있다.

레이어는 Tree와 Meta 라는 이름으로 2가지를 만들었고
Tree레이어로 나무와 물등 각각의 지형을 추가하자.
그후 Meta레이어로 분홍색 타일을 고른다음 충돌판정을 일으키고 싶은 곳에 타일을 두면 위
화면처럼 보일 것이다.
그후 분홍 타일의 Properties 에 property를 하나 추가한 다음 이름을 Collidable 이라하고 값을
True로 설정해놓는다.
헤더에 아래함수를 추가하고
CCPoint tileCoordForPosition(CCPoint position);
그후 cpp 코드에서 함수를 정의해준다.
CCPoint HelloWorld::tileCoordForPosition(CCPoint position)
{
int x = position.x / _tileMap->getTileSize().width;
int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height;
return ccp(x, y);
}
그다음 update에서 지속적으로 체크해준다 .
void HelloWorld::update(float delta){
auto sprPlayer = (Sprite*)this->getChildByTag(TAG_SPRITE_PLAYER);
this->setViewPointCenter(_player->getPosition());
if (wKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(0, 10));
int tileGid = _meta->tileGIDAt(tileCoord);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->getActionManager()->removeAction(action);
wMoveCheck = false;
}
else{
if (!wMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(0, TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->runAction(action_1);
wMoveCheck = true;
}
}
}
if (sKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(0, -10));
int tileGid = _meta->tileGIDAt(tileCoord);
CCLOG("tileGID:%d", tileGid);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->getActionManager()->removeAction(action);
sMoveCheck = false;
CCLOG("sussece");
}
else{
if (!sMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(0, -TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->runAction(action_1);
sMoveCheck = true;
}
}
}
if (dKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(10, 0));
int tileGid = _meta->tileGIDAt(tileCoord);
CCLOG("tileGID:%d", tileGid);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->getActionManager()->removeAction(action);
dMoveCheck = false;
CCLOG("sussece");
}
else{
if (!dMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->runAction(action_1);
dMoveCheck = true;
}
}
}
if (aKeyCheck){
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos + Point(-10, 0));
int tileGid = _meta->tileGIDAt(tileCoord);
CCLOG("tileGID:%d", tileGid);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
if (propertyValue.compare("True") == 0) {
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->getActionManager()->removeAction(action);
aMoveCheck = false;
CCLOG("sussece");
}
else{
if (!aMoveCheck){
auto action_0 = MoveBy::create(0.1, Point(-TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->runAction(action_1);
aMoveCheck = true;
}
}
}
}
위 소스에서 중요한 부분은 플레이어의 위치로부터 그 위치에있는 포인트를 tileCoord 로 변환
한 다음 그곳의 타일 ID를 가져온다. 그후
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Collidable"].asString();
과정을 통해서 propertyValue 에 값을 넣은 다음 그 값이
if (propertyValue.compare("True") == 0) 이면
다음에 취할 명령을 넣으면 된다.
cocos2d-x tiled를 이용한 타일게임 제작 -cocos2d-x 에 타일맵에 플레이어 와 카메라 같이 움직이기
캐릭터를 움직이면 화면을 움직이는 방법은
헤더(.h)에
void setViewPointCenter(CCPoint position);
cpp에
void HelloWorld::setViewPointCenter(CCPoint position) {
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
int x = MAX(position.x, winSize.width / 2);
int y = MAX(position.y, winSize.height / 2);
x = MIN(x, (_tileMap->getMapSize().width * this->_tileMap->getTileSize().width) - winSize.width / 2);
y = MIN(y, (_tileMap->getMapSize().height * _tileMap->getTileSize().height) - winSize.height / 2);
CCPoint actualPosition = ccp(x, y);
CCPoint centerOfView = ccp(winSize.width / 2, winSize.height / 2);
CCPoint viewPoint = ccpSub(centerOfView, actualPosition);
this->setPosition(viewPoint);
}
그후 init 함수에
this->scheduleUpdate();
해주고
void HelloWorld::update(float delta){
this->setViewPointCenter(_player->getPosition());
}
이렇게하면 계속 화면의 위치를 플레이어의 위치로 바꿔 줄 수 있다.
헤더(.h)에
void setViewPointCenter(CCPoint position);
cpp에
void HelloWorld::setViewPointCenter(CCPoint position) {
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
int x = MAX(position.x, winSize.width / 2);
int y = MAX(position.y, winSize.height / 2);
x = MIN(x, (_tileMap->getMapSize().width * this->_tileMap->getTileSize().width) - winSize.width / 2);
y = MIN(y, (_tileMap->getMapSize().height * _tileMap->getTileSize().height) - winSize.height / 2);
CCPoint actualPosition = ccp(x, y);
CCPoint centerOfView = ccp(winSize.width / 2, winSize.height / 2);
CCPoint viewPoint = ccpSub(centerOfView, actualPosition);
this->setPosition(viewPoint);
}
그후 init 함수에
this->scheduleUpdate();
해주고
void HelloWorld::update(float delta){
this->setViewPointCenter(_player->getPosition());
}
이렇게하면 계속 화면의 위치를 플레이어의 위치로 바꿔 줄 수 있다.
cocos2d-x tiled를 이용한 타일게임 제작 -cocos2d-x 에 타일맵에 플레이어 키보드로 움직이기
우선 헤더(.h)에
void onKeyPressed(EventKeyboard::KeyCode keyCode, Event *event);
void onKeyReleased(EventKeyboard::KeyCode keyCode, Event *event);
해주고
cpp 에서 init 함수에
auto keylistener = EventListenerKeyboard::create();
keylistener->onKeyPressed = CC_CALLBACK_2(HelloWorld::onKeyPressed, this);
keylistener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(keylistener, this);
해준다. onKeyPressed,onKeyReleased 함수가 필요함으로
void HelloWorld::onKeyReleased(EventKeyboard::KeyCode keyCode, Event *event){
auto sprPlayer = (Sprite*)this->getChildByTag(TAG_SPRITE_PLAYER);
switch (keyCode)
{
case cocos2d::EventKeyboard::KeyCode::KEY_A:{
aKeyCheck = false;
aMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->getActionManager()->removeAction(action);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_D:{
dKeyCheck = false;
dMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->getActionManager()->removeAction(action);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_S:
{
sKeyCheck = false;
sMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->getActionManager()->removeAction(action);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_W:
{
wKeyCheck = false;
wMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->getActionManager()->removeAction(action);
break;
}
default:
break;
}
}
void HelloWorld::onKeyPressed(EventKeyboard::KeyCode keyCode, Event *event){
auto sprPlayer = (Sprite*)this->getChildByTag(TAG_SPRITE_PLAYER);
switch (keyCode)
{
case cocos2d::EventKeyboard::KeyCode::KEY_A:{
aKeyCheck = true;
aMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(-TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->runAction(action_1);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_D:{
dKeyCheck = true;
dMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->runAction(action_1);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_E:{
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos);
int tileGid = _meta->tileGIDAt(tileCoord);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Eat"].asString();
if (propertyValue.compare("True") == 0) {
_meta->removeTileAt(tileCoord);
_tree->removeTileAt(tileCoord);
}
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_S:
{
sKeyCheck = true;
sMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(0, -TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->runAction(action_1);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_W:
{
wKeyCheck = true;
wMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(0, TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->runAction(action_1);
break;
}
default:
break;
}
}
이처럼 키보드의 각 키의 경우 마다 실행할 조건들을 넣어주면 된다.
void onKeyPressed(EventKeyboard::KeyCode keyCode, Event *event);
void onKeyReleased(EventKeyboard::KeyCode keyCode, Event *event);
해주고
cpp 에서 init 함수에
auto keylistener = EventListenerKeyboard::create();
keylistener->onKeyPressed = CC_CALLBACK_2(HelloWorld::onKeyPressed, this);
keylistener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(keylistener, this);
해준다. onKeyPressed,onKeyReleased 함수가 필요함으로
void HelloWorld::onKeyReleased(EventKeyboard::KeyCode keyCode, Event *event){
auto sprPlayer = (Sprite*)this->getChildByTag(TAG_SPRITE_PLAYER);
switch (keyCode)
{
case cocos2d::EventKeyboard::KeyCode::KEY_A:{
aKeyCheck = false;
aMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->getActionManager()->removeAction(action);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_D:{
dKeyCheck = false;
dMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->getActionManager()->removeAction(action);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_S:
{
sKeyCheck = false;
sMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->getActionManager()->removeAction(action);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_W:
{
wKeyCheck = false;
wMoveCheck = false;
auto action = (Action*)sprPlayer->getActionByTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->getActionManager()->removeAction(action);
break;
}
default:
break;
}
}
void HelloWorld::onKeyPressed(EventKeyboard::KeyCode keyCode, Event *event){
auto sprPlayer = (Sprite*)this->getChildByTag(TAG_SPRITE_PLAYER);
switch (keyCode)
{
case cocos2d::EventKeyboard::KeyCode::KEY_A:{
aKeyCheck = true;
aMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(-TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_A);
sprPlayer->runAction(action_1);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_D:{
dKeyCheck = true;
dMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(TAG_SPRITE_PLAYER_SPEED, 0));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_D);
sprPlayer->runAction(action_1);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_E:{
CCPoint playerPos = sprPlayer->getPosition();
CCPoint tileCoord = this->tileCoordForPosition(playerPos);
int tileGid = _meta->tileGIDAt(tileCoord);
auto properties = _tileMap->propertiesForGID(tileGid);
ValueMap map = properties.asValueMap();
String propertyValue = map["Eat"].asString();
if (propertyValue.compare("True") == 0) {
_meta->removeTileAt(tileCoord);
_tree->removeTileAt(tileCoord);
}
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_S:
{
sKeyCheck = true;
sMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(0, -TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_S);
sprPlayer->runAction(action_1);
break;
}
case cocos2d::EventKeyboard::KeyCode::KEY_W:
{
wKeyCheck = true;
wMoveCheck = true;
auto action_0 = MoveBy::create(0.1, Point(0, TAG_SPRITE_PLAYER_SPEED));
auto action_1 = RepeatForever::create(action_0);
action_1->setTag(TAG_SPRITE_PLAYER_ACTION_W);
sprPlayer->runAction(action_1);
break;
}
default:
break;
}
}
이처럼 키보드의 각 키의 경우 마다 실행할 조건들을 넣어주면 된다.
2015년 1월 10일 토요일
cocos2d-x tiled를 이용한 타일게임 제작 -cocos2d-x 에 타일맵에 플레이어 올리기
cocos에 타일맵을 띄우는 것을 성공했다면 이제 플레이어를 올려보자.
우선 플레이어 이미지를 Resources 폴더에 추가 한 후
잠깐 코드를 보자. 우선 플레이어를 띄우는 것은 간단하다.
_player = Sprite::create("TileGameResources/Player.png");
_player->setPosition(Point(x, y));
this->addChild(_player);
헤더에 _player를 선언해준후 위와 같이 cpp에 쓰면 된다. 하지만 setPosition(Point(x, y)) 에
들어갈 x,y좌표가 필요하다. 이것은 시작점이다. 그냥 정하면 되기도 하지만 이번에는 타일맵
에서 좌표값을 가져와서 해보자.
우선 tiled를 켜서 tmx파일을 열어보자. 그후 object layer를 하나 추가하자,
레이어 이름은 object로 하였다.
그후 상단의 네모 도구를 이용하여 영역을 정한뒤 오브젝트 이름을 SpawnPoint라고 정한다.
그후 _player를 만들기전에
CCTMXObjectGroup *objectGroup = _tileMap->objectGroupNamed("Object");
if (objectGroup == NULL){
CCLog("tile map has no objects object layer");
return false;
}
ValueMap spawnPoint = objectGroup->getObject("SpawnPoint");
int x = spawnPoint["x"].asInt();
int y = spawnPoint["y"].asInt();
이렇게 함으로써 x,y좌표를 알 수 있고 플레이어의 포지션을 선택 할 수 있게 되었다.
플레이어가 생성된 모습은 다음과 같다.
우선 플레이어 이미지를 Resources 폴더에 추가 한 후
잠깐 코드를 보자. 우선 플레이어를 띄우는 것은 간단하다.
_player = Sprite::create("TileGameResources/Player.png");
_player->setPosition(Point(x, y));
this->addChild(_player);
헤더에 _player를 선언해준후 위와 같이 cpp에 쓰면 된다. 하지만 setPosition(Point(x, y)) 에
들어갈 x,y좌표가 필요하다. 이것은 시작점이다. 그냥 정하면 되기도 하지만 이번에는 타일맵
에서 좌표값을 가져와서 해보자.
우선 tiled를 켜서 tmx파일을 열어보자. 그후 object layer를 하나 추가하자,
레이어 이름은 object로 하였다.
그후 상단의 네모 도구를 이용하여 영역을 정한뒤 오브젝트 이름을 SpawnPoint라고 정한다.
CCTMXObjectGroup *objectGroup = _tileMap->objectGroupNamed("Object");
if (objectGroup == NULL){
CCLog("tile map has no objects object layer");
return false;
}
ValueMap spawnPoint = objectGroup->getObject("SpawnPoint");
int x = spawnPoint["x"].asInt();
int y = spawnPoint["y"].asInt();
이렇게 함으로써 x,y좌표를 알 수 있고 플레이어의 포지션을 선택 할 수 있게 되었다.
플레이어가 생성된 모습은 다음과 같다.
2015년 1월 8일 목요일
cocos2d-x tiled를 이용한 타일게임 제작 -cocos2d-x 에 타일맵 적용하기
tiled로 tmx파일을 만들었다면 다음과 같이 하면 된다.
tmx 파일과 이미지 파일을 Resources 폴더에 넣은 뒤
우선 헤더 파일(.h)에 선언
CCTMXTiledMap *_tileMap;
CCTMXLayer *_background;
cpp에서는
_tileMap = CCTMXTiledMap::create("TileGameResources/TileMap.tmx");
_background = _tileMap->layerNamed("Background");
this->addChild(_tileMap);
컴파일하면
tmx 파일과 이미지 파일을 Resources 폴더에 넣은 뒤
우선 헤더 파일(.h)에 선언
CCTMXTiledMap *_tileMap;
CCTMXLayer *_background;
cpp에서는
_tileMap = CCTMXTiledMap::create("TileGameResources/TileMap.tmx");
_background = _tileMap->layerNamed("Background");
this->addChild(_tileMap);
컴파일하면
2015년 1월 7일 수요일
cocos2d-x tiled를 이용한 타일게임 제작 -Tiled 설치 및 사용하기
http://www.raywenderlich.com/39113/cocos2d-x-tile-map-tutorial-part-1/
이곳을 상당히 인용하여 올리는 글임.
tiled로 tmx 파일을 만든후 이것을 이용하여 cocos2d-x에 맵과 여러 기능을 활용할 것임.
Tiled 주소
http://www.mapeditor.org/
간단히 Download 하면 끝.
tiled 실행후 new 클릭
맵크기와 타일 크기를 조절 할 수 있고 맵 형태를 선택 할 수도 있고
다양한 기능이 있음.
이제 tileset 으로 이미지를 불러옴
각각 타일 설정을 하고 누르면 완료
신나게 맵 만들면 기본 맵은 완성!
레이어 이름은 cocos2d-x에서 사용할것이니 잘 바꿔준다.
tiled도 툴이라 익숙해져야 함
나머지 자세한 기능은 게임 만들면서 올림
이곳을 상당히 인용하여 올리는 글임.
tiled로 tmx 파일을 만든후 이것을 이용하여 cocos2d-x에 맵과 여러 기능을 활용할 것임.
Tiled 주소
http://www.mapeditor.org/
간단히 Download 하면 끝.
tiled 실행후 new 클릭
맵크기와 타일 크기를 조절 할 수 있고 맵 형태를 선택 할 수도 있고
다양한 기능이 있음.
이제 tileset 으로 이미지를 불러옴
각각 타일 설정을 하고 누르면 완료
신나게 맵 만들면 기본 맵은 완성!
레이어 이름은 cocos2d-x에서 사용할것이니 잘 바꿔준다.
tiled도 툴이라 익숙해져야 함
나머지 자세한 기능은 게임 만들면서 올림
피드 구독하기:
글 (Atom)