Skip to main content

Some Java, J2ME Class, functions

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.





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.Canvas
      • class javax.microedition.lcdui.Screen
        • class javax.microedition.lcdui.Alert
        • class javax.microedition.lcdui.Form
        • class javax.microedition.lcdui.List (implements javax.microedition.lcdui.Choice)
        • class javax.microedition.lcdui.TextBox
    • class javax.microedition.lcdui.Font
    • class javax.microedition.lcdui.Graphics
    • class javax.microedition.lcdui.Image
    • class javax.microedition.lcdui.Item
    • class javax.microedition.lcdui.Ticker

Interface Hierarchy


Comments

Popular posts from this blog

AWS Elasticache Memcached connection

https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/accessing-elasticache.html#access-from-outside-aws http://hourlyapps.blogspot.com/2010/06/examples-of-memcached-commands.html Access memcached https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/GettingStarted.AuthorizeAccess.html Zip include hidden file https://stackoverflow.com/questions/12493206/zip-including-hidden-files phpmemcachedadmin ~ phpMyAdmin or phpPgAdmin ... telnet mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com 11211 stats items stats cachedump 27 100 https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/VPCs.EC.html https://lzone.de/cheat-sheet/memcached VPC ID Security Group ID (sg-...) Cluster: The identifier for the cluster memcached1 Creation Time: The time (UTC) when the cluster was created January 9, 2019 at 11:47:16 AM UTC+7 Configuration Endpoint: The configuration endpoint of the cluster memcached1.ahgofe.cfg.usw1.cache.amazonaws.com:11211 St...

Notes Windows 10 Virtualbox config, PHP Storm Japanese, custom PHP, Apache build, Postgresql

 cmd => Ctrl + Shift + Enter mklink "C:\Users\HauNT\Videos\host3" "C:\Windows\System32\drivers\etc\hosts" https://www.quora.com/How-to-create-a-router-in-php https://serverfault.com/questions/225155/virtualbox-how-to-set-up-networking-so-both-host-and-guest-can-access-internet 1 NAT + 1 host only config https://unix.stackexchange.com/questions/115464/how-to-properly-set-up-2-network-interfaces-in-centos-running-in-virtualbox DEVICE=eth0 TYPE=Ethernet #BOOTPROTO=dhcp BOOTPROTO=none #IPADDR=10.9.11.246 #PREFIX=24 #GATEWAY=10.9.11.1 #IPV4_FAILURE_FATAL=yes #HWADDR=08:00:27:CC:AC:AC ONBOOT=yes NAME="System eth0" [root@localhost www]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 # Advanced Micro Devices, Inc. [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth1 IPADDR=192.168.56.28 <= no eff => auto like DHCP #GATEWAY=192.168.56.1 #BOOTPROTO=dhcp BOOTPROTO=static <= no eff ONBOOT=yes HWADDR=08:00:27:b4:20:10 [root@localhost www]# ...

Rocket.Chat DB schema

_raix_push_notifications avatars.chunks avatars.files instances meteor_accounts_loginServiceConfiguration meteor_oauth_pendingCredentials meteor_oauth_pendingRequestTokens migrations rocketchat__trash rocketchat_cron_history rocketchat_custom_emoji rocketchat_custom_sounds rocketchat_import rocketchat_integration_history rocketchat_integrations rocketchat_livechat_custom_field rocketchat_livechat_department rocketchat_livechat_department_agents rocketchat_livechat_external_message rocketchat_livechat_inquiry rocketchat_livechat_office_hour rocketchat_livechat_page_visited rocketchat_livechat_trigger rocketchat_message rocketchat_oauth_apps rocketchat_oembed_cache rocketchat_permissions rocketchat_raw_imports rocketchat_reports rocketchat_roles rocketchat_room rocketchat_settings rocketchat_smarsh_history rocketchat_statistics rocketchat_subscription rocketchat_uploads system.indexes users usersSessions https://rocket.chat/docs/developer-guides/sc...