You are on page 1of 50

Lp trnh game trn di ng vi J2ME

Mc lc
A. Cc mc ha trong J2ME 3 I. Tng quan v J2ME .3 1. Gii thiu v J2ME . ..3 2. Kin trc ca J2ME ...3 3. Cn bn v lp trnh trn J2ME .6 II.Cc thnh phn ha mc cao ca ng dng MIDP ..9 III. Cc thnh phn ha mc thp ca ng dng MIDP .21 1. Lp Canvas 21 2. Graphics .24 B.ng dng Game trong J2ME ..34 I. S lc v lp trnh Game trn J2ME.34 1. Game Canvas ..34 2. Layer ...36 3. Sprite ...38 4. LayerManager .39 5. TiledLayer ...41 II. Xy dng Game vi Game Builder trong IDE NetBeans .42

Lp trnh game trn di ng vi J2ME

LI M U
Ngy nay k thut ha ngy cng pht trin v ng dng trong nhiu lnh vc ca i sng .Mi ngi c th d dng nhn ra iu trong cc b phim, cc bc nh k thut s, tr chi gii tr v trong c cc lnh vc khoa hc , x hi nh y hc, thin vn hc, kh tng hc, kin trc, quy hoch th . Vi mong mun i su vo nghin cu, tm hiu k thut ha ng dng trong thc t ,chng em chn ti ha trn J2ME v vit ng dng minh ha lm ti Bi tp ln ca nhm . Bn cnh khng ch bi tnh hp dn ca J2ME vn l mt nn tng k thut kh mi m, m cn bi v ng dng J2ME phn ln c vit cho cc thit b in thoi di ng mt thit b qu quen thuc trong cuc sng ca mi ngi , c bit l tng lp hc sinh, sinh vin. Chng em xin cm n thy gio L Tn Hng - Ging vin b mn Cng ngh phn mm, vin Cng ngh thng tin, trng i hc Bch Khoa H Ni tn tnh hng dn chng em trong qu trnh hc tp v nghin cu . Chng t xin cm n cc thnh vin lp Cng ngh phn mm c nhng gp xy dng v gip chng t hon thnh ti Bi tp ln .

Lp trnh game trn di ng vi J2ME

A .Cc mc ha trong J2ME


I. Tng quan v J2ME
1. Gii thiu J2ME : J2ME c pht trin t kin trc Java Card, Embeded Java v Personal Java ca phin bn Java 1.1. n s ra i ca Java 2 th Sun quyt nh thay th Personal Java v c gi vi tn mi l Java 2 Micro Edition, hay vit tt l J2ME. ng vi tn gi, J2ME l nn tng cho cc thit b c tnh cht nh, gn. Hin ti phn ln cc hang in thoi di ng trn th gii u tch hp my o Java trong sn phm ca mnh, chnh v vy cho ti ngy any J2ME vn l ngn ng ph bin nht lp trnh ng dng trn di ng ni chung v game trn di ng ni ring. 2 Kin trc ca J2ME :

Lp trnh game trn di ng vi J2ME

Gii thiu cc thnh phn trong nn tng J2ME: * nh ngha v Configuration (Cu hnh): L c t nh ngha mt mi trng phn mm cho mt dng cc thit b c phn loi bi tp hp cc c tnh, v d nh: Kiu v s lng b nh Kiu v tc b vi x l Kiu mng kt ni Do y l c t nn cc nh sn xut thit b nh Samsung, Nokia bt buc phi thc thi y cc c t do Sun qui nh cc lp trnh vin c th da vo mi trng lp trnh nht qun v thng qua s nht qun ny, cc ng dng c to ra c th mang tnh c lp thit b cao nht c th. V d nh mt lp trnh vin vit chng trnh game cho in thoi Samsung th c th sa i chng trnh ca mnh mt cch ti thiu nht c th chy trn in thai Nokia.. Hin nay Sun a ra 2 dng Configuration: CLDC (Connected Limited Device Configuration-Cu hnh thit b kt ni gii hn): c thit k nhm vo th trng cc thit b cp thp (low-end), cc thit b ny thng thng l my in thai di ng v PDA vi khong 512 KB b nh. V ti nguyn b nh hn ch nn CLDC c gn vi Java khng dy (Java Wireless ), dng nh cho php ngi s dng mua v ti v cc ng dng Java, v d nh l Midlet. CDC- Connected Device Configuration (Cu hnh thit b kt ni): CDC c a ra nhm n cc thit b c tnh nng mnh hn dng thit b thuc CLDC nhng vn yu hn cc h thng my bn s dng J2SE. Nhng thit b ny c nhiu b nh hn (thng thng l trn 2Mb) v c b x l mnh hn. Cc sn phm ny c th k n nh cc my PDA cp cao, in thoi web,

Lp trnh game trn di ng vi J2ME

C 2 dng Cu hnh k trn u cha my o Java (Java Virtual Machine) v tp hp cc lp (class) Java c bn cung cp mt mi trng cho cc ng dng J2ME. Tuy nhin, bn ch rng i vi cc thit b cp thp, do hn ch v ti nguyn nh b nh v b x l nn khng th yu cu my o h tr tt c cc tnh nng nh vi my o ca J2SE. * nh ngha v Profile : Profile m rng Configuration bng cch thm vo cc class b tr cc tnh nng cho tng thit b chuyn bit. C 2 Configuration u c nhng profile lin quan v t nhng profile ny c th dng cc class ln nhau. n y ta c th nhn thy do mi profile nh ngha mt tp hp cc class khc nhau, nn thng ta khng th chuyn mt ng dng Java vit cho mt profile ny v chy trn mt my h tr mt profile khc. Cng vi l do , bn khng th ly mt ng dng vit trn J2SE hay J2EE v chy trn cc my h tr J2ME. Sau y l cc profile tiu biu: Mobile Information Device Profile (MIDP): profile ny s b sung cc tnh nng nh h tr kt ni, cc thnh phn h tr giao din ngi dng vo CLDC. Profile ny c thit k ch yu nhm vo in thai di ng vi c tnh l mn hnh hin th hn ch, dung lng cha c hn. Do MIDP s cung cp mt giao din ngi dng n gin v cc tnh nng mng n gin da trn HTTP. C th ni MIDP l profile ni ting nht bi v n l kin thc c bn cho lp trnh Java trn cc my di ng (Wireless Java) PDA Profile: tng t MIDP, nhng vi th trng l cc my PDA vi mn hnh v b nh ln hn Foundation Profile: cho php m rng cc tnh nng ca CDC vi phn ln cc th vin ca b Core Java2 1.3

Lp trnh game trn di ng vi J2ME

Ngoi ra cn c Personal Basis Profile, Personal Profile, RMI Profile, Game Profile. 3 Cn bn v lp trnh J2ME : 3.1 MIDlet : MIDlet l mt ng dng Java c thit kt chy trn cc thit b di ng. Mt MIDlet cha cc lp Java dng bi CLDC v MIDP. Mt b MIDlet gm mt hoc nhiu MIDlet c ng gi cng nhau v nn trong file JAR. File JAR sn sng cho vic ci t vo in thoi. Vn ca lp trnh vin l to ra cc MIDlet. Sau y l cu trc lp trnh ca mt MIDlet. import javax.microedition.midlet.*; import javax.microedition.lcdui.* public class MidletExample extends MIDlet { public void MIDletExample() { } public void startApp() { } public void pauseApp() {} public void destroyApp(boolean unconditional) { } } Mt Midlet lun lun k tha lp MIDlet c sn trong MIDP. Lp MIDlet nm trong gi: javax.microedition.midlet, cc phng thc c bn m mt Midlet lun phi c : startApp( ) :Phng thc ny c gi bi b qun l ng dng khi khi to MIDlet v mi khi MIDlet tr v t trng thi paused.

Lp trnh game trn di ng vi J2ME

pauseApp( ): Phng thc ny gi b qun l ng dng mi khi ng dng cn tm dng ng dng ang thc thi. Khi s dng pauseApp ta gii phng mt phn ti nguyn ca MIDlet dnh b nh cho cc ng dng khc. destroyApp( ): Phng thc ny c dng khi thot khi MIDlet. Trc phi gii phng hon ton b nh c ly bi MIDlet. * Vng i ca mt Midlet :

3.2 API ca J2ME : Mt ng dng MIDlet ch c 1 i tng th hin Display. i tng ny dng ly thng tin v i tng trnh by, v d mu c h tr, v bao gm cc phng thc yu cu cc i tng c trnh by. i tng Display cn thit cho b qun l vic trnh by trn thit b iu khin thnh phn no s c hin th ln trn thit b

Lp trnh game trn di ng vi J2ME

Mc d ch c mt i tng Display ng vi mi MIDlet, nhng nhiu i tng trong mt MIDlet c th c hin th ra trn thit b nh Forms, TextBoxes, ChoiceGroups, .. Mt i tng Displayable l mt thnh phn c hin th trn mt thit b. MIDP cha 2 lp con ca lp Displayable l Screen v Canvas. Hnh di y m t mi quan h trn

Mt i tng Screen khng phi l mt ci g hin ra trn thit b, m lp Screen ny s c tha k bi cc thnh phn hin th mc cao, chnh cc thnh phn ny s c hin th ra trn mn hnh. Hnh di y s m t mi quan h ca lp Screen v cc thnh phn th hin mc cao.

Lp trnh game trn di ng vi J2ME

Lp Canvas c s dng trong cc chng trnh game hay cc ng dng cn v nhng i tng ring bit, c im ca n l t tnh kh chuyn, ta thao tc vi lp ny v cc i tng ln mn hnh. Lp Canvas cng c th bt cc s kin bng nhn phm bm. V l mc thp cho php ngi lp trnh tha mi thao tc vi mn hnh. C hai lp trn u nm trong gi javax.microedition.lcdui.* Trong lp trnh game trn di ng cc thnh phn giao din mc cao c s dng to cc Menu, cc la chn ci t cho Game.

II.Cc thnh phn ha mc cao ca ng dng MIDP


1. Form v Items : Trong phn ny s gii thiu cc thnh phn c hin th ra trn mt Form. Mt Form ch n gin l mt khung cha cc thnh phn, m mi thnh phn c tha k t lp Item. Chng ta s xem qua cc thnh phn hin th trn thit b trn:

Lp trnh game trn di ng vi J2ME

DateField Gauge StringItem TextField ChoiceGroup Spacer CustomItem Image and ImageItem a) DateField Thnh phn DateField cung cp mt phng tin trc quan thao tc i tng Date c nh ngha trong java.util.Date. Khi to mt i tng DateField, bn cn ch r l ngi dng ch c th chnh sa ngy, chnh sa gi hay ng thi c hai. Cc phng thc khi to ca lp DateField gm: DateField(String label, int mode) DateField(String label, int mode, TimeZone timeZone) Cc mode tng ng ca lp DateField gm: DateField.DATE_TIME: cho php thay i ngy gi DateField.TIME: ch cho php thay i gi DateField.DATE: ch cho php thay i ngy V d: private DateField dfAlarm; // To mt i tng DateField vi nhn, cho php thay i c ngy v gi dfAlarm = new DateField("Set Alarm Time", DateField.DATE_TIME); dfAlarm.setDate(new Date()); b) Gauge

10

Lp trnh game trn di ng vi J2ME

Mt thnh phn Gauge l mt kiu giao din thng c dng m t mc hon thnh mt cng vic. C 2 loi Gauge l loi tng tc v loi khng tng tc. Loi u cho php ngi dng c th thay i Gauge, loi 2 th i hi ngi pht trin phi cp nht Gauge Di y l hm khi to ca lp Gauge: Gauge(String label, boolean interactive, int maxValue, int initialValue) V d: private Gauge gaVolume; c) StringItem Mt thnh phn StringItem c dng hin th mt nhn hay chui vn bn. Ngi dng khng th thay i nhn hay chui vn bn khi chng trnh ang chy. StringItem khng nhn ra s kin Phng thc khi to ca lp StringItem StringItem(String label, String text) d) TextField Mt thnh phn TextField th tng t nh bt k cc i tng nhp vn bn tiu biu no. Bn c th ch nh mt nhn, s k t ti a c php nhp, v loi d liu c php nhp. Ngoi ra TextField cn cho php bn nhp vo mt khu vi cc k t nhp vo s c che bi cc k t mt n Phng thc khi to ca lp TextField TextField(String label, String text, int maxSize, int constraints) Thnh phn th 3 constraints l thnh phn m chng ta quan tm, v n l phng tin xc nh loi d liu no c php nhp vo TextField MIDP nh ngha cc tham s rng buc sau cho thnh phn TextField:
11

// iu chnh m lng

gaVolume = new Gauge("Sound Level", true, 100, 4);

Lp trnh game trn di ng vi J2ME

ANY: cho php nhp bt k k t no EMAILADDR: ch cho php nhp vo cc a ch email hp l NUMERIC: ch cho php nhp s PHONENUMBER: Ch cho php nhp s in thoi URL: Ch cho php nhp cc k t hp l bn trong URL PASSWORD: che tt c cc k t nhp vo e) ChoiceGroup Thnh phn ChoiceGroup cho php ngi dng chn t mt danh sch u vo c nh ngha trc. ChoiceGroup c 2 loi: multi-selection(cho php chn nhiu mc): nhm ny c lin quan n cc checkbox exclusive-selection(ch c chn mt mc): nhm ny lin quan n nhm cc radio button f) Image and ImageItem Hai lp c dng hin th hnh nh l: Image v ImageItem. Image c dng to ra mt i tng hnh nh v gi thng tin nh l chiu cao v chiu rng, v d nh c bin i hay khng. Lp ImageItem m t mt tm nh s c hin th nh th no, v d tm nh s c t trung tm, hay t v pha bn tri, hay bn trn ca mn hnh MIDP a ra 2 loi hnh nh l loi nh khng bin i v nh bin i. Mt tm nh khng bin i th khng th b thay i k t lc n c to ra. c trng ca loi nh ny l c c t mt tp tin. Mt tm nh bin i v c bn l mt vng nh. iu ny ty thuc vo vic bn to ni dung ca tm nh bng cch ghi n ln vng nh. Chng ta s lm vic vi nhng tm nh khng bin i trong bng sau. Cc phng thc dng cho lp Image v ImageItem Image createImage(String name)
12

Lp trnh game trn di ng vi J2ME

Image createImage(Image source) Image createImage(byte[] imageDate, int imageOffset, int imageLength) Image createImage(int width, int height) Image createImage(Image image, int x, int y, int width, int height, int transform) Image createImage(InputStream stream) Image createRGBImage(int[] rgb, int width, int height, boolean processAlpha) ImageItem(String label, Image img, int layout, String altText) on m di y m t lm th no to mt tm nh t mt tp tin, v gn n vi mt i tng ImageItem v thm mt bc nh vo mt Form Form fmMain = new Form("Images"); ... // Create an image Image img = Image.createImage("/house.png"); // Append to a form fmMain.append(new ImageItem(null, img, ImageItem.LAYOUT_CENTER, null)); Ch : PNG l loi nh duy nht c h tr bi bt k thit b MIDP no 2. List, Textbox, Alert, v Ticker : a) List Mt List cha mt dy cc la chn c th hin mt trong ba dng. Chng ta thy loi cho php nhiu la chn v loi ch c php chn mt khi lm vic vi ChoiceGroup. Dng th 3 l l dng khng tng minh. Cc List khng tng minh uc dng th hin mt thc n cc chn la

13

Lp trnh game trn di ng vi J2ME

b) TextBox TextBox c dng cho php nhp nhiu dng. Thnh phn TextBox v TextField c nhng rng buc ging nhau trong vic ch nh loi ni dung c php nhp vo. V d ANY, EMAIL, URI Di y l phng thc dng ca mt TextBox: TextBox(String title, String text, int maxSize, int constraints) c) Alert v AlertType Mt Alert n gin l mt hp thoi rt nh. C 2 loi Alert: Modal: l loi hp thoi thng bo c trnh by cho n khi ngi dng n nt ng Non-modal: l loi hp thoi thng bo ch c trnh by trong mt s giy nht nh Cc phng thc khi to ca Alert: Alert(String title) Alert(String title, String alertText, Image alertImage, AlertType alertType) Thnh phn AlertType s dng m thanh thng bo cho ngi dng bit c mt s kin xy ra. V d bn c th s dng AlertType m mt on m thanh no bo hiu cho ngi dng bit khi c li xy ra Thnh phn AlertType bao gm 5 loi m thanh nh sn l: thng bo, xc nhn, bo li, thng bo v cnh bo Ta thy cc phng thc dng ca Alert cho bit l Alert c th bao gm 1 tham chiu n mt i tng AlertType. d) Ticker Thnh phn Ticker uc dng th hin mt on chui chy theo chiu ngang. Tham s duy nht ca thnh phn Ticker l on vn bn c trnh by. Tc v chiu cun c xc nh bi vic ci t trn thit b no.
14

Lp trnh game trn di ng vi J2ME

Phng thc khi to ca Ticker Ticker(String str) T cy phn cp cc thnh phn th hin trn thit b, ta thy l thnh phn Ticker khng l lp con ca lp Screen m Ticker l mt bin ca lp Screen. iu ny c ngha l mt Ticker c th c gn vo bt c lp con ca lp Screen bao gm c Alert 3. X l s kin : a. i tng Command : Khi mt i tng xy ra trn thit b di ng, mt i tng Command gi thng tin v s kin . Thng tin ny bao gm loi hnh ng thc thi, nhn ca mnh lnh v u tin ca chnh n. Trong J2ME, cc hnh ng ni chung c th hin di dng cc nt trn thit b. Nu c qu nhiu hnh ng c hin th trn thit b, thit b s to ra mt thc n cha cc hnh ng . Ch c cc thnh phn MIDP sau y mi c th cha cc i tng Command l: Form, TextBox, List v Canvas. Cc bc c bn x l cc s kin vi mt i tng Command: To mt i tng Command t i tng Command ln trn mt i tng Form, TextBox, List, hay Canvas To mt b lng nghe Khi c mt s kin xy ra, b lng nghe s pht sinh mt li gi n phng thc commandAction(). Trong thn phng thc ny bn c th xc nh i tng no pht sinh ra s kin v to ra cc x l tng ng Di y l on m minh ha vic to ra s kin Command v x l s kin: private Form fmMain; // Form
15

Lp trnh game trn di ng vi J2ME

private Command cmExit; ...

// Command to exit the MIDlet

fmMain = new Form("Core J2ME"); // Create Form and give it a title // Create Command object, with label, type and priority cmExit = new Command("Exit", Command.EXIT, 1); fmMain.addCommand(cmExit); ... public void commandAction(Command c, Displayable s) { if (c == cmExit) { destroyApp(true); notifyDestroyed(); } } b. i tng Item Ngoi vic x l s kin bng i tng Command ta c th x l s kin bng i tng Item. Nhiu i tng trong MIDP c nh ngha trc cho vic x l cc s kin c th no . V d i tng DateField cho php ngi s dng chn la ngy v gi trn mn hnh, i tng TextField cho php ngi dng nhp vo mt chui cc k t, s v cc k t c bit Tng t nh vic x l s kin bng i tng Command, th khi c mt thay i xy ra i vi bt k thnh phn Item no th phng thc itemStateChanged() s c gi. V chng ta s thc hin cc x l bn trong phng thc ny
16

// Add Command to Form

fmMain.setCommandListener(this); // Listen for Form events

Lp trnh game trn di ng vi J2ME

Di y l on m minh ha vic to ra s kin Command v x l s kin: private Form fmMain; private DateField dfToday; ... fmMain = new Form("Core J2ME"); ... fmMain.append(dfToday); // Add DateField to Form fmMain.setItemStateListener(this); // Listen for Form events ... public void itemStateChanged(Item item) { // If the datefield initiated this event if (item == dfToday) ... } c. V d Di y l on m minh ha vic to ra v x l cc s kin Command, Item import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class EventProcessing extends MIDlet implements ItemStateListener, CommandListener
17

// Form // DateField item // Create Form object

dfToday = new DateField("Today:", DateField.DATE); // Create DateField

Lp trnh game trn di ng vi J2ME

{ private Display display; private Form fmMain; private Command cmExit; public EventProcessing() { display = Display.getDisplay(this); // Create the date and populate with current date tfText = new TextField("First Name:", "", 10, TextField.ANY); cmExit = new Command("Exit", Command.EXIT, 1); // Create the Form, add Command and DateField // listen for events from Command and DateField fmMain = new Form("Event Processing Example"); fmMain.addCommand(cmExit); fmMain.append(tfText); fmMain.setCommandListener(this); } // Called by application manager to start the MIDlet. public void startApp() { display.setCurrent(fmMain);
18

// Reference to Display object for this MIDlet // Main Form // Command to exit the MIDlet

private TextField tfText; // TextField component (item)

// Capture Command events (cmExit)

fmMain.setItemStateListener(this); // Capture Item events (dfDate)

Lp trnh game trn di ng vi J2ME

} public void pauseApp() {} public void destroyApp(boolean unconditional) {} public void commandAction(Command c, Displayable s) { System.out.println("Inside commandAction()"); if (c == cmExit) { destroyApp(false); notifyDestroyed(); } } public void itemStateChanged(Item item) { System.out.println("Inside itemStateChanged()"); } } Mt s hnh nh minh ha

19

Lp trnh game trn di ng vi J2ME

20

Lp trnh game trn di ng vi J2ME

III. Cc thnh phn ha mc thp ca ng dng MIDP


Khi lp trnh cho my tnh, thng chng ta ch s dng cc thnh phn giao din c sn to ra giao din ngi dng. Tuy nhin, khi lp trnh cho in thoi di ng s dng MIDP, thnh phn giao din c sn kh ngho nn. MIDP ch cung cp cc thnh phn giao din thng dng nht. i vi my tnh, nu mt thnh phn giao din chng ta cn khng sn c trong b cng c pht trin (SDK), chng ta c th d dng s dng th vin ca mt nh cung cp th ba. iu ny rt kh cho cc ng dng trn TD lun yu cu dung lng nh. Chng ta khng th tch hp c mt th vin vo ng dng s dng mt hoc mt vi thnh phn giao din. gii quyt vn ny, chng ta cn phi s dng th vin lp trnh giao din ngi dng cp thp (Low-Level User Interface Libraries) to cc thnh phn giao din mong mun. Canvas v Graphics l 2 lp tri tim ca cc hm API cp thp. Bn s lm tt c cc cng vic bng tay. Canvas l mt khung v cho php ngi pht trin c kh nng v ln thit b trnh by cng nh l vic x l s kin. Cn lp Graphics cung cp cc cng c tht s v nh drawRoundRect() v drawString()

1. Lp Canvas
Canvas l lp c s trong J2ME s dng x l cc s kin cp thp v cc vn lin quan n ha hin th ln mn hnh. Do Canvas l mt lp o(abstract), nn bn thn lp Canvas s khng th to ra i tng trc tip m phi thng qua cc lp con ca n. Cc lp con ca Canvas, sau khi extends Canvas, phi ci t phng thc o ca n, trong Canvas ch c phng thc paint() l phng thc o, nn ta c th ci t con ca lp Canvas nh sau:
21

Lp trnh game trn di ng vi J2ME

public class MainCanvas extends Canvas{ public void paint(Graphics g){ g.setColor(255,255,255); g.drawString(SMI Java,0,0,Graphics.TOP|Graphics.LEFT); } } 1. H ta :

Mc tiu u tin ca chng ta l lm quen vi h thng trc ta lm vic vi thit b th hin. H thng ta cho lp Canvas c tm ta l im tri trn ca thit b trnh by. Gi tr x tng dn v pha phi, gi tr y tng dn khi i xung pha di. Khi v dy bt v l mt im nh. Cc phng thc sau y s gip xc nh chiu rng v chiu cao ca canvas: + int getWidth(): xc nh chiu rng ca canvas + int getHeight (): xc nh chiu cao ca canvas Chiu rng v chiu cao ca Canvas cng i din cho ton b din tch khung v c th trn thit b trnh by. Ni cch khc, chng khng th ch nh kch thc cho canvas, m phn mm trn mt thit b MIDP s tr v din tch ln nht c th c i vi mt thit b cho trc.
22

Lp trnh game trn di ng vi J2ME

2. V trn i tng Canvas: a. Thit lp ch v Canvas ln ton b mn hnh: C 2 ch Canvas c hin th: - Normal: trong ch ny, chiu cao vng hin th canvas bng tng chiu cao mn hnh tr i vng tiu v vng v cc command. - Full: trong ch ny, chiu cao vng hin th canvas bng tng chiu cao mn hnh. Cc i tng Canvas thng c to ra theo ch mc nh. thit lp ch full mn hnh, bn ch cn gi phng thc setFullScreenMode(boolean mode). Vic gi phng thc setFullScreenMode (boolean mode) thc cht l gi phng thc sizeChanged(int w, int h), bnh thng th phng thc ny khng lm g. ng dng c th li dng phng thc ny thay i chiu cao vo chiu rng vng v i cc thit b c chc nay xoay mn hnh. b. Phng thc paint(Graphics g) - Phng thc paint(Graphics g) c s dng v cc i tng graphics ln mn hnh. gi phng thc paint(Graphics g), n gin bn ch cn to ra mt instance ca lp Canvas v sau gi phng thc paint(Graphics g). - C th gi phng thc paint(Graphics g) mt cch bt ng b thng qua gi phng thc repaint(). - Vic gi phng thc paint() thng qua gi phng thc repaint() c th khng c thc hin ngay lp tc. N c th b tr hon cho n khi lung(flow) iu khin tr v t phng thc x l s kin hin ti. S chm tr y khng phi l vn ln, nhng trong khi x l cc chuyn ng, cch an ton nht kch hot
23

Lp trnh game trn di ng vi J2ME

vic v li l gi phng thc Display.callSerially() hay yu cu v li t mt thread ring bit hoc TimerTask. Ngoi ra, ng dng c th p buc vic v li ngay lp tc bng cch gi phng thc serviceRepaints().ng dng c th s dng phng thc phng thc Display.callSerially() hay serviceRepaints() ng b vi phng thc paint(). Vd: xa mn hnh protected void paint(Graphics g) { // Set background color to white g.setColor(255, 255, 255); // Fill the entire canvas g.fillRect(0, 0, getWidth(), getHeight()); }

2.Lp Graphics:
- i tng Graphics c s dng bi Canvas, n c th c biu din trc tip ln mn hnh hay thng qua mt b m off-screen trc khi v ln mn hnh. - i tng Graphics h tr v cc chui string, image, ng thng, ng trn - Cung cp mt kiu mu sc 24bit, trong 8bit cho mi thnh phn mu red, green v blue. Khng phi tt c cc thit b u h tr y 24bit mu, v vy chng s c nh x cc mu sc yu cu ca ng dng vo bng mu hin ti c h tr trn thit b. - Graphics c mt phng thc rt quan trng translate(int x, int y) dch chuyn ta gc, phng thc ny thng dng trong cc k thut cun mn hnh. - Ngoi phng thc translate(int x, int y), lp Graphics cn c mt phng thc na quan trng khc l setClip(int x, int y, int width, int height), cc vng nm
24

Lp trnh game trn di ng vi J2ME

ngoi vng clip c thit lp s khng c hiu lc, chnh iu ny lm tng tc qu trnh v. 1. Thit lp mu: Mu sc trong i tng Graphics c to t 3 mu c bn l , xanh lc v xanh dng(RGB) c biu din bi 24 bit mu, mi mu chim 8 bit. Nu thit b khng h tr hin th mu hay ch h tr vi s mu t hn th thit b s t chuyn i hin th ra mu gn nht so vi yu cu. Grayscale dng hin th cc sc mu khc nhau trn mn hnh trng en. Khi gn mu cho i tng Graphics, c th dng mt trong 2 cch: Kt hp 3 mu (, xanh dng v xanh lc) trong mt s nguyn kiu int hay biu din tng thnh phn trong tng s int. Khi kt hp 3 mu vi nhau, mi mu c biu din bi 8 bit v xp theo th t t cao xung thp l , xanh lc v xanh dng. R R R R R R R R G G G G G G G G B B B B B B B B RED GREEN BLUE

Do , kt hp 3 gi tr mu ny vo mt s nguyn kiu int, ta phi dch bit c kt qu chnh xc. Gi tr mu s dch tri 16bits, gi tr mu xanh lc dch tri 8 bits v gi tr mu xanh dng chim 8 bit thp nht. VD: int red=0; int reen=127; int blue=255; 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

int color=(red<<16) | (green<<8) | blue; g.setColor(color); //g l i tng kiu Graphics //Gn gi tr cho tng mu c bn ring bit:
25

Lp trnh game trn di ng vi J2ME

int red=0; int green=127; int blue=255; g.setcolor(red, green, blue); Tng t, khi ly gi tr mu, ta cng c th ly ra di dng kt hp hay tng mu ring bit. Nu ly gi tr mu di dng kt hp, c c gi tr mu cho tng mu c bn cn phi b i cc bit khng thch hp. Vd: int color, red, green, blue; color= g.getColor(); //g l i tng kiu Graphics red=(color & 0xFF0000)>>16; green=(color & 0xFF00)>>8; blue=color & 0xFF; C th kim tra thit b di ng c mn hnh mu khng bng phng thc: javax.microedition.lcdui.Display.isColor(). Ngoi ra c th ly s mu thit b c h tr bng phng thc javax.microedition.lcdui.Display.numColors(). , nu thit b ch c mn hnh trng en th gi tr tr v l gi tr grayscale mc nh.

2. Nt v Kiu nt v (stroke style): Khi v ng thng, ng trn, hay hnh ch nht, ta c th la chn kiu nt v l nt lin (Graphics.SOLID) hay cch khong (Graphics.DOTTED). Nt lin l gi tr mc nh ca cc kiu v.
26

Lp trnh h game trn d di ng vi J J2ME

Cc ph hng thc v: - void drawLine e (int x1, in nt y1, int x2, x int y2) ng thng t im (x x1, y1) n im (x2 2, y2) V - void drawArc (int x, int y y, int widt th, int heig ght, int sta artAngle, in nt acrAng gle) ng cong g gc arcAn ngle bt u t gc s startAngle ni tip hnh h ch nh ht xc V nh bi gc tri i trn (x,y) v chiu di hai cnh n width, h height - void f fillArc (in nt x, int y, int width, int height t, int startA Angle, int acrAngle) ) V ng cong g gc arcAn ngle bt u t gc s startAngle ni tip hnh h ch nh ht xc nh bi gc tri i trn (x,y) v chiu di hai cnh n width, h height v t mu b n trong ng cong va v. t (int x, int t y, int wid dth, int hei ight) - void drawRect nh ch nht vi gc t tri trn (x,y x ) v chiu di hai cnh widt th, height V hn - void drawRoundRect (in nt x, int y, int width, int height t, int arcW W, int arcH H) nh ch nht vi cc g gc trn. a arcW v ar rcH l kc ch thc ca hnh ch h nht V hn ngoi t tip gc co ong - void d fillRect ( (int x, int y y, int width h, int heigh ht) T hn nh ch nht - void f fillRound dRect (int x x, int y, in nt width, in nt height, i int arcW, int i arcH) t hnh h ch nht gc trn VD: g.dr rawArc(5, 5, 75, 75, , 0, 225); g.dr rawArc(80 0, 70, 75, 1 100, 90, 22 25);

27

Lp trnh h game trn d di ng vi J J2ME

Hnh c ch nht gm 4 loi: Hnh ch nht thng, kh hng t Hnh ch nht gc cong, khng t c Hnh ch nht thng, t t c Hnh ch nht gc trn, t ch nht g c trn l hnh ch n nht trong g cc g c c v theo dn ng ng Hnh c cong ch h khng phi l g c vung n nh hnh ch c nht th hng thng. n Trong cc gc con ng l ng cong g ni tip h hnh ch n nht kch th hc rng g di tng g ng l: arcW v v arcH. t(1, 1, 60, 40); 4 VD: g.drawRect g.drawRoun ndRect(70 0, 50, 60, 4 40, 30, 40) );

g.fillR Rect(1, 1, 60, 6 40); g.fillR RoundRect t(70, 50, 60, 6 40, 30, 40);

28

Lp trnh h game trn d di ng vi J J2ME

Cc ph hng thc h tr v text: - void drawCha ar (char ch haracter, in nt x, int y, int ancho or) v k t charact ter ln mn n hnh d drawCha ars (char[] [] data, int t offset, int t length, in nt x, int y, int anchor r) - void v chui k t da ata vi ch hiu di len ngth t v tr offset ln mn h nh ng (String g str, int x, int y, int a anchor) - void drawStrin mn hnh v chui str ln m d drawSub bstring (St tring str, in nt offset, in nt len, int x, int y, in nt anchor) - void v chui con c chiu di len , t v tr offset ca chui str ln m n hnh t getFont() : Ly i tng Fo ont hin ti - Font - void setFont () : Gn Fo ont cho i tng Gr raphics hi v text l n mn hn nh, bt k l mt k t hay y mt chui k t, ta a phi Kh cung cp ba t tham s: x, , y v anch hor. Trong g , (x, y) ) l to im gc c, v
29

Lp trnh h game trn d di ng vi J J2ME

anchor r l v tr t ng i ca im gc so vi on text t s c hi h n th. C Cc v tr tng i ca an nchor c nh n ngha sn trong lp Graphics.

3. Font ch: Phn sau y y cng qua an trng kh hng km l cch s dng fon nt ch c h tr bi gia ao din cp thp ca ng dng g MIDP. S Sau y l mt s cc phng thc dng ca lp Fon nt - Font t getFont(i int face, in nt style, int t size) - Font t getFont(i int fontSpe ecifier) - Font t getDefau ultFont() Mt s thuc tn nh ca lp Font FACE_ _SYSTEM M FACE_ _MONOSP PACE FACE_ _PROPOR RTIONAL STYLE E_PLAIN STYLE E_BOLD STYLE E_ITALIC STYLE E_UNDER RLINED
30

Lp trnh game trn di ng vi J2ME

SIZE_SMALL SIZE_MEDIUM SIZE_LARGE Cc tham s kiu dng c th c kt hp thng qua ton t hay. V d: Font font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD | Font.STYLE_ITALIC, Font.SIZE_MEDIUM); Sau khi bn c mt tham chiu n mt i tng Font, bn c th truy vn n xc nh thng tin ca cc thuc tich ca n. int getFace() int getStyle() int getSize() boolean isPlain() boolean isBold() boolean isItalic() boolean isUnderlined() Kch thc ca cc font ch c xc nh bi chiu cao ca font ch, b di tnh bng im nh ca mt chui k t trong mt font xc nh. Mt s cc phng thc sau h tr khi tng tc vi mt i tng font int getHeight() int getBaselinePosition() int charWidth(char ch) int charsWidth(char[] ch, int offset, int length) int stringWidth(String str) int substringWidth(String str, int offset, int length) 4. V nh Lp Graphics h tr mt phng thc duy nht v hnh nh ln mn hnh, l:
31

Lp trnh h game trn d di ng vi J J2ME

void dr rawImage e (Image im mg, int x, i int y, int anchor): V i tng n Image i img ln mn h nh y ch l b c cui cn ng v mt hnh n nh ln mn n hnh, c c bc tr c to i tng Ima age cng nh n load hnh nh l n i tng n . i tng dng Image gm hai loi: c th thay i hnh nh (Mutable ( I Image) v hnh nh c nh utable Imag ge). (Immu Cc b c v i tng Image ln n mn hnh h: Immu utable Ima age: i tng hnh nh (thng l load trc tip t fil le): + To Image img= Ima age.createI Image (\imageTest t.png); + Hin th i t ng ln mn m hnh: protect ted void pa aint (Grap phics g) { g.draw wImage(im mg, 10, 10, Graphi ics.LEFT | Graphics s.TOP); }

able Image e: Muta

ng, yu cu chng g trnh cp mt vng g nh vi k kch thc cho Khi to i t trc ca hnh nh: n
32

Lp trnh h game trn d di ng vi J J2ME

Image img = Ima age.create eImage(80 0,100); V hn nh nh ln i tng g: //ly i tng G Graphics t ng ng ca i t ng Imag ge: Graphi ics g = im mg.getGrap phics(); //dng i tng g Graphics s va ly v cc hnh h nh ln i tng Image: g.fillRo oundRect (0, 0, 50, 5 50, 20, 20) ); h hnh va v ln m mn hnh: Hin th protect ted void pa aint (Grap phics g) { g.draw wImage(im mg, 10, 10, Graphi ics.VCEN NTER | Gra aphics.HC CENTER); }

Khi gi phng thc v i tng Im mage ln m mn hnh, ta cng phi truyn cc tham s x, y, anc chor nh k khi v text t. Tuy nhi n, cc loi anchor ca hnh nh n i khc vi text, l khng g s dng anchor BA ASELINE(ng ch hn ca tng k t / chui) m thay vo o l VC CENTER ch im gia theo o chiu dc ca nh. hnh n
33

Lp trnh game trn di ng vi J2ME

B.ng dng Game trong J2ME


Xut pht t nim am m v kin thc sn c v lp trnh game, nhm chng em la chn vic xy dng mt s game Mobile lm ng dng minh ha cho ti nghin cu ny

I.S lc v lp trnh Game trn J2ME


* J2ME Game API : Thc t ta hon ton c th lm game J2ME vi kin thc v lp trnh di ng J2ME, v c bit l thnh phn giao din mc thp Canvas ca n. Lp Canvas cho php ta v ln mn hnh in thoi, n h tr v cc i tng nh ng thng, ng trn, t mu mt vng mn hnh, hay c th copy mt vng mn hnh vo vng m v t n vo ch khc . Vi nhng cng c nh th ta c th lm c mt chng trnh game t n gin n phc tp. Tuy nhin thi gian lm game s rt tn km v khi lng cng vic lin quan n v giao din l rt ln.Qua tm hiu em thy J2ME c mt gi h tr tt cho lp trnh game gi l chung l Game API. Cc lp ca n nm trong javax.microedition.lcdui.game Mt s lp quan trng ca n nh: GameCanvas, Layer, Sprites, TiledLayer, v LayerManager. GameCanvas: k tha t lp Canvas, c th coi ay l mn hnh in thoi Layer: t c s dng trc tip nhng c kt bi lp Sprite v TiledLayer Sprites: lp to cc nhn vt v cc i tng chuyn ng TiledLayer: lp to cc khung cnh khc nhau ca game v to bn LayerManager: lp qun l cc Sprites v cc TiledLayer 1. Lp GameCanvas :
34

Lp trnh game trn di ng vi J2ME

GameCanvas kt tha cc thuc tnh v phng thc ca lp Canvas v c thm mt s phng thc quan trng gip cho vic gim thi gian tnh ton nh tng tc refresh ca mn hnh. N c thm hai m rng so vi Canvas l Polling Input v Frame Buffer. 1.1 Polling Input : Trong game di ng ngi ta thng s dng cc phm chc nng thao tc. Mt game hon chnh c th ch thao tc vi 5 phm chc nng l UP, DOWN, LEFT, RIGHT v phm FIRE (phm bn). Ta c th dng cc phm s tng ng thay cho cc phm chc nng nh bng trn. in thai b tr cc phm chc nng t gn nhau d thao tc.

35

Lp trnh game trn di ng vi J2ME

Phng thc int getKeyStates( ) ly thng tin v phm bm ca in thoi bit ngi chi nhn nt g. Trong lp Canvas c 1 phng thc tng t xc nh ngi dung s dng phm g l getKeyCodes( ) nhng phng thc ny c mt im hn ch l n s kim tra tt c cc phm xem phm no nhn, trong khi getKeyStates( ) ca GameCanvas ch kim tra vi cc phm chc nng do thi gian nhn bit c phm bm ca lp GameCanvas s nhanh hn ca lp Canvas. V d nhn bit phm bm RIGHT int keyStates = getKeyStates(); if ((keyStates & GameCanvas.RIGHT_PRESSED) != 0) { System.out.println(right); } 1.2 Frame Buffer : K thut ny s dng phng thc protected Graphics getGraphics() ly ni dung ca Canvas v cho vo b m. tng ca Frame Buffer l mi thao tc v trn Canvas s c gin tip thao tc vi vng m sau dng phng thc public void flushGraphics() y ni dung vng m ra Canvas. Vi ci tin ny th Frame Buffer c tc v ln Canvas nhanh hn l v trc tip ln Canvas v thao tc vi vng m nhanh l hn thao tc vi mt i tng Canvas c th, ta ch mt thm hai thao tc l ly ni dung Canvas vo i tng ca lp Graphics vi phng thc getGraphics() v y ni dung t i tng Graphics vo Canvas vi phng thc flushGraphics(). 2. Layer : Layer c hiu l mt khi hnh nh trong Game. Layer l mt lp tru tng c cha trong gi javax.microedition.lcdui.game.Layer .Tt c cc hnh nh
36

Lp trnh game trn di ng vi J2ME

c th hin c trn mn hnh u k tha lp ny ( 2 lp rt quan trng k tha t Layer l Sprite v TiledLayer ). Cc Layer l nhng nh m ta c th v ln mn hnh, n i, di chuyn hay l xp xp chng theo xu (tc l khi nhiu nh chng cho ln nhau th nh c xu ln hn s b nh c xu nh hn che khut) Cc phng thc ca lp Layer l : public final int getX() : Tr v gi tr l ta x ca mt Layer public final int getY() : Tr v gi tr l ta x ca mt Layer public final int getWidth() : Tr v gi tr l chiu rng ca mt Layer public final int getHeight() : Tr v gi tr l chiu di ca mt Layer public void setPosition(int x, int y) : t v tr ca Layer ti v tr (x, y) public void move(int dx, int dy) : Dch chuyn Layer n ta (x+dx, y+dy) public void setVisible (boolean visible) : Thit lp hin/n Layer Mn hnh ha ca game trong J2ME :

37

Lp trnh h game trn d di ng vi J J2ME

3.Sprit te Mt Sprite l mt thut ng chun ng trong g game. N tham t chiu n mt phn t trc qu uan c to ra bi c cc Image e, thng chuy c n ng v di c chuyn xun ng quanh cc phn t khc mt cch c lp tron ng game. Lp Sprite trong MID DP 2.0 i nim ny y. N cho php to r ra cc Spri n cc hnh h nh i din cho kh ite da tr vi nhi iu frame. N c th thay i frame, iu khin chuy c n n ng v kim tra va chm vi cc phn t khc c. Cc c Sprite c nhn nhi n u ln l Graphic cs ng, c c Graphics ny c to nn t cng 1 ph hng thc Sprite nh hng nhn t cc gc khc nha au.

Cc h m khi to: Phn ng thc Sprite( (Image img g) Sprite( (Sprite spr rite) Sprite( (Image img g,int fram meWidth,in nt frameH Height) M t To mt khung Sprite kh ng ng To ra a mt Sprit te t mt Sprite S To mt Sprite t 2 frame e tr ln, frameW Width v frameHeig f ght l chiu rng v v chiu ca ao ca Spr rite

raphics ba ao gm cc c Sprite m m rng v chiu c cao l hn ng s. Cc Gr


38

Lp trnh game trn di ng vi J2ME

a. Sprite Collision

collidesWith(Image image, int x, int y, boolean pixelLevel); collidesWith(Sprite sprite, boolean pixelLevel); collidesWidth(TiledLayer tiledLayer, Boolean pixelLevel); Kim tra ng thng qua v tr gc tri trn ca Sprite 4.LayerManager Lp ny qun l tt c cc i tng khc, thay v trc tip xc nh v tr v cc i tng ln mn hnh bng phng thc paint(), ta to mt i tng LayerManager v cho vo n tt c cc i tng bng phng thc: public void append(Layer lm); i tng append c th l i tng Layer hoc nhng i tng ca lp k tha t Layer nh Sprite v TiledLayer. y ta vn v tng i tng ln mn hnh nhng khc so vi v trc tip ln mn hnh ch cc qu trnh v c thu tm
39

Lp trnh game trn di ng vi J2ME

li ch trong i tng LayerManager m khng v ri rc tng thnh phn mt. Vic v tt c cc i tng ng lot nh vy s tt cho tnh thng nht xut hin ca cc i tng khc nhau trn mn hnh. c th xc nh v tr v ra cho cc Sprite, TiledLayer ta dng phng thc public void setPosition(int x, int y) tha k t lp Layer. Lp LayerManager cung cp cc phng thc qun l Layer nh: insert (Layer l, int index) remove (Layer l) getLayerAt (int index) Phng thc th nht chn mt Layer vo lp v tr c chiu xu index. y mt layer chn vo c tnh n chiu su m n c t (layer c chiu su ln hn s b che bi nhng layer c chiu xu nh hn). Do vic t mt layer ln mn hnh khi s dng LayerManager s khng ph thuc vo th t vit code, m ph thuc vo bin index truyn vo.

40

Lp trnh game trn di ng vi J2ME

5.TiledLayer Mt TiledLayer l mt li cc cc chia ra t mt nh. Cc phng thc: Phng thc TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight) setCell(int col, int row, int tileIndex) t tile vo bc nh v tr col,row v ly nh ,c tileIndex ( trn l t 1,2,6) getCell(int col, int row) getCellHeight() getCellWidth(); getColumns() getRows() tr v index ca cell, nu cell l empty tr v 0 tr v chiu cao ca mt cell (pixel) Tr v chiu rng ca mt cell tr v s ct ca TileLayer Tr v s dng ca TileLayer M t To 1 TiledLayer c s hng, ct v nh cn chia, rng v cao ca tile

Gi trc tip hm paint() hay dng LayerManager layerManager.paint(g,0,0)

41

Lp trnh game trn di ng vi J2ME

II. Xy dng game bng GameBuilder trong IDE NetBeans


1. Gii thiu v GameBuilder trong NetBeans : Nh trn bit to cc Sprite cc TiledLayer v cc bn trong game chng ta phi dng cc phng thc khi to kh phc tp. Nhng cng on rt d gy nhm ln v khng thun tin cho vic lp trnh game vn d bao gm nhiu thut ton ht sc phc tp. Trong IDE NetBeans c cung cp mt cng c gip cho lp trnh vin c th to v qun l cc i tng ha trong game mt cch d dng, chnh l cng c GameBuilder. to mt lp GameDesign ta thc hin nh sau :

Sau khi t tn mn hnh lm vic ca GameDesign hin ra nh sau :

42

Lp trnh game trn di ng vi J2ME

Phn Sprites l ni chng ta to cc sprite ca game. Phn Tiled Layers chng ta to cc Tiled Layers. Phn Scenes l ni chng ta Add cc nh vo to cnh hay bn cho game. 2. To Sprite bng GameBuilder : Trc khi to cc i tng ha bng GameBuilder cn phi ch l trong th mc src ca project phi c sn file nh cn thit. to Sprite trong khung Sprites ta n vo Create sprite hoc trn thanh menu ta n chn biu tng to Sprite . Mn hnh khi to Sprite hin ra :

43

Lp trnh game trn di ng vi J2ME

Ti Sprite name ta t tn cho Sprite. Trong Select image ta la chn nh cn dng. nh s c xut hin ti bn phi, ti ta chnh sa kch thc ca Frame theo kch thc ca mnh, ri n OK. Vic thc hin ny cng ging nh vic ta chia mt bc nh ban u thnh nhiu cc frame nh trong phn l thuyt trn ni n. Tip khung mn hnh to sequences cho sprite hin ra.

44

Lp trnh game trn di ng vi J2ME

Ti y ta dng chut a tng frame chia bc trc vo cc v tr hp l. Sp xp xong ta n nt Play chy th sequences va to. Ta thy rng vi GameBulder vic to Sprites v sequences rt d dng. c th hiu r hn ta c th xem source code m GameBuilder sinh ra, ta s thy n vn theo nhng l thuyt c nu ra trn. Ch c s khc bit ch GameBuilder h tr xy dng mt cch trc quan m thi. xem source code ta n vo nt Source bn cnh nt Game Builder. 2. To TiledLayer bng GameBuilder : Vic to TiledLayer gn ging vi vic to Sprite. Trong khung TiledLayer ca GameBuilder ta chn Create Tiledlayer. Trong ca s hin ra ta chn nh ri tin hnh chia nh thnh cc Tile ph hp vi yu cu.
45

Lp trnh game trn di ng vi J2ME

3. To Scenes : Hu cnh (Background): Phn hin th di cng ca mt cnh game, n ng vai tr lm nn cho cnh . Hu cnh thng l hnh nh bu tri, my, mt t, mt nc Vt th (Object): Phn c t trn hu cnh v c th vn ng hay chuyn ng c. Vt th thng bao gm c nhn vt ca game, vt phm, bn gh, cy, Tin cnh (Foreground): Phn nm trn cng ca mt cnh n nm trn vt th thng l hin th cc thng s nh ct mu, cc k nng, mng Di y l mt s hnh nh trong vic thit k ng dng v hnh nh in-game

46

Lp trnh game trn di ng vi J2ME

Game FishingCraze

47

Lp trnh game trn di ng vi J2ME

Game Mario

Game Bo v bin cng

48

Lp trnh game trn di ng vi J2ME

nh in-game

49

Lp trnh game trn di ng vi J2ME

Tng kt v nh gi
Qua mt qu trnh nghin cu hon thnh Bi tp ln ny, chng em c c kin thc tng qut v cc lp ha trong J2ME v c th vit c mt s ng dng minh ha ,tuy lng kin thc thu thp c cn t i ,nhng t chng em s c c s o su v pht trin nhng ng dng thnh cng hn trn J2ME. Do thi gian v trnh c hn , ti ny khng khi c nhng thiu st , rt mong nhn c s gp ca thy v cc bn

50

You might also like