Complex String usage.
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#field_summary
String
public String(char[] value,
int offset,
int count)
Allocates a new String that contains characters from a subarray of the character array argument. The offset argument is the index of the first character of the subarray and the count argument specifies the length of the subarray. The contents of the subarray are copied; subsequent modification of the character array does not affect the newly created string.
Parameters:
value - Array that is the source of characters
offset - The initial offset
count - The length
Throws:
IndexOutOfBoundsException - If the offset and count arguments index characters outside the bounds of the value array
"java is always pass-by-value"
https://softwareengineering.stackexchange.com/questions/286008/parameters-are-passed-by-value-but-editing-them-will-edit-the-actual-object-li/286013
The statement that "java is always pass-by-value" is technically correct, but it can be very misleading, because as you have just witnessed, when you pass an object to a function, the function can modify the contents of the object, so it appears that the object has been passed by reference, and not by value. So, what is happening?
Pointers. That's what's happening...
So be careful with parameter pass by reference. In general I do not understand all of previous post, but I can use real project and Debugging technique to figure out how object property change after call method that pass the object as parameter. Compare before and after method call with pass by value vs by reference.
For example when I use refactoring technique Move Class and Move Method, in a function I need pass a property of a object like this:
public class MainGameScreen
{
public ArchAngel AA;
public ReadMedia readMedia;
public GameSettings gameSetting;
...
public void turn_helper2(GameConfig paramg, int paramInt1, int paramInt2)
{
...
case 14:
paramg.m = this.n;
this.av = 90;
i1 = 0;
paramg.a = (60 * turn_helper(i1 + this.av));
paramg.b = (60 * turn_helper2(i1 + this.av));
paramg.e = i1;
paramg.h = (paramg.i = 0);
paramg.j = this.av;
paramg.l = 2;
this.v += 1;
paramg.d = 0;
this.AA.bool_n = true; <-- this is culprit
break;
case 13:
...
}
// Usage
turn_helper2(gameConfigArr[i1], paramInt1, paramInt2);
}
After move to new Class:
public class MainGameHelper {
public void turn_helper2(GameConfig paramg, int paramInt1, int paramInt2, bool_n, ...)
// Instead of pass AA object, I only pass bool_n property value, so when its value change, it do not reflect and take effect to original object AA.
// May be this example is not exactly as pass by reference careless but it look similar and be careful while refactoring
{
...
case 14:
bool_n = true; // Original this.AA.bool_n = true; <-- this is culprit
case 13:
...
}
When MainGameScreen use:
public class MainGameScreen
{
public ArchAngel AA;
public ReadMedia readMedia;
public GameSettings gameSetting;
public MainGameHelper gameHelper = new MainGameHelper();
...
// Usage after method moved
this.gameHelper.turn_helper2(gameConfigArr[i1], paramInt1, paramInt2, this.AA.bool_n ...);
// Bug here because of we should pass whole object this.AA.
It is clear but in real refactoring and real project, it may be very messy and very long method, class that lead to tedious debug time.
}
JME Graphics.drawImage to SpriteBatch.draw()
https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/SpriteBatch.html
Run J2ME apps on Android.
If it work then I do not have to port some game to Android using GDX. But GDX can port to iOS (easy ?).
http://davy.preuveneers.be/phoneme/?q=node/10
http://davy.preuveneers.be/phoneme/?q=node/28
After try some app, I can not make my game work. May be it need some modify before it can run. Event with PhoneME version that noted can fix error "non displacment position...".
Some game have custom package use, ie. com.samsung.util.AudioClip. Can these apk app handle this ?
setClip and clipRect
https://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/javax/microedition/lcdui/Graphics.html#clipRect(int,%20int,%20int,%20int)
https://stackoverflow.com/questions/22576569/libgdx-how-to-clip
Some migrate note J2ME to LibGDX
https://github.com/libgdx/libgdx/wiki/Texture-packer
Graphics.drawImage => SpriteBatch.draw
keyHandle (getGameAction ...) => Custom and implement a similar handler
Image => Texture
Graphics => SpriteBatch (and ...)
Graphics.clipRect, setClip => Scissor ?
RecordStore (DB) => Preference
Binary pack (~image sprite) => Texture array normal image or use Texture-packer, binary pack...
Graphics.fillRect => Implement a similar function, may be use draw image (mono color).
Character (procedural) => Object Hero, Fighter, Enermy ...
game state, screen, school (lever) =>
Front paint() JME to render(), from keyPressed() to touchDown() ...
From JME must have function to GDX game loop, there are some similar mechanism to render screen, handling key event. But when we look at more detail it become somehow quite complex in some case.
Basically I will move paint() from JME to render() or run() (?) and modifying keyPressed() to touchDown() keyDown() on GDX.
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#field_summary
String
public String(char[] value,
int offset,
int count)
Allocates a new String that contains characters from a subarray of the character array argument. The offset argument is the index of the first character of the subarray and the count argument specifies the length of the subarray. The contents of the subarray are copied; subsequent modification of the character array does not affect the newly created string.
Parameters:
value - Array that is the source of characters
offset - The initial offset
count - The length
Throws:
IndexOutOfBoundsException - If the offset and count arguments index characters outside the bounds of the value array
"java is always pass-by-value"
https://softwareengineering.stackexchange.com/questions/286008/parameters-are-passed-by-value-but-editing-them-will-edit-the-actual-object-li/286013
The statement that "java is always pass-by-value" is technically correct, but it can be very misleading, because as you have just witnessed, when you pass an object to a function, the function can modify the contents of the object, so it appears that the object has been passed by reference, and not by value. So, what is happening?
Pointers. That's what's happening...
So be careful with parameter pass by reference. In general I do not understand all of previous post, but I can use real project and Debugging technique to figure out how object property change after call method that pass the object as parameter. Compare before and after method call with pass by value vs by reference.
For example when I use refactoring technique Move Class and Move Method, in a function I need pass a property of a object like this:
public class MainGameScreen
{
public ArchAngel AA;
public ReadMedia readMedia;
public GameSettings gameSetting;
...
public void turn_helper2(GameConfig paramg, int paramInt1, int paramInt2)
{
...
case 14:
paramg.m = this.n;
this.av = 90;
i1 = 0;
paramg.a = (60 * turn_helper(i1 + this.av));
paramg.b = (60 * turn_helper2(i1 + this.av));
paramg.e = i1;
paramg.h = (paramg.i = 0);
paramg.j = this.av;
paramg.l = 2;
this.v += 1;
paramg.d = 0;
this.AA.bool_n = true; <-- this is culprit
break;
case 13:
...
}
// Usage
turn_helper2(gameConfigArr[i1], paramInt1, paramInt2);
}
After move to new Class:
public class MainGameHelper {
public void turn_helper2(GameConfig paramg, int paramInt1, int paramInt2, bool_n, ...)
// Instead of pass AA object, I only pass bool_n property value, so when its value change, it do not reflect and take effect to original object AA.
// May be this example is not exactly as pass by reference careless but it look similar and be careful while refactoring
{
...
case 14:
bool_n = true; // Original this.AA.bool_n = true; <-- this is culprit
case 13:
...
}
When MainGameScreen use:
public class MainGameScreen
{
public ArchAngel AA;
public ReadMedia readMedia;
public GameSettings gameSetting;
public MainGameHelper gameHelper = new MainGameHelper();
...
// Usage after method moved
this.gameHelper.turn_helper2(gameConfigArr[i1], paramInt1, paramInt2, this.AA.bool_n ...);
// Bug here because of we should pass whole object this.AA.
It is clear but in real refactoring and real project, it may be very messy and very long method, class that lead to tedious debug time.
}
JME Graphics.drawImage to SpriteBatch.draw()
https://libgdx.badlogicgames.com/ci/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/SpriteBatch.html
Run J2ME apps on Android.
If it work then I do not have to port some game to Android using GDX. But GDX can port to iOS (easy ?).
http://davy.preuveneers.be/phoneme/?q=node/10
http://davy.preuveneers.be/phoneme/?q=node/28
After try some app, I can not make my game work. May be it need some modify before it can run. Event with PhoneME version that noted can fix error "non displacment position...".
Some game have custom package use, ie. com.samsung.util.AudioClip. Can these apk app handle this ?
setClip and clipRect
https://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/javax/microedition/lcdui/Graphics.html#clipRect(int,%20int,%20int,%20int)
https://stackoverflow.com/questions/22576569/libgdx-how-to-clip
Some migrate note J2ME to LibGDX
https://github.com/libgdx/libgdx/wiki/Texture-packer
Graphics.drawImage => SpriteBatch.draw
keyHandle (getGameAction ...) => Custom and implement a similar handler
Image => Texture
Graphics => SpriteBatch (and ...)
Graphics.clipRect, setClip => Scissor ?
RecordStore (DB) => Preference
Binary pack (~image sprite) => Texture array normal image or use Texture-packer, binary pack...
Graphics.fillRect => Implement a similar function, may be use draw image (mono color).
Character (procedural) => Object Hero, Fighter, Enermy ...
game state, screen, school (lever) =>
Front paint() JME to render(), from keyPressed() to touchDown() ...
From JME must have function to GDX game loop, there are some similar mechanism to render screen, handling key event. But when we look at more detail it become somehow quite complex in some case.
Basically I will move paint() from JME to render() or run() (?) and modifying keyPressed() to touchDown() keyDown() on GDX.
Class Hierarchy
- class java.lang.Object
- class javax.microedition.lcdui.AlertType
- class javax.microedition.lcdui.Command
- class javax.microedition.lcdui.Display
- class javax.microedition.lcdui.Displayable
- class javax.microedition.lcdui.Font
- class javax.microedition.lcdui.Graphics
- class javax.microedition.lcdui.Image
- class javax.microedition.lcdui.Item
- class javax.microedition.lcdui.ChoiceGroup (implements javax.microedition.lcdui.Choice)
- class javax.microedition.lcdui.CustomItem
- class javax.microedition.lcdui.DateField
- class javax.microedition.lcdui.Gauge
- class javax.microedition.lcdui.ImageItem
- class javax.microedition.lcdui.Spacer
- class javax.microedition.lcdui.StringItem
- class javax.microedition.lcdui.TextField
- class javax.microedition.lcdui.Ticker
Interface Hierarchy
- interface javax.microedition.lcdui.Choice
- interface javax.microedition.lcdui.CommandListener
- interface javax.microedition.lcdui.ItemCommandListener
- interface javax.microedition.lcdui.ItemStateListener
Comments
Post a Comment