adsense



[cocos2d-x] JSON <-> ValueMap convert

/*Header*/
Value parseJSON2Value(rapidjson::Value& value);
ValueMap JSON2ValueMap(string jsonstr);
string parseValueMap2JSON(const Value& value);
string ValueMap2JSON(ValueMap vdata);
 
/*cpp*/
Value parseJSON2Value(rapidjson::Value& value)
{
switch (value.GetType())
{
case rapidjson::Type::kTrueType:
return Value(true);
break;
case rapidjson::Type::kFalseType:
return Value(false);
break;
case rapidjson::Type::kNullType:
return Value();
break;
case rapidjson::Type::kStringType:
return Value(value.GetString());
break;
case rapidjson::Type::kNumberType:
if (value.IsDouble())
return Value(value.GetDouble());
if (value.IsInt())
return Value(value.GetInt());
if (value.IsFloat())
return Value(value.GetFloat());
break;
case rapidjson::Type::kArrayType:
{
ValueVector _vector;
for (rapidjson::SizeType i = 0; i < value.Size(); i++)
{
auto _element = parseJSON2Value(value[i]);
_vector.push_back(_element);
}
return Value(_vector);
}
break;
}
 
return Value();
}
ValueMap JSON2ValueMap(string jsonstr)
{
ValueMap result;
 
rapidjson::Document d;
if (d.Parse(jsonstr.c_str()).HasParseError())
{
CCLOG("parse error %d", (int)(d.Parse(jsonstr.c_str()).GetParseError()));
return result;
}
//d is rapidjson::Type::kObjectType
for (auto it = d.MemberBegin(); it != d.MemberEnd(); ++it)
{
string _key = it->name.GetString();
auto _element = parseJSON2Value(it->value);
result[_key] = _element;
}
 
return result;
}
 
string parseValueMap2JSON(const Value& value)
{
string ret;
switch (value.getType())
{
case Value::Type::BOOLEAN:
ret = value.asBool() ? "true" : "false";
break;
case Value::Type::DOUBLE:
ret = SPRINTF("%f", value.asDouble());
break;
case Value::Type::FLOAT:
ret = SPRINTF("%f", value.asFloat());
break;
case Value::Type::INTEGER:
ret = SPRINTF("%d", value.asInt());
break;
case Value::Type::STRING:
ret = SPRINTF("%s", value.asString().c_str());
break;
case Value::Type::VECTOR:
{
ret = "[\n";
for (const auto val2 : value.asValueVector())
{
auto element = parseValueMap2JSON(val2);
ret += SPRINTF("%s,", element.c_str());
}
ret = ret.substr(0, ret.length() - 1);
ret += "\n]";
}
break;
}
 
return ret;
}
string ValueMap2JSON(ValueMap vdata)
{
string jsonwriter = "{\n";
 
for (auto& keyval : vdata)
{
string key = keyval.first;
const Value& val = keyval.second;
auto element = parseValueMap2JSON(val);
jsonwriter += SPRINTF("\"%s\":%s,\n", keyval.first.c_str(), element.c_str());
}
jsonwriter = jsonwriter.substr(0, jsonwriter.length() - 2);
jsonwriter += "\n}";
 
rapidjson::Document d;
if (d.Parse(jsonwriter.c_str()).HasParseError())
{
CCLOG("parse error %d", (int)(d.Parse(jsonwriter.c_str()).GetParseError()));
return "";
}
 
return jsonwriter;
}



JSON 문자열을 ValueMap으로 : JSON2ValueMap

ValueMap을 JSON 문자열로 : ValueMap2JSON

지원하는 자료형 : int, float, double, bool, string, array(ValueVector)

※ValueVector에 자료형을 섞어넣으면 변환된 JSON문자열은 파싱 에러가 납니다. 특히 number형은 int면 int, float면 float 명시 필요

주된 용도 : 게임 중에는 ValueMap으로 데이터를 관리하고, 서버에 데이타를 업로드 할 때는 JSON 문자열 하나로 만들어서 올리기

[매지카복셀+유니티3D] 에어울프


복셀에서 에어울프를 디자인


바디, 메인로터, 테일로터로 나누고 방향을 정렬


유니티에서 불러오고 로터의 위치를 맞춰준 후 스크립트 추가



♪두두두 ↗두두두 두↘두두 두두두♪

[cocos2d-x] ui 컴포넌트(Slider, CheckBox) 고유의 이벤트

슬라이더의 슬라이드 변경값을 실시간으로 체크하기

- gitbook의 용례를 보면 터치이벤트리스너를 사용하고 있는데, 이렇게 하면 슬라이드를 움직이고 있는 동안 값이 실시간으로 들어오지 않습니다.

- 슬라이드를 움직이는 동안 값을 계속 체크하려면 슬라이더 이벤트 리스너를 사용하는데, 3.17.x 이전 버전과 4.0에서 기술법이 크게 바뀌어서 정리해 둡니다.



//3.17.x under
{
auto slider = Slider::create();
slider->loadBarTexture(/*base texture*/);
slider->loadProgressBarTexture(/*progress texture*/);
slider->loadSlidBallTextures(/*ball normal, ball touched, bal disable, Widget::TextureResType*/);
slider->setPosition(/*Vec2*/);
addChild(slider);
 
slider->addEventListenerSlider(this, sliderpercentchangedselector(HelloWorld::changeSlider));
}
 
void HelloWorld::changeSlider(Ref* sender, SliderEventType type)
{
Slider* node = dynamic_cast<Slider*>(sender);
if (type == SliderEventType::SLIDER_PERCENTCHANGED)
{
float value = node->getPercent();
}
}
 
//4.0 over
{
auto slider = Slider::create();
slider->loadBarTexture(/*base texture*/);
slider->loadProgressBarTexture(/*progress texture*/);
slider->loadSlidBallTextures(/*ball normal, ball touched, bal disable, Widget::TextureResType*/);
slider->setPosition(/*Vec2*/);
addChild(slider);
 
slider->addEventListener((ui::Slider::ccSliderCallback)CC_CALLBACK_2(HelloWorld::changeSlider, this));//<-여기
}
 
void HelloWorld::changeSlider(Ref* sender, ui::Slider::EventType type)//<-여기
{
Slider* node = dynamic_cast<Slider*>(sender);
if (type == ui::Slider::EventType::ON_PERCENTAGE_CHANGED)//<-여기가 다르다
{
float value = node->getPercent();
}
}
 
 
체크박스도 비슷
3.17.x
checkbox->addEventListenerCheckBox(this, checkboxselectedeventselector(HelloWorld::clickCheck));
~
void HelloWorld::clickCheck(Ref* sender, CheckBoxEventType type)
 
4.0
checkbox->addEventListener((ui::CheckBox::ccCheckBoxCallback)CC_CALLBACK_2(HelloWorld::clickCheck, this));
~
void HelloWorld::clickCheck(Ref* sender, ui::CheckBox::EventType type)
 

[안드로이드] 2048몬스터걸


너무 오랜만의! 게임 런칭입니다.

2019년은 외부 협력 프로젝트에 매여있었고,
2020상반기에는 앞의 플젝은 어찌저찌 출시했지만 그것과는 별도로 집에 우환이 있어서 제대로 개발에 집중을 못했네요.

파일럿 플젝만 조금씩 만지고 완성작을 못 내고 있으니 감이 점점 떨어지더군요.

해서 단기간 빡세게 집중해서 완성작 내보자는 목표로 달렸습니다.


메인은 잘 알려진 통상의 2048게임입니다.

보드를 아이소매트릭으로 배치하고, RPG나 디펜스 게임에서 쓰기 위한 오브젝트를 숫자 대신 배치했습니다.

오브젝트는 숫자형, 판타지 마을형, 판타지 마계도시형의 최대 세 종류에서 선택 가능
(마계도시형은 게임 진행 보상으로 획득하게 됩니다)


단계별로 클리어에 요구되는 목표-128, 256, 512...-가 있습니다.

목표 오브젝트의 조합에 성공하면 배경의 몬무스 그래픽이 밝아지며 클리어 됩니다.

클리어 후는 계속 진행할 수도 있고, (최대 4096까지 완성 가능) 다음 단계로 진행할수도 있습니다.


몬무스는 모두 24종.

클리어한 몬무스는 앨범에 등록되어 수시로 그림을 보거나
해당 몬무스를 배경으로 지정해서 게임을 진행할 수 있습니다.


게임을 진행하면 몬무스의 클리어 대사와는 별도로 간단한 스토리가 진행되기도 하고

각 포인트마다 안내역으로 나오는 메이드소녀 '앤'의 코스츔을 획득, 해당 코스츔으로 변경해서 진행할 수도 있습니다.


원스토어 이어 구글 플레이스토어에도 오픈했습니다.


맥북은 있으니까 iOS기기만 확보하면 앱스토어에도.. 과연..?

팝니다] 액정타블렛 가오몬 GM156HD

2019년 6월 구매, 판매 희망가 15만원


기본 구성품 모두 있고 박스 있습니다.
파손위험 높으므로 직거래만 가능합니다. (여기는 경기 용인 처인구입니다)

문의
댓글 혹은 01055449542 (예약중이면 비공개, 판매 후에는 삭제됩니다)


구성품

본체
전원어댑터
연결케이블(HDMI + USB-C)
충전식 펜 2개 (1개는 미사용)
펜 스탠드
펜 충전 케이블 (미사용)
교체용 예비심 다수 (미사용)
드로잉장갑 (미사용)
쿨링스탠드(구멍)
쿨링스탠드 USB 전원선
기본 보호필름(비추)
유니버설 플러그 (미사용)
설명서 (퀵 가이드)


참고사항

- 기간에 비해 사용량이 많진 않지만 다소 사용감은 있습니다.
- 보호필름은 저반사형에 사각거림 있는데, 붙여놓으면 타블렛과 사이에 오일스팟이 떠서 안쓰느게 좋습니다..
- 쿨링스탠드는 일반 노트북용 쿨링 스탠드인데, 각도를 높이려고 나사못을 박았던 구멍이 있습니다.
- 해외직구품으로 AS 불가합니다.


사진 (촬영일 2020-10-20, 현재 포장 중)




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


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

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

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC