13 thg 3, 2012

[Tut]_libGDX : Vòng đời của 1 ứng dụng


Bài này mô tả cấu trúc của 1 ứng dụng phát triển từ thư viện libGDX như thế nào và sự khác nhau giữa các playforms. 

The Application

Đây là điểm quan trọng của dự án libGDX. giao diện của ứng dụng được cung cấp các phương thức truy cập vào các thành phần chung như Graphices, Audio, Input, File I/O. Nó cũng cho phép truy cập đến thành phần Logging làm việc với tất cả các platforms.
LibGDX hiện tại đã hỗ trợ 2 thành phần cho ứng dụng desktop là lwjgl và jogl , cùng với đó là 1 thành phần cho android.
Để tạo 1 ứng dụng libGDX, cần phải implement phương thức ApplicationListener đầu tiên. 

The Application Listener

Bộ lắng nghe này phản hồi những khởi tạo của ứng dụng, cập nhật trạng thái game, rendering the output gamem tạm dừng game, lưu trạng thái game, hay giải phóng tài nguyên khi thoát ứng dụng.

Khi xây dựng 1 ứng dụng hay 1 game nào đó, chúng ta đều phải implements ApplicationListener interfaces. 
It is also the place where the application life-cycle events are handled. Every application/game, regardless of the back-end and/or target platform will have to implement the ApplicationListener interface. The implementation is exactly the same for all platforms.

ApplicationListener có dạng sau :

public class MyGame implements ApplicationListener {
        public void create () {
                // STUB
        }

        public void render () {
                // STUB
        }

        public void resize (int width, int height) { 
                // STUB
        }

        public void pause () { 
                // STUB
        }

        public void resume () {
                // STUB
        }

        public void dispose () { 
                // STUB
        }
}

Method signatureDescription
create ()Method được gọi 1 lần khi ứng dụng được tạo  ra.
resize(int width, int height)Method này được gọi tại mọi thời gian mà màn hình game được re-sized và game không ở trạng thái pause. Nó được gọi sau create() method.
render ()Method được gọi bởi vòng lặp của game từ mọi thời điểm của ứng dụng khi rendering xảy ra. 
pause ()Phương thức này được gọi trước khi game bị hủy. Androi gọi nó khi phím Home được nhấn xuống hoặc có cuộc gọi đến. Trên desktop game thì được gọi trước phương thức despose() khi thoát game.
resume ()Phương thức này chỉ có trên android.
dispose ()Gọi khi game bị hủy.

Application life-cycle


Creating the Desktop Application

The following class creates a desktop application using lwjgl from the previously created MyGame listener.
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
public class MyDesktopGame {
        public static void main(String[] args) {
                new LwjglApplication(new MyGame(), "My Game", 480, 320, false);
        }
}
Chạy game.
It creates a lwjgl backed application 480 pixels wide, 320 pixels tall. The last parameter indicates that OpenGL ES 2 is NOT to be used.
The following class creates a desktop application using JOGL as the back-end from the same MyGame listener.
import com.badlogic.gdx.backends.jogl.JoglApplication;
public class MyDesktopGame {
        public static void main(String[] args) {
                new JoglApplication(new MyGame(), "My Game", 480, 320, false);
        }
}
In both cases the appropriate libraries have to be used. In the first case the following jar files need to be included:
  • gdx.jar
  • gdx-natives.jar
  • gdx-backend-lwjgl.jar
  • gdx-backend-lwjgl-natives.jar
In the second case, for jogl, the following jars need to be included:
  • gdx.jar
  • gdx-natives.jar
  • gdx-backend-jogl.jar
  • gdx-backend-jogl-natives.jar
The constructor for the desktop application takes 5 parameters:
ApplicationListener listenerThis is an instance of the ApplicationListener created for the application game
String titleThe title of the application which will be shown on the title bar
int widthThe screen width of the application window
int heightThe screen height of the application window
boolean useGL2true if the we want the renderer to use OpenGL 2, or false to stick with OpenGL 1.x


[Tut]_libGDX : Thư viện libGDX là gì ?

libGDX là 1 dự án nhằm phát triển 1 thư viện làm nền tảng để phát triển game. libGDX được viết bằng ngôn ngữ Java. các ứng dụng và game có thể được phát triển trên desktop or laptop và chuyển thành 1 ứng dụng android chỉ với 6 dòng code.
Phát triển mạnh mẽ hơn bằng cách sử dụng các công cụ trên máy tính nhằm giúp hiệu quả hơn khi phát triển ứng dụng thay vì chúng ta phải chờ đợi khi ứng dụng chạy trên emulator hay thiết bị android của bạn mỗi khi build.
Bạn có thể download thư viện này tại đây và bắt đầu ngay với nó.

Video giới thiệu về thư viện libGDX :


Download File dùng AsyncTask trong Android và cập nhật giá trị lên Progress Bar.

Để làm việc với lớp AsyncTask trong Android chúng ta làm như sau :
1. Tạo ra 1 lớp kế thừa từ class AsyncTask.

public class DownloadFile extends AsyncTask<String, Integer, String>

2. Sau đó implement các phương thức sau :

protected String doInBackground(String... params)
Method nhận dữ liệu về và write dữ liệu xuống file với params là 1 array URL truyền vào.

protected void onPostExecute(String result)
Method xử lý khi download file thành công.

protected void onProgressUpdate(Integer... values)
Method cập nhật dữ liệu lên giao diện. Progress bar là 1 ví dụ.

File DownloadActivity.java


/**
 *
 */
package com.csccom.luatle.main;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

/**
 * @author ADMIN
 *
 */
public class DownloadActivity extends Activity {

private ListView mLVChapter;
String[] mArrChapter = { "Chapter 1 - Tap 1", "Chapter 2 - Tap 1",
"Chapter 3 - Tap 1" };
private AlertDialog.Builder builder;
private ProgressDialog mProgressDialog;
private File file;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.download);
mLVChapter = (ListView) findViewById(R.id.download_lv);
file = new File("/sdcard/chapter1.zip");
createAlDiaglog();

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mArrChapter);
mLVChapter.setAdapter(adapter);

mLVChapter.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> adapter, View view,
int position, long id) {
// TODO Auto-generated method stub
if (builder != null) {
builder.show();

}
}
});

}

public void createAlDiaglog() {
final String itemDownload[] = { "Download", "Detail" };
Log.i("TTTH", "Clicked on Item Chapter download");
builder = new AlertDialog.Builder(this);
builder.setTitle("Download chapter ");
builder.setIcon(R.drawable.download);
builder.setItems(itemDownload, new OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
mProgressDialog = new ProgressDialog(DownloadActivity.this);
mProgressDialog.setMessage("Please wait");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog
.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute("http://205.196.122.18/haspakvn9ojg/1r8ai3979wnoab7/doremon.zip");
mProgressDialog.show();
}
});

}

public class DownloadFile extends AsyncTask<String, Integer, String> {

@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
int count;
try {
URL url = new URL(params[0]);
URLConnection conn = url.openConnection();
conn.connect();
int lenghtOfFile = conn.getContentLength();

// Download file
InputStream input = new BufferedInputStream(url.openStream());

OutputStream output = new FileOutputStream(file);

byte data[] = new byte[1024];

long total = 0;

while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int) (total * 100 / lenghtOfFile));
output.write(data, 0, count);
}

output.flush();
output.close();
input.close();
} catch (Exception e) {
// TODO: handle exception

}
return null;

}

@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
mProgressDialog.dismiss();
Intent in = new Intent(getApplicationContext(),
ReadComicActivity.class);
in.putExtra("path", file.getPath());
startActivity(in);

}

@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
mProgressDialog.setProgress(values[0]);

}

}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();

}
}



12 thg 3, 2012

Android WebServices : Connecting to webservice through GSON

Để làm việc được với Gson trước hết các bạn phải tải thư viện hỗ trợ .
Các bạn có thể download  Tại đây 
Và trong eclipse có 1 Plugin Text Editor hỗ trợ khả năng mở file .json và format element để chúng ta hiểu rõ cấu trúc của file json hơn.
Các bạn có thể download Tại đây  .
Bài viết này mình sẽ không giải thích về cấu trúc của 1 file json và tại sao chúng ta làm việc với JSON thay vì làm việc với XMLtruyền thống.
Để làm việc với JSON các bạn có thể dùng class hỗ trợ trong Android. Tìm hiểu thêm Tại đây 
Hoặc dùng 1 thư viện hỗ trợ GSON mà mình sẽ giới thiệu bây giờ.
Trước hết chúng ta sẽ xem qua file json được lưu tại services tại đây.
Sử dụng Plug in Json Editor open thì nó có dạng như hình dưới đây
Các bạn để ý các phần tử trong cấu trúc của 1 file JSON. nó rất quan trọng khi mình muốn thấy thông tin của nó ra.
Tiếp theo các bạn tạo 1 And Project trong eclipse <Hoặc import project mình đã code ở cuối bài viết này>
Nhớ add thêm thư viện gson-2.1.jar vào project.
Tạo 1 lớp trong project có tên : SearchResponse.java

Lớp này có  tác dụng để chúng ta thao tác với phần tử tương ứng của cấu trúc file json.

Tiếp theo là class Result.java có tác dụng là để xử lý các phần tử con của thẻ  "results".
Cuối cùng là class Activity của project. Tôi tạo ra 1 đối tượng Gson. và dùng đối tượng này gọi json và lấy về dữ liệu của file json được lưu trên webservice về. 
                        Gson gson = new Gson();
Reader reader = new InputStreamReader(inputStream);
SearchResponse response = gson.fromJson(reader, SearchResponse.class);
List<Result> results = response.results;

Và kết quả khi các bạn chạy project :



Link download project for eclipse : tại đây
Lưu ý : bạn nhớ thêm quyền truy cập INTERNET cho thiết bị Emulator.  bằng cách vào AndroidManifest.xml
chọn thẻ Permision -> User Permision -> INTERNET permision. 

26 thg 2, 2012

Đọc truyện tranh trên android - Source code Read Comic

Phần mềm đọc truyện tranh trên hệ điều hành android là 1 phần mềm cho phép hiển thị tuần tự các hình ảnh của 1 tập truyện được nén lại trong 1 file zip và lưu trên bộ nhớ ngoài sdcard của thiết bị. Phần mềm còn hỗ  trợ cho người dùng có thể download các bộ truyện trên mạng về thiết bị để đọc. Phần mềm còn cho phép cấu hình thiết bị, đọc ở chế độ fullscreen, zoom, rotate và các chức năng khác. Phần mềm cho phép lưu lại tập truyện thành file zip. Phần mềm sử dụng ngôn ngữ java và kiến thức lập trình trên hệ điều hành Android để hoàn thành. 
      STT
Tên chức năng
Giải thích
1
OpenFile
Đọc 1 tập truyện được nén lại bằng file .zip để hiển thị hình ảnh của tập truyện.
2
Download
Download tập truyện từ trên mạng về bộ nhớ.
3
Zoom
Zoom hình ảnh ở chế độ xem lớn hơn
4
Setting
Cấu hình phần mềm trong quá trình đọc truyện.
5
Rotate
Quay hình ảnh 1 góc 90 độ
6
Touch
Di chuyển tuần tự hình ảnh từ phải qua trái


P/S : bản này chưa fix lỗi quay màn hình. Mình đã fix trong các phiên bản sau.
Link download Source code vui lòng để lại email dưới bài viết này. Thân mến.
Hoặc ở đây : http://and-sungha-blog.googlecode.com/files/ReadComic.rar

19 thg 10, 2011

Chương trình Demo các phương pháp mã hóa cổ điển



Language : Java.
Version 1.0.0
Write by Sungha
References code on the internet
Source code : http://www.mediafire.com/?ec7632r731me7vv
Jar file : http://www.mediafire.com/?h5tas2xc3x1l5tp
Thám mã Hill Cipher : http://www.mediafire.com/?oqy6ptgwkx77v6p

Zend Framework & MVC Model

Trước đây khi code 1 website, bạn code thuần viết ra các hàm riêng biệt và các xử lý đuợc tách ra từng file riêng biệt, điều đó có vẻ như là đơn giản với các dự án nhỏ và chỉ có mình bạn tham gia, sẽ ra sao nếu là 1 dự án lớn và luợng nhân sự tham gia dự án thay đổi theo thời gian, làm sao để nguời phát triển về sau hiểu đuợc và tiếp tục phát triển sản phầm bạn đã làm truớc đó.
Zend Framework là câu trả lời
Tại sao ?
Zend Framework là 1 PHP Framework đuợc lập trình trên PHP dựa theo mô hình MVC (cái này mình sẽ giải thích phía duới) sẽ giúp bạn tách bạch các phần xử lý riêng biệt cho website của bạn, nó giúp cho code của bạn trong sáng hơn, dễ quản lý, chỉnh sửa và nâng cấp.

Mô hình MVC


Model: khối giao tiếp với database, bạn sẽ viết các query cũng như các xử lý logic  ở đây.
View: khối trình bày, hiểu nôm na là 1 nơi chứa 1 loạt các file html của bạn để hiện thị cho nguời xem
Controller: khối điều khiển, sẽ là nơi bạn trực tiếp viết các xử lý lấy các request từ url và form để thao tác trực tiếp với Model, sau đó dùng View để hiển thị ra. OK đã hiểu tàm tạm về MVC
Vì sao mình chọn Zend Framework, Smile he he vì đơn giản là mình thấy nó rất tổng quát và đầy đủ so với các PHP Frameworks khác, hơn nữa nó còn đuợc hỗ trợ tối đa từ công ty Zend.
Nào chúng ta hãy cùng tìm hiểu Zend Framework

Zend Framework là gì ?

  • Sử dụng PHP 5
  • Viết huớng đối tuợng
  • Cung cấp mô hình tiên tiến MVC
  • Là 1 phần mềm nguồn mở có sự hỗ trợ cộng đồng
  • Cung cấp 1 loạt các ứng dụng API của các nhà cung cấp hàng đầu như Google, Yahoo, Flick...

Zend Framework làm đuợc những gì ?

  • Tạo ứng dụng web theo mô hình chuẩn MVC
  • Url tiêu chuẩn, ngắn gọn
  • Hỗ trợ phân quyền tới từng Action
  • Có các thành phần thư viên hỗ trợ API của các nhà cung cấp như Google, Yahoo, Flick
  • Quản lý code dễ dàng, liệt kê và lấy các truy vấn history
  • Dễ dàng phát triển thêm các ứng dụng nhúng, sử dụng Plugins

Sơ qua về các thành phần trong zend framework

Zend_Controller
Module này giúp lấy các request từ phía Client và thực thi nó bằng các Action
Zend_Db
Dựa trên đối tuợng  PDO (PHP Data Objects), cung cấp cách thức giao tiếp với database
Zend_View
Chính là tầng View trong mô hình MVC
Zend_Acl
Quản lý phân quyền trong toàn bộ site
Zend_Feed
Giúp xử lý với Rss và Atom feeds
Zend_Filter
Chức năng lọc các chuỗi nhập vào xem có hợp lệ với yêu cầu không, ví dụ như kiểm tra 1 chuỗi là Email hoặc là ký tự số.
Zend_Pdf
Tạo và xử lý các file PDF
Zend_Service_Amazon, Zend_Service_Flickr, and Zend_Service_Yahoo
Cung cấp truy cập tới các dich vụ web APIS của các nhà cung cấp như Amazon, Flick, Yahoo
Zend_XmlRpc
Tạo ra  giao tiếp XMLRpc (giao tiếp client-server, các xử lý tập chung phía server, client chỉ để hiển thị).
Và còn rất nhiều các Object khác mà mình sẽ giới thiệu trong các bài viết tiếp theo.
(Suu tam)

Bản beta đầu tiên

Sau 6 tháng cả team cặm cụi làm việc điên cuồng, bản alpha cũng được giới thiệu ra toàn bộ công ty và được testing nội bộ công ty mà thôi. ...