[2D 그래픽] 포트리스같은 맵을 만들고싶습니다.

bookgekgom의 이미지

ㅠ 도와 주세요.

포트리스 맵같이 제가 만든 오브젝트들(탱크)이 위에 있을수있고

폭탄을 맞으면 움푹 파이는 그런 맵을 만들고 싶습니다.

여러가지 방법을 생각해봤지만 해답이 떠오르지 않습니다. 도와주세요.

제가 지금까지 생각해논 방법은

1. 맵을 하나의 스프라이트로 만든다.

2. 오브젝트의 (x,y) 포인트가 맵 스프라이트 픽셀인 (x,y) 와 같다면 가만히 있는다. 그렇지 않으면 오브젝트의 y 를 낯추거나 높힌다.

3. 폭탄의 (x,y) 포인트가 스프라이트 픽셀의 (x,y) 와 같다면 정해진 서피스(surface)를 맵 스프라이트위에 그린다.

여기까지 입니다.

ㅠ 제 생각이 틀린건가요? 아니면 다른 방법이 있을까요.

고수님들 제발 도와주세요.

체스맨의 이미지

포트리스를 자세히 보질 못해서 어떤 기법으로 구현했는지 생각해볼 기회가 없었습니다만...

여러 방법이 있을 것이지만, 구현이 비교적 쉽고, 메모리는 좀 많이 드는 방법으로, 마스크 버퍼를 사용하는 방법이 있습니다.

맵에서 지면에 해당하는 부분은 1, 그렇지 않으면 0이고,
충돌 테스트(개체 위치의 마스크 버퍼값이 1이면 충돌) 를 해서 파먹는 부분을 0으로 만들어가면 됩니다.
이렇게 하면, 파먹히는 모양을 재미있게 꾸미는 것도 어렵지 않을 겁니다.

맵을 화면에 뿌릴때는 마스크 버퍼를 이용해서 뿌리면 되구요. OpenGL 같은 경우는 스텐실 버퍼를 이용해서 구현할 수도 있을 것 같습니다.

Orion Project : http://orionids.org

bookgekgom의 이미지

오오...그런 방법이 있군요.

그런데 마스크 버퍼가 영어로 mask buffer 인가요?

자바로 구현하는 법을 찾고있는데 찾기가 쉽지 않군요.

1 과 0 으로 맵을 그리다니 그런 엄청난 방법을...ㅇ.,ㅇ

이렇게 되는건가요.

00000000000000
00000000000000
000000000탱크0
11111111111111
11111111111111

추가-

아 찾았습니다. 이건가요. Bitmask

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Transparency.html

즉 픽셀 알파가 0.0 이나 혹은 1.0 으로 표시된다고할때

0.0 은 트렌스페런시 value 기때분에 투명하게 되고 1.0 은 그냥 색이보이게 되는군요.

으흠...이것도 픽셀을 사용해서 하는것이군요.

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

허접한 페도라 가이드 http://oniichan.shii.org

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

체스맨의 이미지

알파는 색상 버퍼의 기존 값과, 새로 지정할 색상값을 혼합하는 정도를 나타내는 값입니다. 이것을 현재 경우에 응용하려면, 지형 픽셀맵 (또는 텍스쳐)의 알파채널을 지형이 파먹는 상태에 따라 수정을 해줘야겠지요. 아무튼 이경우도 기술적인 맥락은 같습니다.

마스크 버퍼를 별도로 할당한다면, 지형이 변형되는 y 좌표 구간에 대해서만 할당해서 메모리 사용을 줄일 수 있을 것이고, 지형이 스크롤되지 않는다면 GL 의 스탠실 버퍼만으로도 구현 가능하다고 봅니다.

알파채널을 갖는 텍스쳐를 이용하는 경우도, 지형이 변형되는 구간만 알파 텍스쳐를 사용하는게 메모리에 더 유리하겠죠.

실제로 게임이 어떻게 동작하고 어떤 조건이 있는가에 따라 적용하는 기법은 많이 달라질 겁니다.

Orion Project : http://orionids.org

bookgekgom의 이미지

ㅠㅠ 엄청나게 많은 기법들이 있군요.

스탠실버퍼는 접어 두어야 겠습니다. 일단은 아주 간단하게

두개의 스프라이트를 만들어서

두개가 닿으면 값을 리턴하는것을 연습해야겠습니다.

ㅠㅠ

그런데 이해가 안되는게...

단순하게 어떠한 알고리듬을 사용하지 않고 순수히

이미지픽셀들이 다른 이미지 픽셀과 닿았는지 체크하는것과

비트 마스크를 사용해서 1 과 0 으로 체크하는것 이 어떻게 다른거죠?

비트마스크를 사용하는것이 월등하게 빠르다고 사람들이 말하는거 같은데

이해가 되질않습니다. 둘다 똑같은거 아닌가요?

한쪽은 1 과 0 을 사용하고 다른쪽은 픽셀자체를 사용하는것 이라고 밖에는 다른점이 보이질 않는데요....

어쪠서 속도 차이가 나는 걸까요?
-----------------------------------------------------------------------------------------------------------
허접한 페도라 가이드 http://oniichan.shii.org

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

체스맨의 이미지

경계가 사각 또는 원 처럼 판별 방법이 단순한 경우는 차이가 별로 없겠죠. 하지만 임의 경계라고 했을때는 얘기가 달라질 겁니다. 버퍼가 있는 경우는 즉시 참조로 가능하지만, 그렇지 않은 경우는 경계를 테스트하기 위해 많은 연산이 필요해지는 경우도 생기겠죠.

Orion Project : http://orionids.org

Yotun의 이미지

움, 요즘 일반적인 컴터의 환경에서 화면 한장 분량의 버퍼메모리가 무슨 큰 고려 대상이 될까 싶기도 합니다만,

마스크용 맵을 따로 만들지 않고 그냥 맵을 읽어놓은 비트맵 위에 직접 마스크를 씌워버리면 좀더 쉽고 메모리도 절약될듯싶네요.

가령...

XXXXXX000XXX00XXXX0000XX000X000
XXXXX00000XX00XXXX000XXXXXXXX00
XXXXX00000XX00XXXX000XXXXXXXX00
XXXXX00000XX00XXXX000XXXXXXXX00

뭐 이런식으로 맵이 있다 치고.. X는 실제 비트맵의 픽셀값, 0은 파이거나 첨부터 투명 처리되어야하는 부분이라고 하고

이 맵상에

000XX000
00XXXX00
0XXXXXX0
00XXXX00
000XX000 -> 뭐 대충 동그란 모양의 폭탄이라고 치고..--;;

이런모양의 폭탄이 떨어졌다고 했을때, 폭탄이 지형에 맞아 터져서 없어져야 하는 부분은
폭탄의 X 부분과 맵의 X부분이 겹치는 부분을 0으로 만들어주면 한장의 비트맵으로도 가능할거같네요.

그리고 탱크의 처리는 뭐 대충

00XXXXX
00XXX00
XXXXXXX
XXXMXXX

뭐 이런모양의 탱크가 있다고 하고..ㅡ,.ㅡ;;(물론 0부분은 투명값이겠죠..;;)

여기서 M 으로 표시된 부분을 무개중심이라고 치고..-_-

맵과 탱크를 충돌테스트해서 무개중심이 기울어지면 기울어진쪽으로 탱크를 기울이다가 만약 뭐 대충 기울기가 60도를 넘어가도
맵과 탱크의 충돌이 이루어지지 않으면 다음 충돌이 일어날때까지 탱크를 낙하시킨다거나...-_-

에구, 야근하다가 지쳐서 여기저기 웹서핑 하다가, 옛날 포트리스 했던 기억을 더듬어서 몇자 끄적입니다. :)

체스맨의 이미지

제가 알기론 포트리스는 좌우 스크롤이 됐던 것 같습니다. 화면 한장 분량은 아닐 수 있죠. 물론 제가 말씀 드렸듯이 변형이 일어나는 부분에 대해서만 할당하면 전체 스크롤 부분을 합해서도 화면 한장 분량 이하로 떨어뜨릴 수도 있습니다.

그리고 말씀하신 부분은 어차피 버퍼 하나로 처리한다해도 마스크 채널을 따로 갖고 있는 것과 다를바가 없습니다. 픽스맵이나 텍스쳐의 알파 채널과 같이요.

또한 실제로 맵을 화면에 그릴 때까지 고려해봐야 됩니다. 루프 돌면서 픽셀 하나하나 테스트하는 식은 별로 빠르지 못합니다. GL 함수나 또는 AND-OR 논리 연산 으로 BitBlt 하는 방법을 강구할 수 있도록 하려면 픽셀 색상 정보와 마스크 정보가 뒤섞여있는 방법은 바람직하지 못합니다.

Orion Project : http://orionids.org

Yotun의 이미지

그렇군요. 생각해보니 포트리스는 맵이 종횡으로 모두 스크롤 되는 꽤 큰 분량의 맵을 가지고 있네요.

구현하실분이 GL은 염두해두고 있지 않으신듯하니 그부분은 논외로 하더라도 확실히 화면에 그리기 위해 픽셀 하나씩 모두 검사해본다는것도

무리가 있는 일이네요. 자바를 안다뤄봐서 자바에서 쓸수있는 빝블릿 함수가 어떤게 있는지 잘 모르지만 확실히 논리연산으로 투명값을

스킵 할 수 있는 빠른 함수가 있다면 그부분을 적극 활용할 방법을 강구하는게 맞는 방법이겠네요. :)

투명값이 어쩌구 하면서 머릿속으로는 옛날 2D 스프라이트에 자주 사용하곤하던 0번압축같은걸 생각하고 있었네요.

그래서 드로우루틴의 효율성은 저기 먼먼곳으로 사라진듯...;;;

bookgekgom의 이미지

그렇군염...

저같은 초보는 고수님들의 무공실력에 기가 죽어서 뭐라 할말이 없습니다.

다만 눈을 껌뻑거리며 고개를 끄덕일 뿐...ㅎㅎ

비트 마스크를 사용하는 법을 빨리 익혀야 겠군요.

java bitmask 라고 구글에 치면 리퍼런스가 대략 한줄 뜨더군요.

으허허헣
---------------------------------------------------------------------------

허접한 페도라 가이드 http://oniichan.shii.org

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

keizie의 이미지

그리고 웜즈의 클론인 http://www.wormux.org/ 이 공개되어 있습니다.
여기서 어떤 식으로 했는지 검토해보면 어떨까 싶네요.

bookgekgom의 이미지

지금 다운받고 있습니다.

오오 이런게 있었다니..ㅠ

감사합니다.
-----------------------------------------------------------

허접한 페도라 가이드 http://oniichan.shii.org

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.