오늘은 구글 인디게임 페스티벌에 다녀왔다.

참가자로 다녀오고 싶었으나..

군인이라는 신분으로 인해 올해는 투표자로 다녀왔다.

가기전에 많은 도움을 얻을 수 있으리라 생각했지만

생각했던 것 보다 더 많은 정보와 열정을 받아온 것 같다.

내년에는 꼭 참가자로 다녀오도록 하겠다.


'All > Project' 카테고리의 다른 글

튜토리얼 완료  (0) 2017.04.17
9XD 개발자모임  (0) 2017.04.15
튜토리얼  (0) 2017.04.13
그림  (0) 2017.04.11
그림  (0) 2017.04.09

오늘까지 튜토리얼 개발했고, 완료했다. 

후... 이제 캐릭터 연출 관련하여 개발을 해야할 것 같다.


다음 목표

- 캐릭터를 뽑는 연출

- 타이틀을 얻었을 때의 연출과 보상을 받았을 때 연출

- 최고기록 및 친구랭킹을 이겼을때 연출

- 일주일에 한번씩 랭킹 초기화 후 연출  



'All > Project' 카테고리의 다른 글

구글 인디게임 페스티벌  (0) 2017.04.25
9XD 개발자모임  (0) 2017.04.15
튜토리얼  (0) 2017.04.13
그림  (0) 2017.04.11
그림  (0) 2017.04.09

오늘은 9XD 개발자모임에 참가했다.

무려 선착순 2등을 하며 참가자격을 얻었다!! 

생각했던 것 보다 더 고퀄의 강연이었어서 좀 놀랐고 서포터가 데브여서 한번 더 놀랐다.

강연 중 생각나는 것이 데브 서버개발자 분께서 발표하신 GraphQL에 대한 내용이었는데 

페이스북 SDK를 작업하면서도 그래프 API에 대한 편함을 경험한 바 있어서 크게 공감했던 것 같다.

시간을 내어서 지금 구글에 저장하고 있는 유저데이터를 AWS의 DynamoDB 에 사용하면서 GraphQL을 이용하면 좋은 것같다.

그때를 위해 검색해본 URL을 남긴다.


GraphQL 설명 : http://blog.sapzil.org/2015/09/01/graphql-rfc/

GraphQL Parser github : https://github.com/graphql/libgraphqlparser

GraphQL Serverless framework github : https://github.com/serverless/serverless-graphql-blog

GraphQL Explorer : https://graphql-tryout.herokuapp.com/graphql?query=&operationName=undefined

'All > Project' 카테고리의 다른 글

구글 인디게임 페스티벌  (0) 2017.04.25
튜토리얼 완료  (0) 2017.04.17
튜토리얼  (0) 2017.04.13
그림  (0) 2017.04.11
그림  (0) 2017.04.09

이번에 작업한 것은 튜토리얼이다.

일전에 회사에서 튜토리얼 관련된 코드를 본적이 있었는데 

아무런 생각과 대책없이 튜토리얼을 구현하면 이렇게도 구현할 수 있구나 싶었다.

온갖 조건문과 예외처리 코드가 스파게티처럼 꼬여있어서 새로운 스텝을 추가하기도 수정하기도 쉽지 않았던 기억이 있다.


아무튼 이런 저런 이유로 알기 쉽고 수정과 관리가 용이하게 구현하려 노력했다. 

또 비디오나 스프라이트가 아닌, 사용자 반응형 튜토리얼을 구현하려 했다.

완벽하게 끝이 난것은 아니지만 정리해서 포스팅 해보겠다. ( 원래 리펙토링은 끝이 없기에.. )


먼저 관련 클래스는 3 가지로 나뉜다.

- TutorialManager

- TutorialStep

- TutorialHelper

간단하게 설명하자면 TutorialStep 이 모여 하나의 Tutorial이 된다.

예를들어 처음 플레이 하는 유저가 게임 방법에 대한 튜토리얼을 진행한다면 

"BEGINER_TUTORIAL"이라는 Key를 사용하는 TUTORIAL 아래 1 ~ 3의 STEP이 추가된다.


Step 1. "시작버튼을 누르세요" 라는 메시지 박스 출력

Step 2. "화면을 터치하면 캐릭터가 움직입니다."라는 메시지 박스 출력

Step 3. 유저가 화면을 터치하면 캐릭터가 움직이고 "잘하셨습니다!!"라는 메시지 박스 출력 


위와같은 방식으로 총 59 STEP으로 이루어진 BEGINER 튜토리얼을 구성했다.


               


       

또 설정 팝업에 추가하여 언제든 튜토리얼을 다시 할 수 있도록 하였다.




'All > Project' 카테고리의 다른 글

튜토리얼 완료  (0) 2017.04.17
9XD 개발자모임  (0) 2017.04.15
그림  (0) 2017.04.11
그림  (0) 2017.04.09
지금까지 개발된 내용  (0) 2017.04.08

오늘도 퇴근한 후 약간의 버그 수정을 한 후 그림을 그렸다.

미세하지만 어제보다 실력이 좋아진듯하다(?)

행성과 어울리는 크리스탈 미사일이다.

    



        

작은 화면에서는 뭔가 알루미늄처럼 보이긴 하지만 그럭저럭 쓸만한 것 같다. 

'All > Project' 카테고리의 다른 글

9XD 개발자모임  (0) 2017.04.15
튜토리얼  (0) 2017.04.13
그림  (0) 2017.04.09
지금까지 개발된 내용  (0) 2017.04.08
Laviah  (0) 2017.04.08

오늘은 그림을 그려보았다. 

처음에는 어색했던 포토샵도 이제는 제법 다룰줄 알게 되었다.

물론 결과물이 만족스럽지는 않지만 점점 나아질 것으로 기대된다.



기본행성이 될 듯 하며 이제 총알과 미사일을 그리면 될 듯하다. 

'All > Project' 카테고리의 다른 글

튜토리얼  (0) 2017.04.13
그림  (0) 2017.04.11
지금까지 개발된 내용  (0) 2017.04.08
Laviah  (0) 2017.04.08
매주 일요일 랭킹 초기화  (0) 2017.04.05

1. 메뉴 화면

아이콘 부터 그림까지 하나하나 다 혼자 하려니 별거 아닌 일도 오래 걸렸다.


2. 캐릭터 선택창

일반 캐릭터의 경우 어둡게 보이고 레어 캐릭터의 경우엔 검은 음영으로 처리되어 있다.


3. 페이스북 랭킹 창

랭킹은 일주일에 한번 초기화 되는데 어디에 표시할 지 고민중이다.


4. 아이템의 기본 스텟을 올릴수 있는 창 

유아이들도 다 더미라서 바꿔야하는데... 그래픽은 다 돈이다.


5. 옵션 창

옵션창에는 오디오, 데이터 저장, 언어 선택, 획득한 타이틀 등을 확인 할 수 있다.

      


6. 게임을 진행하고 있는 화면이다.

좌측상단에 점수와 코인 UI가 있다.

우측상단에는 페이스북을 연동한 경우에만 플레이어의 다음 목표가 되는 친구의 점수가 위치해 있다.


7. 일시정지 화면

게임 중 달성할 수 있는 작은 목표가 중앙에 위치하며 좌측 상단에 홈으로 가기, 다시하기 버튼이 위치한다.

아래에는 게임을 종료할수 있는 버튼과 게임으로 돌아가기 버튼이 있다.


8. 결과 화면

최종 점수와 나의 최고 점수를 보여 준다.



여기까지가 지금까지 개발된 화면 구성이다.

게임 플레이도 영상으로 올리고 싶지만.. 

안타깝게도 동영상을 찍을 수 있는 형편이 되질 않아 다음을 기약 해야겠다.

'All > Project' 카테고리의 다른 글

그림  (0) 2017.04.11
그림  (0) 2017.04.09
Laviah  (0) 2017.04.08
매주 일요일 랭킹 초기화  (0) 2017.04.05
UI_ HealthBarUI  (0) 2016.04.12

앞으로 남은 계획을 한번 나열해보자.


1. 게임 중에 깜짝 캐릭터를 얻는 시스템이 있었으면 좋겠다.

2. 캐릭터를 뽑는 연출이 필요하다. 

3. 타이틀을 얻었을 때 보상을 주는 연출이 필요하다.

4. 게임안에서 스크린샷을 찍고 카톡 등으로 공유할 수 있어야 한다.

5. 최고기록을 냈을 때 연출이 필요하다.
6. 유저데이터를 암호화 해야 한다.

7. 네트워크가 연결되지 않았을 경우에 유니티 광고를 보려고 할때의 처리가 필요하다.

8. 인앱결제가 필요하다.

9. 구글 로그인시 유저 데이터를 받아오는데 로컬에 저장되어있는 정보와 다른 계정일 경우 처리가 필요하다.

10. BGM 및 효과음이 필요하다.

11. 피버 및 연속 피버가 들어가면 재밌지 않을까 생각중이다.

12. 행성마다 다른 스테이지가 존재하면 각각 클리어 하는 재미가 있지 않을까 생각중이다.


여기까지가 그동안 Wunderlist로 관리하던 남은 일정이고 이외에도 아직 더미로 사용하고 있는 데이터들이 많이 있다.

이것들도 차츰 실데이터로 변경해야 할 것 같다.


여기까지 하고 내일은 지금까지 개발한 게임의 동영상이나 스크린샷 정도는 올려도 좋을 것 같다.

'All > Project' 카테고리의 다른 글

그림  (0) 2017.04.09
지금까지 개발된 내용  (0) 2017.04.08
매주 일요일 랭킹 초기화  (0) 2017.04.05
UI_ HealthBarUI  (0) 2016.04.12
UI_ MyButton  (0) 2016.04.12
매주 랭킹을 초기화 해야한다.
좋은 방법이 없을까

- 일단 페이스북에서 제공하는 API가 있다.

앱의 모든 점수 삭제

해당 앱의 앱 access_token으로 /APP_ID/scores에 대한 HTTP DELETE 요청을 실행하여 앱의 모든 점수를 삭제할 수 있습니다.
그러면 앱의 점수를 재설정합니다. 게임 점수 및 리더보드를 주기적으로 재설정하려 할 때 사용하세요.

응답은 다음과 같습니다.

설명
유형

삭제 성공 여부에 따라 true 또는 error

boolean


이 API를 이용하면 될 것 같은데 일주일에 한 번 서버자체로 해당 코드를 실행 시키도록 해야할 것 같다. 
해당 기능은 스케줄러를 이용해서 구현할 수 있다고 하여 관련 포스트를 찾아 보았다. 출처: http://webinformation.tistory.com/6 [끄적끄적]

Crontab

[분] [시] [일] [월] [요일] [실행하고자 하는 명령어]

분(0~59), 시(0~23), 일(1~31), 요일 (1~7{월~일})

위와 같은 구조로 실행하고자 하는 명령어를 예약할 수 가 있으며, crontab 을 사용하는 방법에는 두가지가 있습니다.

vim /etc/crontab 을 이용해서 예약하기

[root@localhost ~]# vim /etc/crontab


* 01 */1 * * /usr/local/bin/php -f /home/user/sync.php


위 명령어는 매일 새벽 1시에 sync.php 파일이 실행되도록 한 것입니다.

:wq 명령어를 이용해서 저장하고 나오시면 끝!

해당 방법은 별도의 추가 작업이 필요없으며 그냥 저장하고 나오시면 자동으로 적용이 됩니다.

crontab -e 를 이용해서 예약하기

[root@localhost ~]# crontab -e


* 01 * * 1 /usr/local/bin/php -f /home/user/sync.php


위 명령어는 월요일 새벽 1시에 sync.php 파일이 실행되도록 한 것입니다.

:wq 명령어를 이용해서 저장하고 나오시면 끝!

해당 방법은 아래와 같은 실행 및 재 시작의 명령어를 추가로 수행해야 합니다.

실행, 종료, 재 시작 명령어

[root@localhost ~]# /etc/rc.d/init.d/crond start
[root@localhost ~]# /etc/rc.d/init.d/crond stop
[root@localhost ~]# /etc/rc.d/init.d/crond restart

위의 내용을 참고하여 일단 테스트로 * * * * * sh /game/project/test.sh  라고 
저장하였다. test.sh엔 
echo "Hello World" > hello.txt
가 저장되어있다.

예상대로라면 1분마다 Hello World라고 hello.txt 에 저장해야하는데 아무런 변화가 없다.
crontab -l 을 실행해보니 “no crontab for root” 라고 나온다. 

서치결과 "crontab -u root -e” 명령어로 새로운 크론탭을 적용했다.
다시 crontab -l 을 실행하니 제대로 * * * * * sh /game/project/test.sh 가 나왔다. 

cat /var/log/cron을 실행해보니 뭔가 1분마다 동작하고 있었지만 
여전히 hello.txt파일은 존재하지 않았다. 경로가 잘못된 듯하여 home을 기준으로 절대 경로를 삽입하였다.

* * * * * sh home/user/game/project/test.sh  잘된다.

이어서 일요일에 1번 실행시키기 위해 59 23 * * * php /home/user/game/project/resetRanking.php 를 설정했다.
이제 페이스북 랭킹을 초기화하는 로직만 작성하면된다.


랭킹 초기화하는 페이스북 API 호출하기

먼저 페이스북 PHP SDK를 깔아야한다. 안에 있는 src폴더를 서버에 복사한다.
그리고 mbstring 이라는 php모듈? 을 설치한다. (sudo yum install php56-mbstring) php 버전에 따라 다르게 설치한다. 이것때문에 한참을 해맸다.

이후에 유저 전체의 스코어를 모두 초기화 하는 스크립트를 구현하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    error_reporting(E_ALL);
 
    ini_set("display_errors"1);
 
    require_once __DIR__ . '/php-graph-sdk-5.0.0/src/Facebook/autoload.php';
 
    $fb = new Facebook\Facebook(['app_id' => ‘xxx',
                                'app_secret' => ‘xxx',
                                'default_graph_version' => ‘xxx']);
    $fbApp = $fb->getApp();
    $fb->delete('/app/scores/', [], $fbApp->getAccessToken());
cs
 

사실 위의 app accesstoken을 어디서 어떻게 가져와야 할지 몰라 한참을 해맸다.
결국 잘되는 것을 확인했다.

이제 웹에서  경로를 통해 php를 실행하는 것을 막아야한다. ( 웹에서 누구나 접근하여 게임의 스코어를 날릴수 있다면 큰일이다. )
여러 방법이 있겠지만  
웹에서 접근하지 못하는 경로에 추가하였다.


'All > Project' 카테고리의 다른 글

지금까지 개발된 내용  (0) 2017.04.08
Laviah  (0) 2017.04.08
UI_ HealthBarUI  (0) 2016.04.12
UI_ MyButton  (0) 2016.04.12
별게임의 상태트리  (0) 2016.04.12

개요

체력 계산 함수를 외부에 구현하고 CHealthBarUI에서는 함수포인터만 전달하여 호출하는 식으로 구현했습니다. 

처음엔 체력계산 함수를 Player의 virtual function으로 구현 하였습니다.

하지만 이후 캐릭터마다 체력계산 함수의 종류나 계산 방식 등이 다를 수 있을 것이라 생각하였고 

Strategy Pattern을 적용하게 되었습니다.

또 계산식에서 필요한 private변수들이 많아질 것으로 예상하였습니다. 

때문에 클래스나 구조체로 구현하여 Player의 인스턴스를 전달하는 Strategy Pattern의 전형적인 방식을 사용하기보다는 

Player의 함수 포인터를 사용하는 식으로 변형하였습니다.

추상클래스로 인터페이스를 제공하는 장점을 버리게 되었지만 private변수 참조 용이, 은닉화의 장점을 취할 수 있었습니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*-----------------------CHealthBarUI--------------------------
 * strategy pattern
 * 같은 캐릭터라도 다른 체력계산함수를 사용할 수 있도록 구현
 * 때문에 캐릭터에서 virtual 함수로 구현하지 않고 strategy pattern을 이용
 * 차후에 다른캐릭터로 이어달리기 등의 기능을 구현할때 용이함
 * (자세한 것은 player클래스 참조)
 * Lambda혹은 함수포인터, 함수객체를 인자로 받는다.
 * CHealthBarUI는 철저히 UI만 표현한다.
 * ------------------------------------------------------------*/
 
 
 
 
/* 캐릭터마다의 체력계산함수 포인터 전달 */
static CHealthBarUI* create(HealthCalculatorFunc healthCalFunc);
 
 
/* 플레이중 버프나 보너스 타임때 계산 함수 변경가능위해 */
void ChangeHealthCalFunc(HealthCalculatorFunc healthCalFunc);    
 
 
/* ProgressBar Update 
 * m_HealthCalculatorFunction에 들어있는 함수 호출 */
void UpdateHealthUI(float delta);
{
    float percent = m_HealthCalculatorFunction(delta);
    m_HealthBar->setPercentage(percent);
}
 
/* HealthFunc 타입 정의 */
typedef std::function<float(float delta)> HealthCalculatorFunc;
 
 
/* HealthBarUI 생성 시 캐릭터의 원하는 체력계산함수 호출을 위해 
 * 체력계산함수 포인터 전달  */
HealthCalculatorFunc m_HealthCalculatorFunction;
cs

CHealthBarUI 클래스의 주요 함수 및 동작원리 설명

1. UI생성 시 캐릭터의 체력계산 함수포인터를 전달합니다.

2. 때문에 사용자는 캐릭터의 종류에 따라 원하는 체력계산 함수를 모두 정의 할 수 있습니다.

3. ChangeHealthCalFunc함수를 통해 호출되는 함수를 변경할 수 있습니다.


사용 예

1
2
3
4
auto healthBar = CHealthBarUI::create(
        std::bind(&CPlayer::HealthCalculatorInNormal, 
        CObjectManager::Instance()->getPlayer(), 
        std::placeholders::_1));
cs

1. 체력 계산 함수로써 Player의 HealthCalculatorInNormal()함수를 호출하는 HealthBarUI를 생성

2. std::placeholders::_1 : 함수 호출 시 전달하는 매개변수는 함수를 호출하는 장소에서 전달하는 값으로 사용한다는 의미입니다.

3. 여기서는 deltaTime을 전달합니다.



귀차니즘을 위한 2줄 요약

1. HealthBarUI는 UI만 표현하고 계산 함수는 캐릭터가 가지고 있다.

2. HealthBarUI를 생성할 때 캐릭터의 함수를 인자로 전달하면된다.

3. ChangeHealthCarFunc()로 계산 함수를 변경할 수 있습니다.

'All > Project' 카테고리의 다른 글

Laviah  (0) 2017.04.08
매주 일요일 랭킹 초기화  (0) 2017.04.05
UI_ MyButton  (0) 2016.04.12
별게임의 상태트리  (0) 2016.04.12
AI_ FSM / State  (0) 2016.04.12

+ Recent posts