Some (hopefully nontrivial) questions about the engine (JME3 on Android):
When will the engine go stable for Android?
1.5)General question: Would you consider the current state of JME3 stable enough to build a commerical game?
Will there be a big difference between the beta and the stable release?
Can the beta project files be used for the stable version without weeks of conversion?
The documentation says the engine converts TouchEvents to mouse clicks, is multitouch still possible? (or are some TouchEvents lost if there is more than one per frame)
Is GIT integration happening anytime soon?
Are there any limitations to the Android version vs. the Deskop version? (Shaders, App lifecycle management, etc.)
(Except the obvious ones like, less RAM etc.) Are they documented anywhere? Like âknown quirksâ or something like that.
Does the config chooser look for CSAA? It comes with very little cost on Tegra GPUs. (CSAA is the only option for Tegra GPUs, MSAA is not supported)
Yes, or without much effort, depends how much changes
Multitouch is possible AFAIK
Its been talked about, but nothing set in stone yet
The android manual lists the main ones. Basically if you want a playable game on android for the majority of platforms, then you need to limit the amount of everything really, as its a weaker platform in general. Its best to have just a few objects, with little to no lighting, and use simple shapes with bullet, for optimum performance.
1.5) I tried it already, it opened with a black screen and after one second it quit without any error messages, Asus Transformer Infinity (TF700), Android 4.0.3
Also the (now quite old?) demos donât work for me (the jMonkeyengine examples in the store), they only work if I disable VBOs and the last two demos didnât work at all.
The Desktop examples look really good, but the Android ones seem hardly working.
@mechanical said:
1.5) I tried it already, it opened with a black screen and after one second it quit without any error messages, Asus Transformer Infinity (TF700), android 4.0.3
Erf...it' s been tested on like 8 or 9 different hardware with adroid version going from 2.2 to 4.0.3 and never had this issue....
You sure logcat does not give some errors?
Other than that, there are plenty of leads to enhance the engine on android and they are currently under study/development.
Usually fill rate is very poor, so shading is very slow, you won't be able to run something designed for desktop without some adaptation.
Baking lighting as much as possible into texture is preferable. Only use lighting on dynamic object and make sure they never get full screen. Use vertex lighting as much as possible instead of pixel lighting.
Edit : and as you witnessed unfortunately, it's a bit difficult to make sure the game runs fine on every hardware/android version combination. It's nice to have a lot of friends with different android powered hardwares ;)
@nehon said:
uh....the app just shut down after starting :(. WTF..??
Thanks anyway for that log.
Before onStart() was called, the app only had 1/2 MB memory to start with (3% of 11079K). Probably once jME3 tried to initialize it wanted to allocate a lot more than 1/2 MB ...
Iâm using multi-touch successfully for 2 virtual joysticks. JME returns a pointerID that you can use to track which touch event the action is associated with.
[java]
private Integer verticalPointerID = null;
private Integer horizontalPointerID = null;
inputManager.addMapping(âTouchâ, new TouchTrigger(TouchInput.ALL));
inputManager.addListener(this, new String[]{âTouchâ});
public void onTouch(String name, TouchEvent event, float tpf) {
boolean consumed = false;
navClickLocation = new Vector2f(event.getX(), event.getY());
switch (event.getType()) {
case DOWN:
if (!verticalMouseDown && verticalPointerID == null) {
if (verticalNavStick.checkSelect(navClickLocation)) { // is the touch event on top of the vertical joystick
verticalPointerID = event.getPointerId(); // record pointerID for MOVE and UP events
for (NavigationListener navListener: navListeners) {
navListener.onNavigationUpdate(verticalMouseDown, verticalNavStick.getNavDirectionPercent().add(horizontalNavStick.getNavDirectionPercent())); // send joystick movement to vehicle to update acceleration
consumed = true;
}
}
}
if (!horizontalMouseDown && horizontalPointerID == null) {
if (horizontalNavStick.checkSelect(navClickLocation)) { // is the touch event on top of the horizontal joystick
horizontalPointerID = event.getPointerId(); // record pointerID for MOVE and UP events
for (NavigationListener navListener: navListeners) {
navListener.onNavigationUpdate(horizontalMouseDown, verticalNavStick.getNavDirectionPercent().add(horizontalNavStick.getNavDirectionPercent())); // send joystick movement to vehicle to update steering
consumed = true;
}
}
}
if (!consumed) {
for (SceneActionListener sceneActionListener: sceneActionListeners) { // touch not a joystick action, do other scene actions
sceneActionListener.onSceneAction(
SceneActionListener.ActionType.ACTION,
true,
tpf,
navClickLocation
);
}
}
break;
case MOVE:
if (verticalMouseDown && verticalPointerID == event.getPointerId()) { // pointerID matches DOWN event for vertical joystick
if (verticalNavStick.checkSelect(navClickLocation)) { // is the touch event on top of the vertical joystick
for (NavigationListener navListener: navListeners) {
navListener.onNavigationUpdate(verticalMouseDown, verticalNavStick.getNavDirectionPercent().add(horizontalNavStick.getNavDirectionPercent())); // send joystick movement to vehicle to update steering and acceleration
consumed = true;
}
}
}
if (horizontalMouseDown && horizontalPointerID == event.getPointerId()) { // pointerID matches DOWN event for horizontal joystick
if (horizontalNavStick.checkSelect(navClickLocation)) {
for (NavigationListener navListener: navListeners) {
navListener.onNavigationUpdate(horizontalMouseDown, verticalNavStick.getNavDirectionPercent().add(horizontalNavStick.getNavDirectionPercent())); // send joystick movement to vehicle to update steering and acceleration
consumed = true;
}
}
}
break;
case UP:
if (verticalMouseDown && verticalPointerID == event.getPointerId()) { // pointerID matches DOWN event for horizontal joystick
verticalPointerID = null; // reset pointerID
verticalMouseDown = false;
verticalNavStick.reset(); // reset joystick graphics to center position
for (NavigationListener navListener: navListeners) {
navListener.onNavigationUpdate(verticalMouseDown || horizontalMouseDown, verticalNavStick.getNavDirectionPercent().add(horizontalNavStick.getNavDirectionPercent())); // send joystick movement to vehicle to zero out acceleration
consumed = true;
}
}
if (horizontalMouseDown && horizontalPointerID == event.getPointerId()) { // pointerID matches DOWN event for horizontal joystick
horizontalPointerID = null; // reset pointerID
horizontalMouseDown = false;
horizontalNavStick.reset(); // reset joystick graphics to center position
for (NavigationListener navListener: navListeners) {
navListener.onNavigationUpdate(verticalMouseDown || horizontalMouseDown, verticalNavStick.getNavDirectionPercent().add(horizontalNavStick.getNavDirectionPercent())); // send joystick movement to vehicle to zero out steering
consumed = true;
}
}
if (!consumed) {
for (SceneActionListener sceneActionListener: sceneActionListeners) { // touch not a joystick action, do other scene actions