Java/LibGDX 从用户数据中获取精灵
Java/LibGDX get sprite from userdata
我正在尝试从 fixtures userdata 访问 sprite,这应该可以正常工作,但出现了这个错误:
Exception in thread "LWJGL Application" java.lang.ClassCastException: java.lang.String cannot be cast to com.freeranger.colorcourse.entities.EvilE
at com.freeranger.colorcourse.handlers.MyContactListener.beginContact(MyContactListener.java:74)
at com.badlogic.gdx.physics.box2d.World.beginContact(World.java:985)
at com.badlogic.gdx.physics.box2d.World.jniStep(Native Method)
at com.badlogic.gdx.physics.box2d.World.step(World.java:689)
at com.freeranger.colorcourse.screens.Play.update(Play.java:185)
at com.freeranger.colorcourse.screens.Play.render(Play.java:202)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.freeranger.colorcourse.Main.render(Main.java:139)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:126)
导致问题的代码是这个:
String[] data = {"red", "orange", "yellow", "green", "blue", "pink", "orange_gravity_block"};
for(int i = 0; i < data.length; i++){
if(fa.getUserData() != null && fa.getUserData().equals(data[i])){
if (fb.getUserData() != null && fb.getUserData().equals("evile_left_sensor")) {
((EvilE)fb.getUserData()).reverseVelocity(); //this causes error
}else if (fb.getUserData() != null && fb.getUserData().equals("evile_right_sensor")) {
((EvilE)fb.getUserData()).reverseVelocity(); //this causes error
}
}
}
在我的游戏中 class 此代码将用户数据设置为 Evil-E(敌人):
EvilE c = new EvilE(body, game);
eviles.add(c);
body.setUserData(c);
碰撞全部发生在我的 Contact Listener 中,而我试图访问的敌人 (EvilE) 在我的 Play 中 class(PlayScreen)。
我的敌人在撞墙时会改变方向,但他们并没有改变方向 - 相反,游戏崩溃了,我得到了我之前显示的错误。我该如何解决这个问题?
谢谢!
您正在将 EvilE 对象设置到用户数据中
EvilE c = new EvilE(body, game);
eviles.add(c);
body.setUserData(c); // c is an EvilE object
在这里你期望得到一个字符串:
fa.getUserData().equals(data[i]) //fa.getUserData() is EvilE and data[i] is a String
此处您尝试比较 EvilE
对象与 String 对象是否相等。在某些时候,EvilE.equals
方法 String
被转换为 EvileE
类型,这就是为什么你得到 java.lang.ClassCastException
.
编辑
您可以将 属性 添加到 EvilE 对象中,例如String status
并以此 属性 进行比较。例如((EvilE)fa.getUserData()).getStatus().equals(data[i])
我正在尝试从 fixtures userdata 访问 sprite,这应该可以正常工作,但出现了这个错误:
Exception in thread "LWJGL Application" java.lang.ClassCastException: java.lang.String cannot be cast to com.freeranger.colorcourse.entities.EvilE
at com.freeranger.colorcourse.handlers.MyContactListener.beginContact(MyContactListener.java:74)
at com.badlogic.gdx.physics.box2d.World.beginContact(World.java:985)
at com.badlogic.gdx.physics.box2d.World.jniStep(Native Method)
at com.badlogic.gdx.physics.box2d.World.step(World.java:689)
at com.freeranger.colorcourse.screens.Play.update(Play.java:185)
at com.freeranger.colorcourse.screens.Play.render(Play.java:202)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.freeranger.colorcourse.Main.render(Main.java:139)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:225)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.run(LwjglApplication.java:126)
导致问题的代码是这个:
String[] data = {"red", "orange", "yellow", "green", "blue", "pink", "orange_gravity_block"};
for(int i = 0; i < data.length; i++){
if(fa.getUserData() != null && fa.getUserData().equals(data[i])){
if (fb.getUserData() != null && fb.getUserData().equals("evile_left_sensor")) {
((EvilE)fb.getUserData()).reverseVelocity(); //this causes error
}else if (fb.getUserData() != null && fb.getUserData().equals("evile_right_sensor")) {
((EvilE)fb.getUserData()).reverseVelocity(); //this causes error
}
}
}
在我的游戏中 class 此代码将用户数据设置为 Evil-E(敌人):
EvilE c = new EvilE(body, game);
eviles.add(c);
body.setUserData(c);
碰撞全部发生在我的 Contact Listener 中,而我试图访问的敌人 (EvilE) 在我的 Play 中 class(PlayScreen)。
我的敌人在撞墙时会改变方向,但他们并没有改变方向 - 相反,游戏崩溃了,我得到了我之前显示的错误。我该如何解决这个问题?
谢谢!
您正在将 EvilE 对象设置到用户数据中
EvilE c = new EvilE(body, game);
eviles.add(c);
body.setUserData(c); // c is an EvilE object
在这里你期望得到一个字符串:
fa.getUserData().equals(data[i]) //fa.getUserData() is EvilE and data[i] is a String
此处您尝试比较 EvilE
对象与 String 对象是否相等。在某些时候,EvilE.equals
方法 String
被转换为 EvileE
类型,这就是为什么你得到 java.lang.ClassCastException
.
编辑
您可以将 属性 添加到 EvilE 对象中,例如String status
并以此 属性 进行比较。例如((EvilE)fa.getUserData()).getStatus().equals(data[i])