흠 학교에서 레밍즈를 짜고 있는데...

aNsITAte의 이미지

배경하고 레밍들하고 그려주는 문제가 상당히 까다롭네요.

단일 배경에 다수의 움직이는 객체가 있을때

객체가 움직일때 이전의 배경을 복원하고 다시 그리는

이런 상황에서 쓸 수 있는 일반적인 구조 (디자인?)가 있는지 알고

싶습니다.

더블버퍼링으로 각각을 그리면 좀 빡세기도 하고

배경을 하나로만 하면 레밍이 겹칠때 안그려지는 문제도 있네요.

레밍 애니메이션 자체는 스레드로 하고

레밍이 움직이는 것은 timer 에 기반해서 동작하고 있습니다.

혹시 참고할 만한 자료나 이런 일에 쓸만한 라이브러리라도 소개해 주시면 감사~ ^^;;

ps. 일단 제가 생각한 것은

레밍이 하나 새롭게 그려져야할때마다

레밍들이 이전에 있던 위치를 RECT들의 배열로 조사하고

이 배열 부분의 배경을 다시 그리고

레밍들을 현재 위치에 맞게 다시 그려주는 식으로 구성을 생각하고 있습니다.

File attachments: 
첨부파일 크기
Image icon test.JPG56.85 KB
익명 사용자의 이미지

sdl에서 sprite를 사용하는 것이 일반적이지 않은가 생각해 봅니다.

monpetit의 이미지

eternalbleu wrote:
레밍이 하나 새롭게 그려져야할때마다

레밍들이 이전에 있던 위치를 RECT들의 배열로 조사하고

이 배열 부분의 배경을 다시 그리고

레밍들을 현재 위치에 맞게 다시 그려주는 식으로 구성을 생각하고 있습니다.


이 방식을 dirty rectangle 방식이라고 합니다.
화면 전체를 다시 그려줄 필요가 없기 때문에 비교적 빠르죠.
SDL이나 pygame, 또는 allegro 라이브러러에 포함되어 있는 예제에 많이 사용됩니다. 참고하세요.
aNsITAte의 이미지

SDL sprite 를 사용하는 간단한 예제를 구할 수 잇을까요?
정말로 최고로 간단한 -_-;;

sprite 를 이용하면 배경에 대해서 신경안쓰고 sprite 만 그려주면 되는지도 궁금하네요.

익히는데 얼마나 걸릴지 모르니.. -_-;; 2주남은 시점에서 익히는데 시간이 더 걸리면 곤란한데...

그립다는 것은 아직도 네가 내 안에 남아 있다는 뜻이다.
그립다는 것은 지금은 너를 볼 수 없다는 뜻이다.
볼 수는 없지만 보이지 않는 내 안 어느 곳에 네가 남아 있다는 뜻이다.
-이정하의 《혼자 사랑한다는 것은》중에서-

익명 사용자의 이미지

저는 python sdl 인 pygame밖에 안써서 굉장히 간단했습니다.

pygame.org에서 튜토리얼 보시면 쉬운데요.
python으로 개발한게 아니라면 모르겠습니다.
SDL은 애초에 C였나 C++로 작성된 라이브러리고요, 여러 언어로 포팅된 것
같더군요. 사용하시는 언어와 함께 sdl을 키워드로 구글링해보시면
좋은 결과가 있기를 바랍니다?

chadr의 이미지

게임의 기본적인 구조를 보자면 대부분 게임루프 라는것을 만들고 매 루프마다 사용자의 입력을 체크하여 게임 객체를 움직이거나 그림을 바꾸거나 하는 게임 데이터를 업데이트 후 그 데이터를 토대로 전체 화면을 재 렌더링하는 구조를 가집니다. 그러기 위해서는 그래픽 카드로의 렌더링이 빨라야 하는데 윈도우의 GDI로는 택도 없습니다-_-);

그려지기는 그려지겠지만 무지 느려진다는 것입니다.

가능하면 Direct draw와 같은 것을 쓰시라고 권장하고 싶지만.. 시간이 없으신것 같으니까 기존 GDI로 하시되 더블 버퍼링은 쓰셔야 할 것입니다. 더블 버퍼링을 안쓰시면 아무리 작은 곳을 재렌더링 한다고 해도 조금만 느린 컴이나 컴퓨터 반응이 느려지면 바로 깜빡임이 눈에 보일것입니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

monpetit의 이미지

chadr wrote:
게임의 기본적인 구조를 보자면 대부분 게임루프 라는것을 만들고 매 루프마다 사용자의 입력을 체크하여 게임 객체를 움직이거나 그림을 바꾸거나 하는 게임 데이터를 업데이트 후 그 데이터를 토대로 전체 화면을 재 렌더링하는 구조를 가집니다. 그러기 위해서는 그래픽 카드로의 렌더링이 빨라야 하는데 윈도우의 GDI로는 택도 없습니다-_-);

그려지기는 그려지겠지만 무지 느려진다는 것입니다.

가능하면 Direct draw와 같은 것을 쓰시라고 권장하고 싶지만.. 시간이 없으신것 같으니까 기존 GDI로 하시되 더블 버퍼링은 쓰셔야 할 것입니다. 더블 버퍼링을 안쓰시면 아무리 작은 곳을 재렌더링 한다고 해도 조금만 느린 컴이나 컴퓨터 반응이 느려지면 바로 깜빡임이 눈에 보일것입니다.


dirty rectangle 방식을 사용한다고 해서 Direct Draw를 사용하지 않는 게 아닙니다. 기본적으로 Direct Draw를 사용한다 하더라도 더블버퍼링이 느리기 때문에 사용하는 겁니다.
더블버퍼링은 화면 갱신 범위에 대해 고려하지 않고 화면 전체를 다시 그려주는 방식입니다. 장점은 화면 갱신 범위를 복잡하게 기억하지 않으니까 간편하다는 점입니다만, 화면이 작거나(320 x 240) 하드웨어가 좋아야만 그럭저럭 게임다와 보이는 게 단점이죠.
chadr의 이미지

monpetit wrote:
더블버퍼링은 화면 갱신 범위에 대해 고려하지 않고 화면 전체를 다시 그려주는 방식입니다.

음.. 제가 말한 더블버퍼링은 전체 화면을 더블버퍼링이 아니라 dirty rectangle 부분을 더블 버퍼링 하는 것이었습니다... :)

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.