|
JAVA Micro Edition Низкоуровневое программирование мобильных телефонов. |
29.08.2011, 13:33
|
#1
|
Оператор ЭВМ
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений (для 0 пользователей)
|
Новичку нужна помощь
Решил перейти с мидлетпаскаля на яву. Естественно куча непонятного. Нужно ответить на пару вопросов с объяснением как и почему
1. В мидлетпаскале делал карту через массив множестава (type mapType=record). Сделал отдельный класс mapType(4 boolean, 1 int), и массив public mapType map[][]. Как можно в ручную задать массив только во флаге int? Пытался создать отдельный int массив и залит его в map[][].tileID(int), но мидлет виснет при выводе map. Ошибок не пишет.
public int m[][] = {
{1,1,1,1},
{1,0,0,1},
{1,0,0,1},
{1,1,1,1},
};
private void loadmap(){
for(c1=0;c1<4;c1++){
for(c=0;c<4;c++){
map[c][c1].tileID=m[c][c1];
}}
}
2. При запуске на мобильнике мидлет предлагает выбрать класс для запуска. Даже если выбрать нужный пишет ошибку. На NetBeans эмуле и sjboy эмуле подобной проблемы нет. Как решить?
3. Как выполнять преобразование переменных? Из int в string и наоборот?
|
(Offline)
|
|
29.08.2011, 20:17
|
#2
|
Оператор ЭВМ
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Новичку нужна помощь
4. Как узнать количество строк и столбцов в динамическом массиве?
|
(Offline)
|
|
29.08.2011, 23:35
|
#3
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Новичку нужна помощь
1. Я не вижу ошибок в этом участке кода, кроме того, что следует писать:
for (int c1=0;c1<4;c1++) {
Неужели ты сделал c и c1 глобальными переменными?
Ты говоришь, что мидлет виснет при выводе карты, так приведи нам код, который ты используешь для вывода.
2. Щелкни правой кнопкой на проекте, выбери Properties -> Application descriptor -> вкладка MIDlets. Проверь, все ли там верно указано.
3.
String str = "23";
int n = 12;
//Преобразование String в int
int newInt = Integer.parseInt(str);
//Преобразование int в String
String newStr = "" + n;
//Если ты не ищешь легких путей, можешь писать:
String newStr = Integer.toString(n);
4.
public int m[][] = {
{1,1,1,1},
{1,0,0,1},
{1,0,0,1},
{1,1,1,1},
};
int i = m.length;
int j = m[0].length;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.08.2011, 23:47
|
#4
|
Оператор ЭВМ
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Новичку нужна помощь
Вывод:
protected void drawmap( Graphics g ) {
g.setColor(0x000000);
g.fillRect(0,0,this.getWidth(), this.getHeight());
for(c1=0;c1<4;c1++){
for(c=0;c<4;c++){
if(map[c][c1].tileID==0){g.drawImage( img1, c*step, c1*step, 0 );}
if(map[c][c1].tileID==1){g.drawImage( img2, c*step, c1*step, 0 );}
}
}
}
Если выводить через m, то всё отлично.
Да. c,c1 глобальные переменные. По привычке объявляю все переменные в начале кода
Большое спасибо
|
(Offline)
|
|
30.08.2011, 16:28
|
#5
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Новичку нужна помощь
Ну, во-первых this.getWidth() писать не надо, достаточно просто getWidth().
Во-вторых, перед вторым if хорошо бы написать else, чтобы получилось else if. (Хотя твой подход вообще в корне неправильный)
В-третьих, бросай привычку к глобальным переменным в качестве счетчиков.
А почему все виснет - не знаю, попробуй поставить breakpoint в начале функции и в режиме отладки запустить (Я так понял, ты юзаешь NetBeans).
|
(Offline)
|
|
30.08.2011, 16:56
|
#6
|
Оператор ЭВМ
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Новичку нужна помощь
Такой вывод карты только для того, чтобы разобраться с основами. Буду переходить на TiledLayer.
Спасибо за помощь!
P.S. Ждите новую порцию вопросов
|
(Offline)
|
|
06.09.2011, 00:20
|
#7
|
Оператор ЭВМ
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Новичку нужна помощь
Поправил дескриптор. Игра продолжает выводить список классов при запуске, хотя перестала выдавать ошибку (при нажатии на любой класс игра запускается).
Читал, что переменные типа byte и short переводятся в int при использовании. Целесообразно ли их использовать? И как перевести byte,short в int и обратно? (с переводом разобрался)
Как перевернуть изображение на x градусов?
Последний раз редактировалось ratum, 06.09.2011 в 09:37.
|
(Offline)
|
|
06.09.2011, 22:48
|
#8
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Новичку нужна помощь
Старайся всегда использовать int.
Как перевернуть изображение на x градусов?
|
public static Image rotateImage(Image im, long alpha) {
int w = im.getWidth();
int h = im.getHeight();
long SIN = MathFP.sin(alpha);
long COS = MathFP.cos(alpha);
long A = SIN * h;
long B = SIN * w;
long C = COS * w;
long D = COS * h;
int W = MathFP.toInt(A + C);
int H = MathFP.toInt(B + D);
int[] src = new int[w * h];
int[] dest = new int[W * H];
im.getRGB(src, 0, w, 0, 0, w, h);
long i0 = -MathFP.mul(SIN, D);
long j0 = MathFP.mul(SIN, A);
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
int i = MathFP.toInt(i0 + x * COS + y * SIN);
int j = MathFP.toInt(j0 + y * COS - x * SIN);
if (i < 0 || i >= w || j < 0 || j >= h) {
continue;
}
dest[x + y * W] = src[i + j * w];
}
}
return Image.createRGBImage(dest, W, H, true);
}
Извиняюсь за быдлокод, писал эту функцию очень давно. Файл MathFP.java взял с какого-то сайта (между прочим, этот же самый файл, только немного переработанный, используется и в MP).
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.09.2011, 01:01
|
#9
|
Оператор ЭВМ
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Новичку нужна помощь
Всё пытаюсь разобраться с картой.
Написал на MP создание и вывод map. Декомпилировал. Поробовал сделать так же, как и в MP. Не вышло(Вылетает сразу после запуска).
Может кто-нибудь написать работающий пример?
map = new MapType[10][10];
public class MapType {
public MapType(){
tileID = 0;
vis = false;
psb = false;
}
public MapType Copy(MapType maptype){
psb = maptype.psb;
vis = maptype.vis;
tileID = maptype.tileID;
return this;
}
public boolean psb;
public boolean vis;
public int tileID;
}
|
(Offline)
|
|
18.09.2011, 17:23
|
#10
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Новичку нужна помощь
В этом куске кода ошибок я не вижу.
|
(Offline)
|
|
03.11.2011, 01:30
|
#11
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
поворот картинки
Сообщение от Romanzes
Файл MathFP.java взял с какого-то сайта (между прочим, этот же самый файл, только немного переработанный, используется и в MP).
|
а я не знал ..( пришлось помучаться:
// значения косинусов * 65535 public static final int[] cos_table_180 = { 65536, 65470, 65470, 65404, 65339, 65273, 65142, 65011, 64880, 64684, 64487, 64290, 64094, 63832, 63569, 63242, 62980, 62652, 62324, 61931, 61538, 61145, 60751, 60293, 59834, 59375, 58851, 58392, 57802, 57278, 56754, 56164, 55574, 54919, 54329, 53673, 53018, 52297, 51642, 50921, 50200, 49414, 48693, 47906, 47120, 46333, 45481, 44630, 43843, 42991, 42074, 41222, 40304, 39387, 38469, 37552, 36634, 35651, 34668, 33751, 32768, 31719, 30736, 29687, 28704, 27656, 26607, 25559, 24510, 23461, 22413, 21299, 20250, 19136, 18022, 16908, 15794, 14680, 13565, 12451, 11337, 10223, 9109, 7929, 6815, 5701, 4521, 3407, 2228, 1114, 0, -1114, -2228, -3407, -4521, -5701, -6815, -7929, -9109, -10223, -11337, -12451, -13565, -14680, -15794, -16908, -18022, -19136, -20250, -21299, -22413, -23461, -24510, -25559, -26607, -27656, -28704, -29687, -30736, -31719, -32702, -33751, -34668, -35651, -36634, -37552, -38469, -39387, -40304, -41222, -42074, -42991, -43843, -44630, -45481, -46333, -47120, -47906, -48693, -49414, -50200, -50921, -51642, -52297, -53018, -53673, -54329, -54919, -55574, -56164, -56754, -57278, -57802, -58392, -58851, -59375, -59834, -60293, -60751, -61145, -61538, -61931, -62324, -62652, -62980, -63242, -63569, -63832, -64094, -64290, -64487, -64684, -64880, -65011, -65142, -65273, -65339, -65404, -65470, -65470, -65536 }; // вычисление косинуса, если кто не догадался ..) public static int cos(int a) { int c = 0; a %= 360; a = (a < 0) ? 360 + a : a; if (a > 180) { c = -cos_table_180[a - 180]; } else { c = cos_table_180[a]; } return c; } // вычисление тангенса // ...шутю public static int sin(int a) { return cos(90 - a); } // хранение промежуточных результатов: // результат поворота private int tx = 0; private int ty = 0; // центр битмапа private int cx = 0; private int cy = 0; // синус, косинус private int sa = 0; private int ca = 0; // возвращает большее из 2 чисел public static int max(int a, int b) { return (a > b) ? a : b; } // возвращает меньшее из 2 чисел public static int min(int a, int b) { return (a < b) ? a : b; } // возвращает большее из 4 чисел public static int max(int a, int b, int c, int d) { return max(a, b) > max(c, d) ? max(a, b) : max(c, d); } // возвращает меньшее из 4 чисел public static int min(int a, int b, int c, int d) { return min(a, b) < min(c, d) ? min(a, b) : min(c, d); } // поворот точки на угол вокруг центра // [cx, cy] - центр private void xyRotate(int x, int y) { int dx = x - cx; int dy = y - cy; tx = cx + ((dx * ca) >> 16) - ((dy * sa) >> 16); ty = cy + ((dx * sa) >> 16) + ((dy * ca) >> 16); } // возвращает повернутую картинку public static Image imgrotate(int angle) { sa = sin(angle); ca = cos(angle); int x = 0; int y = 0; int w = pwid; int h = phei; cx = x + (w >> 1); cy = y + (h >> 1); xyrotate(x, y); int x1 = tx; int y1 = ty; xyrotate(x + w - 1, y); int x2 = tx; int y2 = ty; xyrotate(x + w - 1, y + h - 1); int x3 = tx; int y3 = ty; xyrotate(x, y + h - 1); int x4 = tx; int y4 = ty; tx = min4(x1, x2, x3, x4); ty = min4(y1, y2, y3, y4); int neww = max4(x1, x2, x3, x4) - tx + 1; int newh = max4(y1, y2, y3, y4) - ty + 1; int l = neww * newh; int[] bmp2 = null; bmp2 = new int[l]; int dx = (neww - w) >> 1; int dy = (newh - h) >> 1; for(x = 0; x < neww; x++) for(y = 0; y < newh; y++) { xyrotate(x - dx, y - dy); int i = x + y * neww; if ((i >= 0) && (i < l)) { bmp2[i] = point(tx, ty); } } return Image.createRGBImage(bmp2, neww, newh, true); }
зато не требует каких либо библиотек
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
Последний раз редактировалось barsunduk, 05.11.2011 в 13:31.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:31.
|