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 | 댓글 남기기