마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

바야바 엔진에서 스프라이트 오류가 납니다.

0 추천

안녕하세요 바야바 게임엔진을 처음 사용하는 사람입니다.

해당 엔진을 사용해 보고 싶은 마음에

 

http://blog.naver.com/gksthf7051/220153844413

위 블로그를 보고 로고를 출력하는 코드를 작성하고 있었는데, 아래같은 에러가 납니다.

정말 도대체 왜 이러한 오류가 나는건지 정말 모르겠습니다... ㅠㅠ

 

바야바 엔진을 사용하셨던 분이나 해당 오류가 왜 나는지 알 수 있으신 분은 답변해주시면 감사하겠습니다!

 

===============에러====================
07-02 01:04:11.008: E/dalvikvm-heap(17999): Out of memory on a -917957272-byte allocation.
07-02 01:04:11.008: E/AndroidRuntime(17999): FATAL EXCEPTION: GLThread 1463
07-02 01:04:11.008: E/AndroidRuntime(17999): Process: bayaba.game.basic, PID: 17999
07-02 01:04:11.008: E/AndroidRuntime(17999): java.lang.OutOfMemoryError
07-02 01:04:11.008: E/AndroidRuntime(17999):  at bayaba.engine.lib.Sprite.LoadSprite(Sprite.java:550)
07-02 01:04:11.008: E/AndroidRuntime(17999):  at bayaba.game.basic.GameMain.LoadGameData(GameMain.java:32)
07-02 01:04:11.008: E/AndroidRuntime(17999):  at bayaba.game.basic.SurfaceClass.onSurfaceCreated(SurfaceClass.java:27)
07-02 01:04:11.008: E/AndroidRuntime(17999):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1501)
07-02 01:04:11.008: E/AndroidRuntime(17999):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
07-02 01:04:23.791: E/dalvikvm-heap(18394): Out of memory on a -917957272-byte allocation.
07-02 01:04:23.791: E/AndroidRuntime(18394): FATAL EXCEPTION: GLThread 1493
07-02 01:04:23.791: E/AndroidRuntime(18394): Process: bayaba.game.basic, PID: 18394
07-02 01:04:23.791: E/AndroidRuntime(18394): java.lang.OutOfMemoryError
07-02 01:04:23.791: E/AndroidRuntime(18394):  at bayaba.engine.lib.Sprite.LoadSprite(Sprite.java:550)
07-02 01:04:23.791: E/AndroidRuntime(18394):  at bayaba.game.basic.GameMain.LoadGameData(GameMain.java:32)
07-02 01:04:23.791: E/AndroidRuntime(18394):  at bayaba.game.basic.SurfaceClass.onSurfaceCreated(SurfaceClass.java:27)
07-02 01:04:23.791: E/AndroidRuntime(18394):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1501)
07-02 01:04:23.791: E/AndroidRuntime(18394):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)







=============================소스코드=====================================


package bayaba.game.basic;

import java.util.Random;

import javax.microedition.khronos.opengles.GL10;

import android.content.Context;
import bayaba.engine.lib.GameInfo;
import bayaba.engine.lib.GameObject;
import bayaba.engine.lib.Sprite;

public class GameMain {
 public GL10 mGL = null; // OpenGL 객체
 public Context MainContext;
 public Random MyRand = new Random(); // 랜덤 발생기
 public GameInfo gInfo; // 게임 환경 설정용 클래스 : MainActivity에 선언된 것을 전달 받는다.
 public float TouchX, TouchY;

 private Sprite logoSpr = new Sprite();
 private GameObject logoObj = new GameObject();
 public int GameMode;

 public GameMain(Context context, GameInfo info) // 클래스 생성자 (메인 액티비티에서 호출)
 {
  MainContext = context; // 메인 컨텍스트를 변수에 보관한다.
  gInfo = info; // 메인 액티비티에서 생성된 클래스를 가져온다.
 }

 public void LoadGameData() // SurfaceClass에서 OpenGL이 초기화되면 최초로 호출되는 함수
 {
  // 게임 데이터를 로드합니다.
  logoSpr.LoadSprite(mGL, MainContext, "logo.spr"); // 이 부분에서 에러가 남.

  logoObj.SetObject(logoSpr, 0, 0, 240, 400, 0, 0);
  logoObj.trans = 0.0f;
  logoObj.scroll = false;

  GameMode = 0;
 }

 public void PushButton(boolean push) // OpenGL 화면에 터치가 발생하면 GLView에서 호출된다.
 {
  // 터치를 처리합니다.
 }

 public void DoGame() // 1/60초에 한번씩 SurfaceClass에서 호출된다. 게임의 코어 부분을 넣는다.
 {
  synchronized (mGL) {
   // 게임의 코어 부분을 코딩합니다.
   if (GameMode == 0) {
    if (logoObj.move == 0) {
     logoObj.trans += 0.033f;

     if (logoObj.trans >= 1) {
      logoObj.trans = 1;
      logoObj.move = 1;
      logoObj.atimer = System.currentTimeMillis();

      // Music.start();
     }
    } else if (logoObj.move == 1) {
     if (System.currentTimeMillis() - logoObj.atimer >= 2000) {
      logoObj.move = 2;
     }

    } else if (logoObj.move == 2) {
     logoObj.trans -= 0.033f;
    }

    if (logoObj.trans <= 0) {
     LoadGameData();
    }
   } else if (GameMode == 1) {
   }

   if (GameMode == 0) {
    logoObj.DrawSprite(gInfo);
   } else if (GameMode == 1) {

   }
  }
 }
}

==================================================================

 

nandroid (1,620 포인트) 님이 2015년 7월 2일 질문

3개의 답변

0 추천
 
채택된 답변
해당 문제 해결 완료했습니다.

 

어이없게도 바야바 엔진에서 제공하는 BasicProject에 있는 lib파일을 최신버전으로 교체하지 않았기 때문에 발생하는 문제였습니다.

 

해당 홈페이지를 샅샅히 뒤져 본 결과 2014년 lib파일로는 2015년 spr/ani 제작 툴로 만든 이미지 로딩이 되지 않는다더군요.

 

해당 파일을 최신버전으로 교체한 뒤 정상작동 확인 했습니다.

 

답변 달아주신 분들 모두 감사드립니다!
nandroid (1,620 포인트) 님이 2015년 7월 2일 답변
+1 추천

제가 바야바 엔진은 알지 못해서 정확한건 알수 없지만 일단 에러는 메모리 확보에서 실패했기 때문으로 보입니다.

Out of memory on a -917957272-byte allocation

로고 스프라이트가 얼마나 큰지는 모르겠는데 지금 스프라이트를 로드하는 과정에서 메모리를 할당하게 되는데 이때 할땅 할 용량이 -값을 계산되고 있는 듯합니다.

logo.spr에 문제가 없는지 확인해보시는 것이 어떨지요?.

부호있는 숫의 경우 실제 값이 너무 커져서 범위를 넘어서게 되면 -로되는 경우도 있으니 너무 큰지혹은 너무작아서 충족을 스키실수 없는 것인지, 아니면 logo.spr이라는 데이터에 접근할 방법이 없는 것인지 등을 살펴보시라고 일반적인 수준의 이야기만 할 수 있을 듯 합니다.

컴러기 (22,230 포인트) 님이 2015년 7월 2일 답변
우선 빠른 답변감사드립니다!!
너무 작을 경우에도 -값이 나올 수 있는것인가요???
해당 이미지파일이 검은색 배경에 흰색 로고라서 굉장히 용량이 작아서요...
이미지 파일을 수정해서 spr 파일을 다시 만들어보고 결과 답글 달겠습니다! 다시 한 번 감사드려요~~~
다른 이미지로 만들어도 결과는 같네요..ㅠㅠ
도대체 뭐가 문제인지 오늘 하루도 여기에 매달려봐야겠어요...
말씀해주신 메모리 부분에 관해 홈페이지를 샅샅히 뒤져 본 결과 해결 할 수 있었습니다.
답변 다시한번 정말 감사드립니다!!!
+1 추천
이건 제작자한테 물어봐야할 것 같은데요?

라이브러리에서 너무 작을 때 사이즈 계산이 오류가 있을 수 있죠.

바야바라고 활동하는 분한테 쪽지 보내봐요.
익명사용자 님이 2015년 7월 2일 답변
제작자분이 굉장히 바쁘신 듯 하더라구요..ㅠㅠ
우선 제작자분 홈페이지에 질문은 올려 놓았습니다만 아직까지 답글이 없어요ㅠㅠ
툴 버전 문제였습니다. 역시 이런건 제작자에게 묻는게 맞군요.
...