I have a game on Google Play and it's most common crash is in AssetManager.update (AssetManager.java:375) which me or testers never got and I can not reproduce it. The stack trace does not give anything to go on from what I can see?
com.badlogic.gdx.utils.GdxRuntimeException:
at com.badlogic.gdx.assets.AssetManager.handleTaskError (AssetManager.java:570)
at com.badlogic.gdx.assets.AssetManager.update (AssetManager.java:375)
at com.aperico.game.platformer.screens.SplashScreen.render (SplashScreen.java:94)
at com.aperico.game.platformer.PlatformerGame.render (PlatformerGame.java:283)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame (AndroidGraphics.java:459)
at android.opengl.GLSurfaceView$GLThread.guardedRun (GLSurfaceView.java:1524)
at android.opengl.GLSurfaceView$GLThread.run (GLSurfaceView.java:1248)
Caused by: com.badlogic.gdx.utils.GdxRuntimeException:
at com.badlogic.gdx.assets.AssetLoadingTask.handleAsyncLoader (AssetLoadingTask.java:121)
at com.badlogic.gdx.assets.AssetLoadingTask.update (AssetLoadingTask.java:90)
at com.badlogic.gdx.assets.AssetManager.updateTask (AssetManager.java:498)
at com.badlogic.gdx.assets.AssetManager.update (AssetManager.java:373)
SplashScreen.render()
#Override
public void render(float delta) {
if (Assets.assetManager.update() && !doneLoading) {
Assets.addPersistentAnimations();
Assets.addForestAnimations();
game.load();
doneLoading = true;
}
stage.act();
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.draw();
}
Anyone got some clue as to what is going on?
edit
This is what I do in addPersistentAnimations() and addForestAnimations()
Model model = getModel("data/viking.g3db");
Model aniModel;
aniModel = getModel("data/viking_jump2.g3db");
aniModel.animations.first().id = "jump2";
model.animations.add(aniModel.animations.first());
Related
Here is my Desktop Launcher code:
public class DesktopLauncher {
public static void main (String[] arg) {
Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration();
config.setForegroundFPS(60);
config.setTitle("Game10");
config.setWindowedMode(1240, 760);
config.forceExit = false; // ERROR!!!
new Lwjgl3Application(new GdxGame10(), config);
}
}
In new LWJGL3 config.forceExit not working. I can't find any solution so far. Any help is appreciated.
There is no forceExit in config. So presumably you have a master application that runs a child libGDX component and when you end that child component you find that the entire application shuts down, when you want the master application to continue. I guess you are on desktop because Android would be OK. So you must want to avoid a full System.exit
i.e.
Gdx.app.exit()
shuts down everything.
So when you instantiate a libGDX application you instantiate based on the application type, so for me, I use the same as you
final Lwjgl3Application application = new Lwjgl3Application(Services.GAME_CONTROLLER,config);
and the implementation for exit is
#Override
public void exit () {
running = false;
}
This finished the while loop that drives the application i.e. kills the main thread. If you have -other threads- running in the background they keep going.
If on the other hand you were instantiating LwglAWTCanvas then your shutdown would be this.
#Override
public void exit () {
postRunnable(new Runnable() {
#Override
public void run () {
stop();
System.exit(-1);
}
});
}
which would shut down the entire application. Anyway so forceExit being -false- was to stop a full system exit killing all your threads. The forceExit was to "force" the other threads to finish. It doesn't do that anymore so the fact it is now missing should not matter, your background threads should keep going.
In other words, config.forceExit = false; is now the default behaviour for your application type so you don't need it.
Because of I had problems with Bluetooth on Android Lollipop, I have tried to change the scanner method.
So I have tried to use the new package.
In the previous version, I called startScan(mLeScanCallback) and everything works but now, when I call startScan(mScanCallback) I have the error: "D/BluetoothLeScanner: could not find callback wrapper".
No devices are found and the ListAdapter, I use to show the devices, is empty.
The comment lines are the previous code (and it worked!).
This my code:
public class Selection extends ListActivity implements ServiceConnection {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
// Initializes a Bluetooth adapter through BluetoothManager.
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
getApplicationContext().bindService(new Intent(this, MetaWearBleService.class), this, Context.BIND_AUTO_CREATE);
}
private void scanLeDevice(final boolean enable) {
final BluetoothLeScanner bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
if (enable) {
mHandler.postDelayed(new Runnable() {
#Override
public void run() {
//mBluetoothAdapter.stopLeScan(mLeScanCallback);
bluetoothLeScanner.stopScan(mScanCallback);
setListAdapter(listAdapter);
}
}, SCAN_PERIOD);
//mBluetoothAdapter.startLeScan(mLeScanCallback);
bluetoothLeScanner.startScan(mScanCallback);
} else {
//mBluetoothAdapter.stopLeScan(mLeScanCallback);
bluetoothLeScanner.stopScan(mScanCallback);
setListAdapter(listAdapter);
}
}
private ScanCallback mScanCallback =
new ScanCallback() {
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
#Override
public void run() {
listAdapter.addDevice(device);
}
});
}
};
Instead the ListAdapter extends BaseAdapter and use a ViewHolder. If it necessary, I post it.
So what does it mean "D/BluetoothLeScanner: could not find callback wrapper"? What is it wrong?
Otherwise how I can't resolve the problem of scanning with the Android Lollipop?
In Lollipop I have often errors about BluetoothGatt. I don't know to minized it (or solve it).
Thanks
The log message D/BluetoothLeScanner: could not find callback wrapper appears whenever Android's bluetooth scanning APIs are told top stop scanning for an app when they think scanning has not started. You can see this by looking at the source code of Android's BluetoothLeScanner here.
This is usually safe to ignore as there are lot of reasons that scanning my not have actually started (it was already stopped, bluetooth is off, permissions have not been granted, etc.) Client software that does scanning often stops scanning on a timer regardless of whether it has been successfully started, or whether it was manually stopped before the timer goes off. Android's example code (and the code shown above) does exactly this, often causing these log messages to show up.
If you really want to minimize these messages, you need to keep track of whether scanning actually started and only stop scanning if it actually did. Unfortunately, you don't get a return code if scanning starts successfully, and you only get an asynchronous callback to onScanFailed(errorCode) if you cannot start successfully. So one approach would be to set scanStartCount++; when you call start scan, and set scanStartCount--; when you get a callback to onScanFailed(errorCode). Then when your timer goes off to stop the scan, only actually stop it if the scanStartCount > 0.
Keep in mind that you can only minimize these messages coming from your application. Other applications on the phone doing bluetooth scanning may be causing these messages to be emitted as well.
for the same problem
I had just add permissions :
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.
Manifest.permission.
Manifest.permission.BLUETOOTH_PRIVILEGED,
in your activity call this methods :
checkPermissions(MainActivity.this, this);
public static void checkPermissions(Activity activity, Context context){
int PERMISSION_ALL = 1;
String[] PERMISSIONS = {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.BLUETOOTH_PRIVILEGED,
};
if(!hasPermissions(context, PERMISSIONS)){
ActivityCompat.requestPermissions( activity, PERMISSIONS, PERMISSION_ALL);
}
}
public static boolean hasPermissions(Context context, String... permissions) {
if (context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
hope it's help
I had the same problem with android m.It was due to lack of permissions.Make sure you go to settings and grant location permission to your app
for location permission, only ACCESS_FINE_LOCATION worked. ACCESS_COARSE_LOCATION had the same problem.
I've been trying to create a loading screen, so that the game doesn't freeze when I go from a screen to another, I use this loading screen to load one asset (which is the background image).
My Assets class is defined as following:
public class Assets {
public static final AssetManager manager = new AssetManager();
public static void load(){
manager.load("images/ObservatoryScreenBackground.jpg", Texture.class);
}
public static void dispose(){
manager.dispose();
}
}
I have the following code in my LoadingScreen:
public LoadingScreen(ProjectSurvival game){
super();
this.game = game;
Assets.load();
while(!Assets.manager.update()){
System.out.println("not loaded yet");
}
game.setScreen(new ObservatoryScreen(game));
}
The problem is that the game never exists from this while tread and keeps running, printing "not loaded yet"...
I also tried this in the render method:
if(manager.update()) {
game.setScreen(new ObservatoryScreen(game));
}
The loading screen shows up for 1 second and just after that, the game crashes giving me this error:
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Asset not loaded: images/ObservatoryScreenBackground.jpg
I know there are similar topics, I did exactly what was told, but it doesn't seem to work to me...
Any help would be much appreciated.
Thank you.
I'm developing my own game with eclipse and I tried to export it and test it on an other computer. On my own computer the exported game worked fine but not on the other one. I started the jar from the commandline, so I can see the error and it is the error, mentioned in the headline, "Pixel format not accelerated" in this function (in line "Display.create(...)"):
public static void createDisplay() {
System.out.println("test1");
ContextAttribs attribs = new ContextAttribs(3, 2).withForwardCompatible(true).withProfileCore(true);
try {
System.out.println("test2");
Display.setDisplayMode(new DisplayMode(WIDTH,HEIGHT));
Display.create(new PixelFormat().withDepthBits(24), attribs);
Display.setTitle("Our First Display!");
System.out.println("test3");
GL11.glEnable(GL13.GL_MULTISAMPLE);
} catch (LWJGLException e) {
e.printStackTrace();
}
GL11.glViewport(0,0, WIDTH, HEIGHT);
lastFrameTime = getCurrentTime();
}
Now my question is, how I can get rid of this exception, so I can play the game on the other computer as well...
Thanks for you help :)
Short question...
How do I correctly use UniversalTweenEngine with the Music class in LibGDX?
Long question...
I've encountered a problem with using UniversalTweenEngine and the Music class in LibGDX. I have a MusicAccessor that implements TweenAccessor like so:
public static final int VOLUME = 0;
#Override
public int getValues(Music target, int tweenType, float[] returnValues) {
switch(tweenType) {
case VOLUME:
returnValues[0] = target.getVolume();
return 1;
default:
assert false;
return -1;
}
}
#Override
public void setValues(Music target, int tweenType, float[] newValues) {
switch(tweenType) {
case VOLUME:
target.setVolume(newValues[0]);
break;
default:
assert false;
}
}
first I used it like this:
Tween.registerAccessor(Music.class, new MusicAccessor());
myMusicInstance.setVolume(0);
Tween.to(myMusicInstance, MusicAccessor.VOLUME, 1f).target(1).start();
Which gave me an error saying that
No TweenAccessor was found for the target
I read some on the problem and saw people having the same issue, and the answer to this question told me that I had to use .cast(Music.class) as well, so i changed it to this:
Tween.to(myMusicInstance, MusicAccessor.VOLUME, 1f).cast(Music.class).target(1).start();
which no longer gives me the error. The snag with this is that it doesn't actually tween any value! I've added TweenCallbacks and done System.out.println("text") in the TweenAccessor's methods, and found out that they aren't being called. So how am I supposed to do for it to work?
I reproduced your problem and managed to fix it, so here is a solution.
First of all you need an instance of TweenManager. Then don't forget to start your music (it won't start by itself). Your MusicAccessor class is ok, so no need to change anything there. The final code snippet:
an instance field
private TweenManager tweenManager = new TweenManager();
constructor (or wherever you used it)
Tween.registerAccessor(Music.class, new MusicAccessor());
myMusicInstance.setVolume(0);
myMusicInstance.play();
and then in render:
tweenManager.update(delta);
Tween.to(music, MusicAccessor.VOLUME, 1f).cast(Music.class).target(1).start(tweenManager);
If anything is unclear, please let me know.