액션기능으로 점프하기 (JumpBy)



c++)

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
37
38
#include "test111.hpp"
 
USING_NS_CC;
 
Scene* Test111::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test111::create();
    scene->addChild(layer);
    
    return scene;
}
 
 
bool Test111::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    auto sprite = Sprite::create("ball.png");   //스프라이트 이미지 객체
    sprite->setPosition(Point(100,100));    //이미지 위치 지정
    this->addChild(sprite); //레이어에 추가
    
    
    //JumpBy JumpTo : 지정한 위치로 객체의 위치를 변경해주면서 지정한 높이로 지정한 횟수만큼 점프하는 액션
    //액션은 Node를 상속받은 객체(Layer , Sprite , Label)에 실행
    //JumpBy::create(지속시간 , 위치 , 점프높이 , 점프횟수);
    auto action = JumpBy::create(5.0f, Point(300,0), 1504);
    sprite->runAction(action);
    
        
    return true;
}
 
cs






기본액션표



 

종류

위치 

MoveBy , MoveTo , JumpBy , JumpTo , BezierBy , BezierTo , Place 

크기 

ScaleBy , ScaleTo

회전 

RotateBy , RotateTo 

화면출력 

Show , Hide , Blink , ToggleVisibility 

투명도 

FadeIn , FadeOut , FadeTo 

색상 

TintBy , TintTo 



OpenCV 설치


1) Download

http://opencv.org/downloads.html 에서 다운로드


2) 설치



3) PATH 추가

1
D:\opencv_3_2\opencv\build\x64\vc14\bin



4) 헤더파일 경로 추가

구성속성 > C/C++ > 일반 > 추가 포함 디렉토리 에 추가

1
D:\opencv\opencv_3_2\build\include
cs



5) 라이브러리 파일 경로 추가

구성속성 > 링커 > 일반 > 추가 라이브러리 디렉토리 에 추가

1
D:\opencv\opencv_3_2\build\x64\vc14\lib
cs



6) 라이브러리 파일 링크

구성속성 > 링커 > 입력 > 추가종속성 에 추가

1
2
opencv_world320.lib
opencv_world320d.lib
cs


다운받은 apk 파일 추출하기 (adb 명령어 사용)



1. 명령어로 패키지 목록을 출력한다

1
adb shell pm list packages -f
cs



2. 출력된 목록중 추출하고자 하는 패키지를 검색한다

3. 추출하고자 하는 apk 경로를 확인하여 아래명령어로 추출한다

1
adb pull /data/app/com.wooribank.smart.mwib-1/base.apk wooribygoogle.apk
cs

액션기능으로 이미지 이동하기



c++)

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
37
38
#include "test108.hpp"
 
USING_NS_CC;
 
Scene* Test108::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test108::create();
    scene->addChild(layer);
    
    return scene;
}
 
 
bool Test108::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    auto sprite = Sprite::create("ball.png");
    sprite->setPosition(Point(50,50));
    this->addChild(sprite);
    
    
    //-By : 상대적인 값으로 변경, -To : 절대값으로 변경
    //MoveTo::create(이동시간, 이동할위치)
    auto action = MoveTo::create(3, Point(45050));
 
    //runAction(액션) : 객체에 액션지정
    sprite->runAction(action);
    
    return true;
}
 
cs



결과



TabLayout 밑의 그림자 없애기

TabLayout 을 감싸고 있는 AppBarLayout의 속성에 app:elevation="0dp" 속성을 추가한다



ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <android.support.design.widget.AppBarLayout
        app:elevation="0dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            app:tabMode="scrollable"
            app:tabGravity="fill"
            app:tabTextColor="#fff"
            app:tabSelectedTextColor="#fff"
            android:background="#000"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </android.support.design.widget.AppBarLayout>
cs


토글 아이템메뉴 사용하기



c++)

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "test100.hpp"
 
USING_NS_CC;
 
Scene* Test100::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test100::create();
    scene->addChild(layer);
    
    return scene;
}
 
 
bool Test100::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    //토글 아이템에 사용할 메뉴아이템 (ps. 콜백함수 없음)
    auto toggle1 = MenuItemImage::create("btn-play-normal.png""btn-play-selected.png");   //메뉴아이템1
    auto toggle2 = MenuItemImage::create("btn-highscores-normal.png""btn-highscores-selected.png");   //메뉴아이템2
    //토글 아이템 생성
    //createWithCallback(콜백 함수, 메뉴아이템1, 메뉴아이템2, NULL)
    auto item1 = MenuItemToggle::createWithCallback(CC_CALLBACK_1(Test100::menuCallback, this), toggle1, toggle2, NULL);
    
    
    auto menu = Menu::create(item1, NULL);
    //메뉴위치 자동정렬
    //alignItemsVertically() : 세로로 자동정렬 , alignItemsHorizontally() : 가로로 자동정렬
    //메뉴 간격
    //alignItemsVerticallyWithPadding() : 세로간격 , alignItemsHorizontallyWithPadding() : 가로간격
    menu->alignItemsVertically();
    
    //메뉴위치지정
    //setPosition() , setAnchorPoint()
    
    this->addChild(menu);
    
    
    return true;
}
 
 
//콜백함수
void Test100::menuCallback(Ref* sender){
    CCLOG("menu callback");
}
cs



결과

메뉴를 클릭하면 메뉴아이템이 바뀐다


Sprite를 이용한 메뉴 생성하기

MenuItemSprite : Sprite 이용하여 크기, 알파값 등의 지정가능



c++)

Sprite생성 -> Menu Item 추가 -> Menu 추가 -> Layer 추가

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "test98.hpp"
 
USING_NS_CC;
 
Scene* Test98::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test98::create();
    scene->addChild(layer);
    
    return scene;
}
 
 
bool Test98::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    //MenuItemSprite : Sprite를 이용하여 크기, 알파값 등의 지정가능
    
    auto sprite1normal = Sprite::create("btn-play-normal.png");
    auto sprite1select = Sprite::create("btn-play-selected.png");
    
    auto sprite2normal = Sprite::create("btn-highscores-normal.png");
    sprite2normal->setRotation(180);    //이미지회전
    auto sprite2select = Sprite::create("btn-highscores-selected.png");
    
    auto sprite3normal = Sprite::create("btn-about-normal.png");
    sprite3normal->setScaleX(5);    //이미지 비율
    auto sprite3select = Sprite::create("btn-about-selected.png");
    
    
    //Sprite생성 -> Menu Item에 추가 -> Menu에 추가 -> Layer에 추가
    auto item1 = MenuItemSprite::create(sprite1normal, sprite1select, CC_CALLBACK_1(Test98::menuCallback, this));
    auto item2 = MenuItemSprite::create(sprite2normal, sprite2select, CC_CALLBACK_1(Test98::menuCallback, this));
    auto item3 = MenuItemSprite::create(sprite3normal, sprite3select, CC_CALLBACK_1(Test98::menuCallback, this));
    
    
    auto menu = Menu::create(item1, item2, item3, NULL);
    menu->alignItemsVertically();
    
    
    this->addChild(menu);
    
    return true;
}
 
 
//콜백함수
void Test98::menuCallback(Ref* sender){
    CCLOG("menu callback");
}
cs



결과



Thread.UncaughtExceptionHandler 사용하여  앱 비정상 종료시 로그출력 예제



java)

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.wnet.uncaughtex;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
 
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
 
public class MainActivity extends AppCompatActivity {
 
    Thread.UncaughtExceptionHandler mUncaughtExceptionHandler;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandlerApplication());
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        Button btnError1 = (Button)findViewById(R.id.btnError1);
        btnError1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try{
                    Thread.sleep(1000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
 
                int test = 1/0;
            }
        });
    }
 
 
    class UncaughtExceptionHandlerApplication implements Thread.UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            Log.d("error", t.getName()+" : "+getStackTrace(e));
        }
 
 
        private String getStackTrace(Throwable th){
            final Writer result = new StringWriter();
            final PrintWriter printWriter = new PrintWriter(result);
 
            Throwable cause = th;
            while(cause!=null){
                cause.printStackTrace(printWriter);
                cause = cause.getCause();
            }
 
            final String stacktraceAsString = result.toString();
            printWriter.close();
 
            return stacktraceAsString;
        }
    }
}
 
cs



결과

버튼 클릭시 0으로 나눌려고 했기 때문에 에러가 나오고 그 에러를 캐치하여 로그로 출력해준다

1
2
3
4
5
6
7
8
9
10
11
12
13
01-31 16:25:23.610 31066-31066/com.wnet.uncaughtex D/AndroidRuntime: Shutting down VM
01-31 16:25:23.610 31066-31066/com.wnet.uncaughtex D/error: main : java.lang.ArithmeticException: divide by zero
                                                                at com.wnet.uncaughtex.MainActivity$1.onClick(MainActivity.java:37)
                                                                at android.view.View.performClick(View.java:5697)
                                                                at android.widget.TextView.performClick(TextView.java:10814)
                                                                at android.view.View$PerformClick.run(View.java:22526)
                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                at android.os.Looper.loop(Looper.java:158)
                                                                at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
cs


Label을 이용한 메뉴 생성하기

MenuItemFont : 폰트 크기나 색생을 직접 지정하지 못함

MenuItemLabel : Label 이용하여 다양하게 표현 가능



c++)

Label생성 -> Menu Item 추가 -> Menu 추가 -> Layer 추가

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "test95.hpp"
 
USING_NS_CC;
 
Scene* Test95::createScene()
{
    auto scene = Scene::create();
    
    auto layer = Test95::create();
    scene->addChild(layer);
    
    return scene;
}
 
 
bool Test95::init()
{
    if ( !Layer::init())
    {
        return false;
    }
    
    
    //MenuItemFont : 폰트 크기나 색생을 직접 지정하지 못함
    //MenuItemLabel : Label을 이용하여 다양하게 표현 가능
    
    auto label1 = Label::createWithSystemFont("Play""Marker Felt"30);
    label1->setColor(Color3B(25500));   //글자색상지정
    
    auto label2 = Label::createWithSystemFont("High Scores""Marker Felt"30);
    label2->enableShadow(Color4B::BLUE, Size(2,-2));    //그림자 지정
    
    auto label3 = Label::createWithSystemFont("About""Marker Felt"30);
    label3->enableOutline(Color4B::RED, 2); //외곽선 지정
    
    
    //Label생성 -> Menu Item에 추가 -> Menu에 추가 -> Layer에 추가
    auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(Test95::menuCallback, this));
    auto item2 = MenuItemLabel::create(label2, CC_CALLBACK_1(Test95::menuCallback, this));
    auto item3 = MenuItemLabel::create(label3, CC_CALLBACK_1(Test95::menuCallback, this));
    
    
    auto menu = Menu::create(item1, item2, item3, NULL);
    menu->alignItemsVertically();
    
    
    this->addChild(menu);
    
    return true;
}
 
 
//콜백함수
void Test95::menuCallback(Ref* sender){
    CCLOG("menu callback");
}
cs



결과



+ Recent posts