adsense



블로그 주인장 & 블로그 소개입니다.


구글 플레이스토어 절찬 다운로드 중!
















----------------------------------------------------------------------------

(게임 아이콘을 클릭하면 이동합니다)


※모에키퍼HD는 원스토어에서 다운받을 수 있습니다.

--------------------------------------

주인장은..


이어지는 내용

피규어라이즈 라보 후미나 가조립


어떤 식으로 완성시킬 것인가, 감을 잡기 위해 일단 가조립부터 해 봤습니다.

분해하기 쉽도록 접합핀류는 모두 비스듬하게 잘라주거나 갈아서 조금 헐겁게 만들어 줬습니다.
나중에 완성시킬때는 접착을 해 줘야겠죠.

레이어드 인젝션이나 수영복의 그로스 인젝션 때문에 게이트 제거에 신중을 기할 필요가 있겠고,
팔에는 레이어드 인젝션이 적용되지 않아서 얼마간의 추가 도색은 필요할 것 같습니다.
볼터치도 조금 추가해주면 좋겠고요.

베이스쪽은 입체감을 의도해서 물결에 클리어블루 등으로 도색을 추가할 생각이고,
대체로는 게이트 자국만 웬만큼 커버할 수 있으면 많이 손대지 않고 완성할 수 있겠네요.

가장 고민되는 부분은, 접합선이 휑한 머리카락.
머리카락부분은 게이트도 많고 파팅라인도 만져줘야 해서 아무래도 풀도색 들어가야 할 듯 합니다.

-----------------------------------------------------------------

박스 구조가 특이하네요. 건프라에서 이런식의 박스는 못 본 것 같은데.



부품은 굵직굵직합니다. 다리같은 건 무게도 제법 PVC 수준으로 나가요.
부품 갯수는 적어 보이지만 레이어드 인젝션임을 생각하면 실제로는 두 배 가까운 볼륨이라고 봐도 되겠죠.



가장 입체감이 뛰어나고 레이어드 인젝션의 효과도 잘 느껴지는 부분은 복근이라고 생각됩니다.
빛의 입사에 따라서 표피 밑의 붉은색이 비쳐보이는 정도가 달라져서 멋집니다.
단지 얼굴 방향이 옆을 향하고 있어 시선을 맞추면서 복근을 같이 보기 어려운 포즈인게 좀 아쉽습니다.


조형에 게이트의 위치나 파팅라인 등이 반영되어야 하는 점을 감안하면 시험작 정도로 끝나고 시리즈로 계속 이어지기는 어려울 듯한 느낌입니다.


홈페이지를 새단장했습니다

1인 개발 게임 소개 사이트를 싹 리뉴얼했습니다. 홈페이지 만드는 것도 정말 오랜만..



사실 별로 볼 건 없습니다.. ^^;
그래도 주소 얻어놓고 너무 방치한데다가 밖에 나가서 게임 소개 좀 보여달랠 때 보일게 너무 없어서 이거라도 해야지 싶어서.

주소는 아래와 같습니다.

G GAME 홈페이지 : http://g-gameplay.com


[cocos2d-x] 심플&범용 팝업 클래스

첨부파일 : Popup_example.zip

헤더
#ifndef __POPUP_LAYER_H__
#define __POPUP_LAYER_H__

#include "cocos2d.h"

USING_NS_CC;

using namespace std;


class PopupLayer : public cocos2d::Layer
{
public:
static PopupLayer* create();

virtual bool init();


//콜백 등록/호출을 위한 함수
typedef std::function<void(int)> FUNC;//함수 형태를 정의합니다. 인수는 필요한 형태로 설정
FUNC _func;
void regi_func(FUNC pFunc);//팝업을 생성한 쪽에서 콜백을 등록합니다

void menuCB(int);
};

#endif // __POPUP_LAYER_H__



클래스
#pragma execution_character_set("utf-8")
#include "PopupLayer.h"
#include "ui\CocosGUI.h"


USING_NS_CC;
using namespace std;
using namespace ui;

PopupLayer* PopupLayer::create()
{
PopupLayer* layer = new PopupLayer();



if (layer->init())

{

return layer;

}



CC_SAFE_DELETE(layer);

return NULL;

}

// on "init" you need to initialize your instance
bool PopupLayer::init()
{
if ( !Layer::init() )
{
return false;
}

/*
1. 화면 구성
2. 버튼 설정 및 콜백 호출
3. 팝업 레이어가 아래로 내려가는 터치를 삼키는 처리
*/


auto visibleSize = Director::getInstance()->getVisibleSize();
auto origin = Director::getInstance()->getVisibleOrigin();

//1. 화면 구성
auto white = Sprite::create("white.png");
white->setPosition(visibleSize * 0.5f);
white->setColor(Color3B::BLACK);
white->setOpacity(128);
white->setScale(20);
addChild(white);

auto popbase = Scale9Sprite::create("popbase.png");

popbase->setCapInsets(Rect(19, 19, 90, 72));
popbase->setPosition(visibleSize * 0.5f);
popbase->setContentSize(Size(500, 700));
addChild(popbase);

//2.버튼용 콜백 설정
//콜백은 람다, 콜백객체, 콜백함수 등 여러가지로 만들어 적용할 수 있으니
//필요에 따라 적당한 서식으로 해 줍니다
auto callback = ([=](Ref* sender, Widget::TouchEventType type) {

Button* node = dynamic_cast<Button*>(sender);
switch (type)

{

case Widget::TouchEventType::BEGAN:

node->setColor(Color3B(128, 128, 128));

break;

case Widget::TouchEventType::MOVED:

break;

case Widget::TouchEventType::ENDED:

node->setColor(Color3B::WHITE);

//CCLOG("%d", node->getTag());

menuCB(node->getTag());

break;

case Widget::TouchEventType::CANCELED:

node->setColor(Color3B::WHITE);

break;

}

});


//OK버튼
auto okbutton = Button::create("buttonstart.png", "buttonstart.png", "buttonstart.png", Widget::TextureResType::LOCAL);
okbutton->setPosition(Vec2(visibleSize.width * 0.5f - 120, visibleSize.height - 800));
okbutton->setSwallowTouches(true);
okbutton->addTouchEventListener(callback);
okbutton->setTag(2);
okbutton->setTitleText("OK");
okbutton->setTitleFontSize(64);
okbutton->setScale(0.5f);
addChild(okbutton);

//NO버튼
auto backbutton = Button::create("buttonstart.png", "buttonstart.png", "buttonstart.png", Widget::TextureResType::LOCAL);
backbutton->setPosition(Vec2(visibleSize.width * 0.5f + 120, visibleSize.height - 800));
backbutton->setTag(3);
backbutton->setSwallowTouches(true);
backbutton->addTouchEventListener(callback);
backbutton->setTitleText("NO");
backbutton->setTitleFontSize(64);
backbutton->setScale(0.5f);
addChild(backbutton);


//3.레이어 전체에 터치리스너를 걸고,
//setSwallowTouches(true) 하여 아래로 내려가지 못하도록 막아줍니다
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [=](Touch* touch, Event* event) {
return true;
};
listener->onTouchEnded = [=](Touch* touch, Event* event) {
log("swallowed by popup");
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

return true;
}


void PopupLayer::menuCB(int tag)
{
switch (tag)
{
case 0:
break;
case 1:
break;
case 2:
_func(0);//팝업 호출시 등록된 콜백을 호출하여 선택된 값을 되돌려 줍니다.
removeFromParent();
break;
case 3:
_func(1);//팝업 호출시 등록된 콜백을 호출하여 선택된 값을 되돌려 줍니다.
removeFromParent();
break;
}
}
void PopupLayer::regi_func(FUNC pFunc)
{
//팝업 호출시 콜백함수를 등록합니다.
_func = std::move(pFunc);
}



사용방법
            //팝업레이어를 생성해 올립니다
auto popup = PopupLayer::create();

//팝업에서 호출할 콜백을 등록합니다
popup->regi_func([=](int ret) {
log("popup return %d", ret);
((Label*)getChildByName("LABEL"))->setString(StringUtils::format("POPUP returned %d", ret));
});

//붙이는 방법은 어느것이라도
Director::getInstance()->getRunningScene()->addChild(popup, 1);
//this->addChild(popup, 1);




실행예

[cocos2d-x] UserData 활용

그동안 이런게 있는 줄 모르고,
추가적인 파라미터(HP, 공격력, 방어력, 드롭템 등)가 필요한 경우가 있으면
Sprite를 상속하는 클래스를 별도로 만들어서 써 왔는데요,

BOX2D공부하면서 바디에 연결된 스프라이트를 userData로 지정하는 걸 보다보니, 어 이런 비슷한 api 일반 Node에서도 본 것 같은데?

해서 찾아보니 있길래, 이렇게 쓰면 될려나? 싶어서 해 보니,

되네요..

이정도면 어지간해서는 굳이 클래스를 새로 만들지 않아도 되겠습니다.
그동안 내 나쁜 머리 때문에 고생한 몸과 코드에게 리스펙.


예를 들어 아래와 같은 구조체가 있다고 하면
typedef struct _ATTR {
int hp;
int drop;
} ATTR;



- ATTR 구조체를 setUserData를 통해 스프라이트 객체에 연결하고
- 불러내서 사용하고(값 변경 등)
- 스프라이트와 함께 삭제하기
    //적용
{
auto sprite = Sprite::create("character.png");
sprite->setPosition(0, 0);

ATTR* attr = new ATTR;
attr->hp = 10;
attr->drop = 0;
sprite->setUserData(attr);
this->addChild(sprite);
}

//사용
{
ATTR* attr = (ATTR*)sprite->getUserData();
attr->hp = attr->hp - 1;
int dropItem = attr->drop;
}

//제거
{
ATTR* attr = (ATTR*)sprite->getUserData();
CC_SAFE_DELETE(attr);
sprite->removeFromParent();
}




이번에는 자료형만 연결해 봤는데,

혹시 구조체에다가 std::function 정의하고 콜백처럼 로직 등록해서 써도 되..지 않을까요?
이건 되나 안되나 해보고 다음에..

1 2 3 4 5 6 7 8 9 10 다음


Books

Geek라이프

게임 매니악스 슈팅 게임 알고리즘
마츠우라 켄이치로,츠카사 유키 공저/손정도 역/박민근,Pope Kim 감수

게임 매니악스 퍼즐 게임 알고리즘
마츠우라 켄이치로,츠카사 유키 공저/김병국 역

만들면서 배우는 유니티 게임 프로그래밍
송용성 저

핵심강좌! Cocos2d-x
이재환 저

될 수 있어! SE 7
나츠미 코지 저/Ixy 그림/김경훈 역
예스24 | 애드온2