标签: andengine

AndEngine游戏的优化

我在游戏中使用java + AndEngine.

在游戏中我有一些冻结,我寻找信息,并找到了如何优化游戏性能的一些步骤:

  1. 避免在游戏中的主要动作中调用GC(垃圾收集器):
    a)在游戏时不要创建对象;
    b)不要制造不必要的物品;
  2. 优化经常重复的代码

我遵循了这些步骤,但从来没有在游戏过程中遇到过一些冻结.

现在我在游戏开始之前创建并加载所有纹理并且不卸载它们,这是一个坏主意吗?我如何优化游戏过程?也许我必须在主要活动之前释放所有可能的内存,然后在每个级别之后重新加载它们?

performance android freeze game-physics andengine

11
推荐指数
4
解决办法
6812
查看次数

不同屏幕尺寸Andengine Android上的精灵尺寸

"我正在使用Android Adnengine开发我的第一款游戏.这是一个从顶视图的赛车游戏.我使用了视差背景和一些汽车.我在我的设备上测试了它,它的宽度和高度都较小.

我根据相机的宽度,高度放置了32和64的车.我的屏幕尺寸工作得很好但是在更大的屏幕尺寸上,比如Galaxy Tab,游戏中留下了一个巨大的空间,因为汽车的尺寸与我必须以2的力量使用它们相同.

如何使用适合所有屏幕尺寸的图像?我是否必须根据不同相机宽度和高度的图像尺寸使用不同的图像?我相信有一个解决方案.

我已经修改了我的清单文件以支持小,大和xlarge大小.

  public Engine onLoadEngine() {

    final Display display = getWindowManager().getDefaultDisplay();
    CAMERA_WIDTH = display.getWidth();
    CAMERA_HEIGHT = display.getHeight();

    //Toast.makeText(getApplicationContext(), CAMERA_WIDTH, 3);

    mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
    engine = new Engine(new EngineOptions(true,
            ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(
                    CAMERA_WIDTH, CAMERA_HEIGHT), mCamera).setNeedsMusic(
            true).setNeedsSound(true));

    return engine;
}
Run Code Online (Sandbox Code Playgroud)

android andengine

11
推荐指数
1
解决办法
6693
查看次数

某些手机​​的Andengine低FPS

我的游戏在大多数手机上运行良好(56 FPS),但其他游戏的运行速度约为25 FPS.在我的游戏中,我有3个粒子系统,据我所知,问题来自于此.我的问题:如果我检测到FPS低于30,那么停止产生粒子是个好主意吗?如果FPS更高,则只需正常运行.我不确定这是否会导致任何问题.还有其他解决方案吗?

java android frame-rate andengine

11
推荐指数
1
解决办法
1150
查看次数

使用AndEngine GLES2在游戏中使用Sprites的最佳实践

目前我正在对我的所有精灵进行静态引用,并在SimpleBaseGameActivity的OnCreateResource方法中加载和初始化它们,但是现在我必须在spirtes上覆盖onAreaTouched监听器以及在初始化Sprite时我可以覆盖它的方式.但我有一个静态方法为每个精灵创建Atlas和Texture Region.我在我的场景类中使用这些精灵,我想在那里覆盖onAreaTouched.我可以在我的场景中为特定的精灵注册TouchArea,这样就可以完成但是我想以某种方式覆盖OnAreaTouched,以便可以完成代码的可重用性.这是我目前正在创建和加载精灵的方式.

defualtCageSprite = createAndLoadSimpleSprite("bg.png", this, 450, 444);
Run Code Online (Sandbox Code Playgroud)

这是我的方法createAndLoadSimpleSprite.

public static Sprite createAndLoadSimpleSprite(String name,
        SimpleBaseGameActivity activity, int width, int height) {

    BitmapTextureAtlas atlasForBGSprite = new BitmapTextureAtlas(
            activity.getTextureManager(), width, height);
    TextureRegion backgroundSpriteTextureRegion = BitmapTextureAtlasTextureRegionFactory
            .createFromAsset(atlasForBGSprite, activity, name, 0, 0);
    Sprite sprite = new Sprite(0, 0, backgroundSpriteTextureRegion,
            activity.getVertexBufferObjectManager());
    activity.getTextureManager().loadTexture(atlasForBGSprite);

    return sprite;
}
Run Code Online (Sandbox Code Playgroud)

现在,如何在不丢失代码可重用性的情况下覆盖某些精灵的onAreaTouched.

java code-reuse android opengl-es-2.0 andengine

11
推荐指数
1
解决办法
3384
查看次数

避免"找不到EGLConfig!" 错误

我的一位用户正在为我的游戏报告此错误.

我使用andengine作为我的引擎.这是错误.

java.lang.IllegalArgumentException: No EGLConfig found!
at org.andengine.opengl.view.ConfigChooser.chooseConfig(ConfigChooser.java:183)
at org.andengine.opengl.view.ConfigChooser.chooseConfig(ConfigChooser.java:157)
at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:916)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1246)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1116)
Run Code Online (Sandbox Code Playgroud)

我的问题是,有什么办法可以避免这个错误吗?

android andengine

10
推荐指数
1
解决办法
1万
查看次数

如何以双倍分辨率获取屏幕截图?

如果手机的显示尺寸为320x480,则AndEngine以相同的1:1分辨率执行screenCapture().

我尝试改变表面尺寸......我尝试以双倍分辨率生成相机......我尝试缩放mRenderSurfaceView ....

但是,screenCapture()将始终以320x480分辨率保存文件,即实际设备的分辨率.

所以任何人都可以帮我展示如何以双分辨率获得屏幕截图?

android andengine

10
推荐指数
1
解决办法
439
查看次数

我为什么得到:threadid = 3:对信号3和游戏冻结(AndEngine)作出反应?

我正在使用AndEngine制作一款可以处理大量移动精灵的游戏.它是不一致的,但最终我在log cat中得到一条消息(threadid = 3:对信号3作出反应)并且游戏冻结了.这个错误是什么意思?我已经缩小了它发生的代码(它被标记):

private void levelComplete(){
        runOnUiThread(new Runnable() {
            public void run() {
                 Toast.makeText(TestGFX5Activity.this, "Level Complete", Toast.LENGTH_SHORT).show();
            }
        });
        Log.e("Level Complete","Going to reset values");
        //Reset values
        level++;
        fillerCount = (originalNumberOfFillers + level - 1);
        areaFilled=0;
        fillAreaPercent = 0;

        //Rid scene of sprites
        for(int x=0;x<=fillerNum;x++){  
            filler[x].body.setActive(false);
            scene.detachChild(filler[x].sprite);
            filler[x].active=false;
            filler[x].scale=originalSpriteScale;
            filler[x].body.setUserData("inactive");
        }
        levelText.setText("Level: "+Integer.toString(level));
        fillersLeftText.setText("Balls left: "+Integer.toString(fillerCount));
        percentFilledText.setText("0%");
        fillerNum = -1;

        Log.e("Level Complete","values reset");

        randx = random.nextInt(650) + 25;
        randy = random.nextInt(400) + 25;
        randix = random.nextInt(10);
        randiy = random.nextInt(10);
        if(randix%2==0) …
Run Code Online (Sandbox Code Playgroud)

multithreading android freeze andengine

9
推荐指数
1
解决办法
2万
查看次数

即使在连接上也不会调用Android Websockets onMessage()

我正在使用websockets进行多人游戏,我需要在服务器上发送多种类型的数据,但是当我连接到服务器时,它应该分别发回一个名称和号码("类型")和("数据")来自连接上的websocket库.我不需要类型,但("数据")对于游戏逻辑实际工作至关重要.

下面是我的websockets onMessage()函数中的代码:

@Override
public void onMessage(String message)
{                       
    try 
    {
         JSONObject json = new JSONObject(message);
         if(json.has("type") && json.has("data"))
         {
             Log.d(TAG, json.getString("type"));
             Log.d(TAG, json.getString("data"));
             playerNum = Integer.parseInt(json.getString("data"));
             Log.d(TAG,"Received... Type : " +json.getString("type")+" Data : "+json.getString("data"));
         }
         if(json.has("Player1TurnOver"))
         {
             player1TurnOver = json.getBoolean("Player1TurnOver");
         }

         if(json.has("Word"))
         {
            String b = json.getString("Word");
            bWord = new char[b.length()];
            for(int i = 0; i < b.length(); i++)
            {
                 bWord[i] = b.charAt(i);
            }
         wordLength = bWord.length;
        }
     }
     catch(JSONException e)         
     {                  
     }              
}
Run Code Online (Sandbox Code Playgroud)

但是,即使客户端有一个监听器,也不会从服务器调用它:

mClient = new WebSocketClient(URI.create("ws://some_ip:8080/wstest"), …
Run Code Online (Sandbox Code Playgroud)

java client android websocket andengine

9
推荐指数
1
解决办法
989
查看次数

AndEngine上的样品

我想学习AndEngine.

我应该怎么开始?我没有看到任何好的例子.我甚至尝试为AndEngine和MagneTank找到可下载的源代码,但没有运气.

eclipse android andengine

8
推荐指数
4
解决办法
5307
查看次数

BaseGameActivity.runOnUpdateThread()与Entity.registerUpdateHandler()

如果我执行一个Runnablewith runOnUpdateThread()或者我将一个更新处理程序注册到一个Entity并用它执行代码有什么区别吗?

我想Sprite从场景中删除一个Sprite.detachSelf().在本例中,教程说必须在Update Thread中调用此方法BaseGameActivity.runOnUpdateThread().但是使用这个解决方案,我必须将活动对象传递给想要使用的每个对象runOnUpdateThread().嗯......我不喜欢它.

我的问题是,如果我RunnableHandler在Entity中创建一个对象并注册它registerUpdateHandler()并添加了新的Runnable RunnableHandler,这个解决方案是否与该runOnUpdateThread()功能相同.这是Runnable在更新线程中执行的吗?

/* MySprite is attached to a Scene object */
public class MySprite extends Sprite {
   private final RunnableHandler UPDATE_HANDLER = new RunnableHandler();

   public MySprite() {
       registerUpdateHandler(UPDATE_HANDLER);
   }

   /* called when the sprite has to be removed from scene */
   public void removeMyself() {
       Runnable r = new Runnable() {
           public void run() {
               detachSelf(); …
Run Code Online (Sandbox Code Playgroud)

android andengine

8
推荐指数
1
解决办法
255
查看次数