Веб программирование

Несколько полезных вещей в J2ME - часть 2

 
 

Вот ещё несколько полезных вещей в j2me:

1.  Thread. Наверно многие знают из других языков это слово. С помощью Thread можно сделать несколько параллельных потоков кода. Например внутри игры создать дополнительный Thread который будет работать параллельно с игрой и восстанавливать щит игрока с задержкой в несколько секунд.

вот как это работает:

public class MyClass{
/*Главный класс*/
public MyThread mt;
/*Объект в который мы запишем экземпляр класса MyThread*/
public Thread th;
/*Объект типа Thread*/

public MyClass(){
/*Конструктор класса*/
mt = new MyThread();
/*Инициализируем вспомогательныц класс*/
th = new Thread(mt);
/*Создаём новый поток на основе вспомогательного класса*/
th.start();
/*Запускаем поток, при этом запускается не конструктор а метод run(), если его вызвать не методом start(),
а просто так run() - то главный поток не будет работать пока не завершится работа метода run()*/
/*чтобы остановить работу потока надо вызвать метод interrupt(). "th.interrupt()"*/
}

}

class MyThread extends Thread implements Runnable {
/*Начало вспомогательного класса*/
public MyThread(){
}

public void run(){
while(true){
/*while(true) будет выполняться бесконечно пока мы не вызовем interrupt() в главном классе, если
мы не напишем это, то поток завершит свою работу когда закончится работа метода run()*/
/*какие-то действия*/
try{
Thread.sleep(1000);
/*Делаем паузу в 1 секунду (1000 = 1 сек.)*/
/*Метод sleep класса Thread всегда пишется в блоке try{...}catch(...){...}*/
} catch (Exception e) {}
}
}

}

2. Получить строчку из текстового документа внутри архива приложения. Я сделал функцию для упрощения получения строки из файла. Например моё приложение Miwnin работает с этой функцией при чтении скрипта построчно.

import java.io.*;
import javax.microedition.io.*;

public class MyClass{

public MyClass(){
String MyLine = getLine("/MyTextDocument.txt",5);
/*Получаем 5 строчку из текстового документа "MyTextDocument.txt" внутри архива приложения*/
}

private String getLine(String path,int Line) {
		int i;
		boolean temp;
		/*Вспомогательные переменные*/
        DataInputStream dis = new DataInputStream(getClass().getResourceAsStream(path));
		/*Создаём DataInputStream. Его можно использовать не только для файлов*/
		for(i=0;i<Line+1;i++){
		temp = false;
		StringBuffer strBuff = new StringBuffer();
		/*StringBuffer - удобная вешь*/
        int ch = 0;
		int strsize = 0;
		/*Ещё вспомогательные переменные*/
        try {
            while ((ch = dis.read()) != -1 & whbol==false) {
			/*ch = dis.read() читает 1 символ из файла. если возвращает -1, то произошла ошибка, скорее всего
			файл закончился*/
			strsize++;
			if(ch!=13 & ch!=10 & ch!=-1){
			/*13 и 10 - это значения для переноса строки в текстовом документе*/
                strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch));
				/*Добавляем прочитанный символ, пока не буду объяснять что там написано, только
				скажу что это тернарный оператор*/
            } else {
			temp = true;
			}
			}
			if(i==Line){
			/*Файл уже кончился... На всякий случай проверим, может нам и нужна последняя строчка.
			и возвратим её*/
			dis.close();
			String tempstr = strBuff.toString();
			return tempstr;
			}
            
        } catch (Exception e) {}
		}
		return "";
		/*Если что-то пошло не так и функция ничего не возвратила - возвращаем ""*/
}

}

3. StringTokenizer. Наверно все знают фунцию split из vb6, например Split("Строка1;Строка2;Строка3, ";")(1) вернёт "Строка2". В j2me то же есть почти такой же класс, я нашёл его в интернете. Вот как его использовать:

import net.mypapit.java.StringTokenizer;
/*Подключаем класс*/

...

/*Где - нибудь в коде пишем:*/
StringTokenizer tok = new StringTokenizer("Строка1;Строка2;Строка3",";");
/*Создаём StringTokenizer, конструктор такой - StringTokenizer(Исходная строка,Разделитель)*/
tok.nextToken();
/*Пропускаем первую часть ("Строка1")*/
String a = tok.nextToken();
/*Записываем в переменную a 2 часть ("Строка2")*/
/*Если надо перезапустить StringTokenizer, то делаем заного tok = new StringTokenizer("...","...");
Пересоздавать можно любые объекты, при этом все внутри объекта теряется*/

Вот сам класс, его надо скопировать в папку src вашего проекта:

Скачать файл [4793 кб]

4. Тернарный оператор. С помозью этого оператора можно немного сократить код, убрав лишние условия.

int a;
int b = 50;
a = b < 100 ? 5 : 10;
/*Если переменная b < 100 ("b<100"), то выводим в ответ 5 ("? 5"), иначе выводим в ответ 10 (": 10"), здесь после
этой строки у переменной a будет значение 5, так как b < 100*/
/*Это конечно можно записать длиннее с помощью условий:
if(b<100){
a = 5;
} else {
a = 10;
}
но так получается короче и удобней*/

5. Проигрывание звуков и музыки. Здесь всё просто, я опять же написал функцию для упрощения:

import javax.microedition.media.*;

public class MyClass{

public Player pla;

public MyClass(){
PlayMusic("/MyMusic.mid",5);
/*Проигрываем музыку 5 раз*/
PlayMusic("/MyMusic.mid",-1);
/*Бесконечное проигрывание до того, пока не будет вызван pla.stop();*/
/*Музыка должна быть в формате mid !!!*/
} public void PlayMusic(String path,int count){ try { pla = Manager.createPlayer(getClass().getResourceAsStream(path), "audio/midi"); pla.realize(); pla.prefetch(); pla.setLoopCount(count); pla.start(); } catch (Exception ex){} } }

Есть вопросы? Спроси на нашем форуме!!
zm2003160 [18.07.2013 11:39]

вот как проиграть .wav файл:
заменить строку:
pla = Manager.createPlayer(getClass().getResourceAsStream(path), "audio/midi");
на:
pla = Manager.createPlayer(getClass().getResourceAsStream(path), "audio/X-wav");.
mp3:
pla = Manager.createPlayer(getClass().getResourceAsStream(path), "audio/mpeg").

Mishin870390 [18.07.2013 18:44]

ну я для простоты написал. да и другие форматы сильно увеличивают размер приложения, а например у меня телефон не берёт игры больше 300 кб



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.