Rust amethyst 투명 스프라이트 테스트

Rust Amethyst 투명 스프라이트

scroll test 에서 진행 중

일반적으로 Sprite 출력은 가능한데 투명 출력을 어떻게 해야할지 몰랐다.

그래서 amethyst_renderer 소스를 한번 뜯어보기로 했다.

Texture 이미지는 PNG 포맷으로 투명이 이미 적용되어 있음.

pipe 를 아래와 같이 정의

   let pipe = Pipeline::build().with_stage(
        Stage::with_backbuffer()
            .clear_target([0.0, 0.0, 0.0, 1.0], 1.0)
            .with_pass(DrawSprite::new().with_transparency(
                ColorMask::all(),
                ALPHA,
                Some(DepthMode::LessEqualWrite),
            )),
    );

그러자 아래와 같이 오류가 발생

thread 'main' panicked at 'Tried to fetch a resource, but the resource does not exist.
Try adding the resource by inserting it manually or using the `setup` method.

Cargo.toml 에 features=['nightly'] 넣고 해봄

rustup run nightly cargo run

아래와 같은 오류가 나옴

thread 'main' panicked at 'Tried to fetch a resource of type "amethyst::specs::storage::MaskedStorage", but the resource does not exist.
Try adding the resource by inserting it manually or using the `setup` method.', /home/siabard/.cargo/registry/src/github.com-1ecc6299db9ec823/shred-0.7.0/src/res/mod.rs:215:48

이 부분은 amethyst의 문서대로라면 Component 를 등록안하면서 생긴거라는데, TransformBundle 같은 것을 등록하면 해결된다고 한다.

    let game_data = GameDataBuilder::default()
        .with_bundle(GlobalBundle)? 
        .with_bundle(TransformBundle::new())?
        .with_bundle(
            RenderBundle::new(pipe, Some(config))
                .with_sprite_sheet_processor()
                .with_sprite_visibility_sorting(&["transform_system"]),
        )?;

결국 bundle의 순서를 변경해주었더니 잘된다.

카테고리: amethyst, 게임, RUST | 댓글 남기기

게임 개발자에게 좋은 글

게임개발자들의 명언

나고시 토시히로

무언가를 만든다는 것은 분명히 최후의 순간에는
고독한 싸움이 된다.
하지만,혼자서는 무슨 짓을 해도 해결할 수 없는
문제가 발생 했을때,어떻게 해결할 수 있을까?
디지털에 기대서?
인터넷을 조사해서 어떻게든 한다?
그렇게하면 편하고 빠르게 앞으로 전진할 수
있을 것 같긴 하다.
하지만,디지털을 맹신하는 마인드의 이면에는
사람을 피해 재빠르게 가장 좋은 해법을
손에 넣어,고생 없이 성공만을 취하고 싶다는
비겁함이 숨어있다고 생각지 않는가?
그런 것은 제 멋대로다.

아날로그에는 오차가 있고
디지털에는 오차가 없다.
그래서 디지털이 편리하고 옳은가?
그러니 디지털을 믿는다?
어디서 그런 바보같은 소리를...

하지만,최근에는 "자신의 감성"조차
인터넷에 의지하려는 사람들이 점차 늘고 있다.
예를 들면,보고 싶은 영화가 있을 때
먼저 본 사람의 리뷰를 신경쓰는 사람도 많다.
하지만,그건 참고일 뿐 자신이 보고 싶다면
리뷰가 어떻든 보러가면 된다.
자신이 좋아하는 것에 대해서 주의가 어떻게 생각하든지,
어떻게 평가하든지 상관없다.
주위가 얼마나 커다란 목소리로 떠들던 간에 말이다.
웹 페이지 위에 쓰여진 것이 진실이라면,
진실따위 얼마든지 위조할 수 있다.
디지털은 배신한다.
게다가 그 배신은 오차가 없는 만큼,
사람 그 이상으로 냉혹하고 무책임하다.
그렇기 때문에 마지막으로 말하고 싶은 것은

디지털에 좌우되지 말라는 것이다.
그리고 일단 먼저 배신하지 않는 사람을 찾아라.
어려울 것이다.하지만 찾을 수 없다고 해도
포기하지 말고 계속 찾아라.
게임 만들기와 관계가 있냐고?
엄청나게 있다.
무언가를 만든다는 것은 결국,조금이라도
앞으로 나아가기 위해서 경쟁하고
시행착오를 함께 하는 동료 찾기와 같은 것이니까.

미야모토 시게루

"모든 경험은 결국 삶의 양식이 되기 때문에

인생에 헛된 것은 하나도 없습니다."

"게임을 만드는 사람이 즐겁지 않으면

그들의 게임을 재미있는 사람도 없을 것이다."

윌 라이트

훌륭한 명작이 될수 있는 디자인들이

게임으로 만들어지지 못하는 일이 많을겁니다.

제 경우에, 저는 아주 아주 인내심이 많은사람입니다.

그리고 그런 아이디어를 가진 사람 역시

정말로 인내심을 가진다면,반드시 해내겠다는 생각을

가진다면 언젠가는 해낼 수 있을겁니다.

심시티의 경우에는 첫번째 버전이 나오기까지 5년이 걸렸고,

 심즈는 7년이 걸렸습니다.

존 카멕

"한가지 일에 열심히 일하는 것은

성공을 위한 가장 실질적인 방법이다.

 오직 목표에만 초점을 맞춰라.

그리고 목표를 달성하기 위해 다음 발걸음을 내딛더라.

만약 지금 네가 하고 있는 길에 대한 확신이 서지 않는다면,

다른 길도 함께 가보고 더 나은 것이 어떤 것인지 찾아내라 "

사카구치 히로노부

"새로운 작품을 만든다는 것은

아무도 발을 들여놓은 적이 없는

미지의 초원을 걸어가는 느낌이다."

"자신의 아이디어를 누군가가 비웃는다고 해도

그것에 좌절해서는 안됩니다.

원래 새로운 아이디어라는 것은

기존의 벽을 깨뜨리는 것이기 때문에

이미 틀에 박힌 사람의 사고속에서

 동작하는 비웃음에 신경 써서는 안됩니다.

원래 새로운 아이디어는 그런 사람들의 비웃음속에서 탄생합니다. "

"당당하게 실패를 자랑하라!

빛이 보이지 않는 시대를 열기 위해서는

실패를 두려워하지 않는 도전자이지 않으면 안된다.

 시대에 뒤떨어진 성공담에서 배울 것은 없다.

 자, 패자에게야말로 축복의 꽃다발을. "

스즈키 유

오늘 실패한다고 해서 인생이 끝나는 것은 아니라고 생각합니다.

오늘 실패했다고 해서 내일도 모레도

계속 실패하지는 않을 것이라고 봅니다.

 게임 개발이라는 것은 대부분 실패의 연속입니다.

실패가 거듭되다가 포기하기 직전 성공하는 것이죠.

내일은 내일의 바람이 붑니다.

실패를 두려워하면 결코 성공할 수 없다고 생각합니다.

빌로퍼

"창의성에서 가장 중요한것은 불확실에 대해 도전하는 것입니다."

"꿈을 이루기 위해서는 하기 싫어도 해야할 일이 있기 마련이죠"

반 사토시

꿈으로는 먹고 살 수 없습니다.

당연한 이야기지만 게임을 만드는 데 있어서

무척이나 중요한 점입니다.

게임 크리에이터는 꿈을 이야기하는 사람이 아니라

꿈을 "형태"로 만들어내는 사람입니다.

꿈은 "형태"로 만들지 않으면 유저들의 손에 닿지 않습니다.

그리고 프로듀서의 역활은 꿈을 형태로 만드는 것뿐만 아니라

"형태"를 팔아,"먹고 살 돈"을 손에 넣는

(=비지니스로서의 성공)일이기도 합니다.

이런 입장에서는 "좋아하는 걸 만들면 되지"라는

생각은 허락되지 않습니다.

프로듀서로서의 진가는 "형태를 돈으로 바꾸는"

능력에서 드러납니다.

사토 루이

무엇을 위해 오락은 존재하는가,

무엇을 위해서 게임을 만드는가?

만드는 사람에게 있어서는

"만들고 싶으니까 만든다"는 것만으로 충분합니다.

하지만 140명이나 되는 사원이 매일 근무하고,

국내외를 포함하여 수십만 명의

고객들에게 게임을 서비스하고 있는

입장으로서는 이유가 필요합니다.

100명이 1년간 일한다는 것은 한명이

100년을 보내는 것과 똑같습니다.

적당히 만들거나,돈만을 목적으로 하는

개발은 범죄나 다름없습니다.

타나카 타이세이

게임 크리에이터가 되려고 하는 사람은

대부분 게임을 정말로 좋아할 것입니다.

따라서 지금까지 살아오면서 즐겁다고

생각한 순간이란 게임을 플레이하고

있었던 순간이었을 겁니다.

하지만,플레이했던 기존의 게임을

재구축해봐야 기존 게임의 패턴화에 그칠 뿐입니다.

그래픽만 진화한 똑같은 게임이 재생산되고

있는 것이 요즈음 세태입니다.

게임 크리에이터로서 지금까지 없었던

새로운 게임을 만들어내고 싶다면

다른 게임 크리에이터가 하지 못할,

지금껏 살아오면서 재미있었던 순간을 찾아내어

그 내용을 구조화하여 심플한 패턴으로

정리하는 것이 지름길인지도 모릅니다.

이시하라 츠네카츠

게임 크리에이터는 만들고 싶은 게임을

수없이 가지고 있어야 합니다.

가능하다면 언제라도 10개 정도는

만들고 싶은 게임을 품고 있어야 합니다.

그리고 하나의 게임을 실현(상품화)하면,

만들고 싶은 게임이 한 개 줄어드는 게 아니라

반대로 두 개 더 늘어나야 합니다.

수치로 말하는게 프로니까 말이죠

오노 코우지

걸작 게임을 플레이하면서 해석하고,

그 톱 크리에이터의 이야기를 이해하며

"게임의 본질"을 알고 그 게임 메커니즘을

자신의 것으로 하려는 노력이 필요합니다.

그렇게 할 수 있다면 우수한 게임 메커니즘을

응용하여 최적의 조합을 찾아내고,

그를 게임 디자인으로 마무리를 지어 새롭고 놀라운

리얼한 게임을 개발할 수 있겠지요.

그러기 위해서는 비디오 게임뿐만 아니라

삶에 있어 "재미라는 생각의 구조"를

놓치는 일 없이 알아채는

"게임을 보는 눈"이야말로 게임 크리에이터에게

필요한 능력이라고 생각합니다.

키타무라 히로히사

"머릿속에 완성형은 들어있는가?"하고

스스로에게 질문할 필요가 있는 것은

디렉터 또는 리더뿐만 아니라

프로젝트에 관련된 모두에게 있습니다.

누구에게 있어서도 다른 사람의 일이 아닙니다.

사양서를 쓸 때,모델링,모션,이펙트,

매터리얼을 작성할 때,프로그램을 짤 때,

그리고 게임의 핵심 메커니즘을 구축할 때,

여러 작업에서 전원의 "머릿속에 완성형이 들어있을"

필요가 있습니다.

키노시타 마사야

예전에 잘 되었던 모델을 금과옥조처럼 여겨

현재에까지 적용하려 들거나,

예전에 실패했던 수법을 필요 이상으로

두려워해서는 환경에 적응하지 못하고

절멸했던 동물들과 똑같은 결과가 기다리고 있을 것이다.

멸망하고 싶지 않다면 가능성을 찾자.

리스크를 부담하고 한번 패배하고 말았던

상대에게 재도전하자.

"그건,나도 생각하고 있었다니까"라고

내년도 그렇게 중얼거리기만 하는 신세가 되고

싶지 않다면 말이다.

쿠보 요이치

저에게 있어 리더라는 것은

"사람의 힘을 끌어내어 혼자서는 불가능한

위대한 업적을 팀의 힘으로 이루어내는 것에

모든것을 바치는 사람"

그것이 리더라고 생각합니다.

사이토 야스유키

게임은 팀 제작이며

"프로젝트로서의 성공이란 무엇인가?를

모두가 공유하고 의식하지 않으면

좋은 결과로 이어지지 않는다는 것을

깨달았습니다.

하야시 히로토

스스로에게

"무엇을 습득할 것인가?"라고 묻는다는 것은

한 발 늦고 있는 것입니다.

"나는 무엇을 모르는가?"

"어떻게 하면 할 수 있게 될 것인가?"부터

생각하고 배움으로써 스스로 해결해나가는 능력을

키우는 것이 제일 중요합니다.

츠카모토 마사노부

게임업계는 젊은이가 많고 아직도 최신의 기술을

접할 기회가 많기 때문에 어지간해서는

오래된 것을 접해볼 기회가 적은 것이 현실입니다.

하지만,오래된 것을 알아 두지 않는다면

새로운 것을 생각해낼 수 있는

토대가 없다고도 할 수 있습니다.

"형태를 알아야만 행태를 부수는 것이 가능하다.

형태를 배우지 않는다는 것은

형태가 없다는 것과 마찬가지다"

삼대째 가부키 배우인 시가와 사루스케의 말입니다.

다른 장르의 엔터테인먼트의 고전에는

사람을 즐겁게하는 "형태"가 무척 원시적인

형태로 남아있는 경우가 많습니다.

먼저 "형태"를 안다는 것부터 시작해 보는 건 어떨까요?

이와타 사토루

저는 성경 말씀 중에 “가난한 자는 복이 있나니

천국이 저희 것임이요”라는 구절을 좋아합니다.

왜냐하면 이 말씀은 지금 비록 가난하지만

그 가난이 영원한 것이 아니라 미래에는 천국과 같은

성공의 원천이 된다는 뜻을 가지고 있기 때문입니다.

그렇기 때문에 성공이 오는 그 순간

성공은 끝나 버리기 시작하는 것이고

패배란 곧 내일의 승리와 연결되기 마련입니다.

리차드 게리엇

"우리는 실감나는 시뮬레이션과

기술적인 혁신으로 세상을 창조한다.

우리는 인터랙티브 엔터테인먼트에

지금까지 비교할 수 없는 정성을 다하여

새로운 기준을 제시하여 세상을 창조한다.

그러나 무엇보다도 중요한 것은

우리는 재미있는 세상을 창조 한다는 것이다."

피터몰리뉴

“ 착상과 아이디어를 얻으면

저는 항상 적어도 6개월의 숙고과정을 거칩니다.

개인적으로 저는 아이디어를 문서로 작성하지는 않습니다.

문서로 작성하면 고착화되기 때문에

그것보다는 확실히 만족할만한 아이디어를

얻기까지 계속 개선 시키기를 원하기 떄문입니다.

그런 확실한 아이디어를 얻으면

게임의 흥미있는 부분들만을 열거해

두페이지 이내로 문서로 작성합니다.”

시드마이어

"게임 크리에이터는 세상에서

가장 완벽하고 가장 재미있는 직업이에요.

그래서 저는 세계 최고의 행운아죠. "

출처:게임 개발자들의 명언

카테고리: 잡담 | 댓글 남기기

Donate To Mozilla

다양하게 혜택을 보는 입장에서.. (Rust도 하고 있고..FireFox는 주 이용 브라우저이고..)

연말 기부…

Mozilla Foundation Donation $30.00 USD  1   $30.00 USD
카테고리: 잡담 | 댓글 남기기

Domain Modeling with Types – Part 1

Domain Modeling

Simple Value

F#, Ocaml 에서는 Primitive Type 에 대한 wrapper가 존재하지만 rust는 aliasing 으로 진행

[F#]
type CheckNumber = CheckNumber of int
type CardNumber = CardNumber of string

[Rust]
type CheckNumber = i32
type CardNumber = String

Choice / Composition

F#의 ChoiceType 은 enum으로, Composition 은 struct 로 표현

[F#]
type CardType =
  | Visa
  | Mastercard

type CreditCardInfo {
  CardType: CardType
  CardNumber : CardNumber
}

[Rust]
enum CardType {
    Visa,
    Mastercard,
}

struct CreditCardInfo {
    CardType: CardType,
    CardNumber: CardNumber,
}

Complex Data

[Model]
data Order =
  CustomerInfo
  AND ShippingAddress
  AND BillingAddress
  AND list of Orders
  AND AmoutOfBill

[F#]
type Order = {
  CustomerInfo: CustomerInfo
  ShippingAddress: ShippingAddress
  BillingAddress: BillingAddress
  OrderLines: OrderLine list
  AmountOfBill: AmountOfBill
}

[Rust]
struct Order {
    CustomerInfo: CustomerInfo,
    ShippingAddress: ShippingAddress,
    BillingAddress: BillingAddress,
    OrderLines: Vec<OrderLine>,
    AmountOfBill: AmountOfBill
};
카테고리: RUST | 댓글 남기기

SDL2 ttf를 이용해 문자 출력

SDL TTF

SDL에서 True Type Font를 사용할 것이다.

계속 읽기

카테고리: Lisp, RUST, SDL | 댓글 남기기

SDL2 image를 이용해서 이미지 출력

SDL image

SDL에서 이미지를 사용하는 방법에 대해 알아보자.

계속 읽기

카테고리: Lisp, RUST | 댓글 남기기

Rust , Common-lisp에서 SDL 설정

SDL 설치

Rust

의존성 설치

Cargo.toml에 아래 내용을 넣는다.

[dependencies]
sdl2 = "0.30"

예제코드

가장 간단한 Rust 예제 코드는 아래와 같다.

extern crate sdl2;

use sdl2::event::Event;
use sdl2::keyboard::Keycode;

fn main() {
    let sdl_context = sdl2::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();
    let mut event_pump = sdl_context.event_pump().unwrap();

    let window = video_subsystem.window("SDL2", 800, 600)
        .position_centered().build().unwrap();

    let mut canvas = window.into_canvas()
        .accelerated().build().unwrap();

    let mut running = true;
    while running {
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit {..} | Event::KeyDown {keycode: Some(Keycode::Escape), ..} => {
                    running = false;
                }
                _ => {},
            }
        }

        canvas.clear();
        canvas.present();
    }
}

해당 코드 실행시 빈창이 뜨게 된다.

Common Lisp

의존성 설치

sdl2와 cl-opengl2를 설치한다.

(ql:quickload "sdl2")
(ql:quickload "cl-opengl2")

예제코드

가장 간단한 Common Lisp 예제는 아래와 같다.

(ql:quickload "sdl2")
(ql:quickload "cl-opengl")

(require :sdl2)
(require :cl-opengl)

(defun clear-renderer (renderer)
  (progn (sdl2:set-render-draw-color renderer 0 0 0 255)
     (sdl2:render-clear renderer)))

(defun render-points (renderer)
  (sdl2:with-points ((a (random 800) (random 800))
                     (b (random 800) (random 800))
                     (c (random 800) (random 800)))
    (sdl2:set-render-draw-color renderer 0 255 0 255)
    (multiple-value-bind (points num)
        (sdl2:points* a b c)
      (sdl2:render-draw-points renderer points num))))

(defun main ()
  (sdl2:with-init (:everything)
    (sdl2:with-window (win :title "SDL2 start" :flags '(:shown))
      (sdl2:with-renderer (renderer win :flags '(:renderer-accelerated))   
    (sdl2:with-event-loop (:method :poll)
      (:keyup
       (:keysym keysym)
       (when (sdl2:scancode= (sdl2:scancode-value keysym) :scancode-escape)
         (sdl2:push-event :quit)))
      (:idle
       ()
       (clear-renderer renderer)
       (render-points renderer)
       (sdl2:render-present renderer))
      (:quit () t))))))
카테고리: 게임, Lisp, RUST, SDL | 댓글 남기기

Common Lisp 설정하기

quicklisp 설치하기

quicklisp.lisp 다운로드

curl -O https://beta.quicklisp.org/quicklisp.lisp

SBCL에서 기동시 로딩

sbcl --load quicklisp.lisp

quicklisp설치

* (quicklisp-quickstart:install)
* (ql:add-to-init-file)
* (ql:quickload "quicklisp-slime-helper")

.emacs에 SBCL 설정 등록

(load (expand-file-name "~/quicklisp/slime-helper.el"))
(setq inferior-lisp-program "sbcl")

Slime 실행

M-x slime
카테고리: Lisp | 댓글 남기기

JAVA에서 https 접속시 Exception이 발생할 때 처리법

JAVA에서 https 접속시 Exception이 발생할 때 처리법

문제의 발생

로컬 시스템에서 DLP를 이용하여 외부 접속을 통제하고 있는데, 인증서를 설치해서 해당 DLP를 처리하지만, 웹 브라우저외에 커맨드 라인 상에서 java 를 통해 실행시키는 프로그램은 번번히 실패하곤 한다.

$ lein repl
Could not transfer artifact clojure-complete:clojure-complete:pom:0.2.4 from/to clojars (https://clojars.org/repo/): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
This could be due to a typo in :dependencies or network issues.
If you are behind a proxy, try setting the 'http_proxy' environment variable.
Exception in thread "Thread-3" clojure.lang.ExceptionInfo: Could not resolve dependencies {:suppress-msg true, :exit-code 1}

...

위의 메세지로 추측컨데 clojars.org로 향하는 부분의 인증서 문제로 정상적인 접속이 되지 않는다.

사내에서 이용하는 DLP 인증서를 java 쪽에서 등록해줘야 정상적으로 동작할 수 있다.

해결방법

정광섭님의 위키 lesstif.com 에서 해결 방법을 찾았다.

커맨드 라인상에서 등록하기

  1. gist 에서 InstallCert.Java 를 다운로드
curl -O https://gist.githubusercontent.com/lesstif/cd26f57b7cfd2cd55241b20e05b5cd93/raw/InstallCert.java
  1. 컴파일 및 실행
javac InstallCert.java
java -cp ./ InstallCert clojars.org
  1. 실행하면 아래와 같이 일부 오류와 함께 인증서를 선택할 수 있다. (2번 DLP에서 사용하는 인증서를 설치한다.)
Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/security/cacerts...
Opening connection to clojars.org:443...
Starting SSL handshake...

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...

Server sent 2 certificate(s):

 1 Subject CN=clojars.org
   Issuer  CN=SSL PRISM, O=ARA Networks, C=KR
   sha1    ...
   md5     ...

 2 Subject CN=SSL PRISM, O=ARA Networks, C=KR
   Issuer  CN=SSL PRISM, O=ARA Networks, C=KR
   sha1    ...
   md5     ...

Enter certificate to add to trusted keystore or 'q' to quit: [1]
2
  1. 이제 아래와 같은 메세지로 저장된다.
Added certificate to keystore 'jssecacerts' using alias 'clojars.org-2'
  1. 저장이 끝난 cert 를 export 한다.
keytool -exportcert -keystore jssecacerts -storepass changeit -file output.cert -alias clojars.org-2

-storepass 항목 뒷쪽의 암호는 나중에 import 할 때 사용할 값으로 적당히 넣으면 되고, 4단계에서 확인한 keystore명과 alias 명을 정확히 넣어준다.

  1. export 한 cert를 java쪽 cert에 import 한다.
keytool -importcert -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit -file output.cert -alias clojars.org-2
...


Trust this certificate? [no]:  yes

해당 인증을 신뢰할지 여부를 물을 때 yes하면 된다.

이제 clojars.org 에 접근하는 java 를 이용한 https 접근은 허용된다.

카테고리: Clojure, 보안, 컴퓨터 언어 | 댓글 남기기

FailLog: Ionic2 Tutorial – Part.1

ionic 을 공부하는 링크 에서 기초적인 부분을 하고 있는데 몇가지 차이가 나는 부분이 있다. 아마도 Angular가 지속적으로 업데이트되고 있는데 저 글이 쓰여진 시점 (2016년 9월경) 이후 일부 변화가 있었던 것 같다.

BrowserModule 관련 문제 – polyfill Exception

튜토리얼을 그대로 진행하던 중 appmodule.ts를 수정하는데 여기서 한가지 문제가 있다.

import { NgModule } from '@angular/core';
import { IonicApp, IonicModule } from 'ionic-angular';
import { MyApp } from './app.component';
import { UsersPage } from '../pages/users/users';
import { ReposPage } from '../pages/repos/repos';
import { OrganisationsPage } from '../pages/organisations/organisations';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
@NgModule({
  declarations: [
    MyApp,
    UsersPage,
    ReposPage,
    OrganisationsPage
  ],
  imports: [
    IonicModule.forRoot(MyApp),
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    UsersPage,
    ReposPage,
    OrganisationsPage
  ],
  providers: [
    StatusBar, SplashScreen
  ]
})
export class AppModule {}

위가 소스 코드이긴 한데 이 부분을 그대로 실행시키면 polyfill 관련해서 exception이 발생한다. BrowserModule 이 빠져서 그런데, 이 부분이 Angular 관련한 문제인 것 같다.

import { BrowserModel } from '@angular/platform-browser';

...
@NgModule({
    imports: [
        BrowserModule,
        IonicModule.forRoot(MyApp),
    ],
})
...

를 추가해줘야한다.

StatusBar, SplashScreen 문제

app.component.ts 를 보면 초기화 부분에서 아래와 같은 부분이 있다.

  initializeApp() {
    this.platform.ready().then(() => {
      // Okay, so the platform is ready and our plugins are available.
      // Here you can do any higher level native things you might need.
      StatusBar.styleDefault();
    });
  }

중요한 건 StatusBar를 저렇게 쓸 수 없다는 것..

Constructor 부터 수정을 봐야하는데 일단 SplashScreen 도 같이 초기화 해보았다.

...
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
...

export class MyApp {
    ...
  constructor(
    public platform: Platform,
    public menu: MenuController,
    public statusBar: StatusBar,
    public splashScreen: SplashScreen
  ) {
    this.initializeApp();

    // set our app's pages
    this.pages = [
      { title: 'Users', component: UsersPage },
      { title: 'Repos', component: ReposPage },
      { title: 'Organisations', component: OrganisationsPage }
    ];
  }

  initializeApp() {
    this.platform.ready().then(() => {
      // Okay, so the platform is ready and our plugins are available.
      // Here you can do any higher level native things you might need.
      this.statusBar.styleDefault();
      this.splashScreen.hide();
    });
  }
    ...
}

정적 함수를 쓴 것 처럼 했었던 것 대신에 statusBar를 따로 생성해서 해당 멤버함수를 호출했다.

추가로 StatusBar 및 SplashScreen관련 provider 설정을 app.module.ts 에 추가해줘야한다.

import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
@NgModule({
...
  providers: [
    StatusBar, SplashScreen
  ]
...

)}

이렇게 하면 해당 Tutorial에서 UsersPage, ReposPage, OrganisationsPage UI 생성하는 곳 까지는 문제없이 돈다.

Git Hub User 데이터 가져오기

http 통신을 하는 부분을 하면서, http provider를 찾는다.

app.module.ts 에 HttpModule 에 대한 import 구문을 추가한다.

...
import { HttpModule  } from '@angular/http';
...
@NgModule({
  providers: [
    StatusBar, SplashScreen, GithubUsers,
  ]
})

이제 github 에 연결하게 된다.

카테고리: 잡담 | 댓글 남기기