Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > JAVA Micro Edition

JAVA Micro Edition Низкоуровневое программирование мобильных телефонов.

Ответ
 
Опции темы
Старый 29.08.2011, 13:33   #1
ratum
Оператор ЭВМ
 
Регистрация: 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
ratum
Оператор ЭВМ
 
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Новичку нужна помощь

4. Как узнать количество строк и столбцов в динамическом массиве?
(Offline)
 
Ответить с цитированием
Старый 29.08.2011, 23:35   #3
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Новичку нужна помощь

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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ratum (29.08.2011)
Старый 29.08.2011, 23:47   #4
ratum
Оператор ЭВМ
 
Регистрация: 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
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Новичку нужна помощь

Ну, во-первых this.getWidth() писать не надо, достаточно просто getWidth().
Во-вторых, перед вторым if хорошо бы написать else, чтобы получилось else if. (Хотя твой подход вообще в корне неправильный)
В-третьих, бросай привычку к глобальным переменным в качестве счетчиков.
А почему все виснет - не знаю, попробуй поставить breakpoint в начале функции и в режиме отладки запустить (Я так понял, ты юзаешь NetBeans).
(Offline)
 
Ответить с цитированием
Старый 30.08.2011, 16:56   #6
ratum
Оператор ЭВМ
 
Регистрация: 29.08.2011
Сообщений: 22
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Новичку нужна помощь

Такой вывод карты только для того, чтобы разобраться с основами. Буду переходить на TiledLayer.
Спасибо за помощь!

P.S. Ждите новую порцию вопросов
(Offline)
 
Ответить с цитированием
Старый 06.09.2011, 00:20   #7
ratum
Оператор ЭВМ
 
Регистрация: 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
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Новичку нужна помощь

Старайся всегда использовать 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).
Вложения
Тип файла: zip MathFP.zip (3.1 Кб, 746 просмотров)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ratum (07.09.2011)
Старый 17.09.2011, 01:01   #9
ratum
Оператор ЭВМ
 
Регистрация: 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
Romanzes
Разработчик
 
Аватар для Romanzes
 
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений
(для 637 пользователей)
Ответ: Новичку нужна помощь

В этом куске кода ошибок я не вижу.
(Offline)
 
Ответить с цитированием
Старый 03.11.2011, 01:30   #11
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
поворот картинки

Сообщение от Romanzes Посмотреть сообщение
Файл MathFP.java взял с какого-то сайта (между прочим, этот же самый файл, только немного переработанный, используется и в MP).
а я не знал ..( пришлось помучаться:

// значения косинусов * 65535
    
public static final int[] cos_table_180 =
    {
        
65536654706547065404653396527365142650116488064684,
        
64487642906409463832635696324262980626526232461931,
        
61538611456075160293598345937558851583925780257278,
        
56754561645557454919543295367353018522975164250921,
        
50200494144869347906471204633345481446304384342991,
        
42074412224030439387384693755236634356513466833751,
        
32768317193073629687287042765626607255592451023461,
        
22413212992025019136180221690815794146801356512451,
        
1133710223910979296815570145213407222811140,
        -
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;
        
%= 360;
        
= (0) ? 360 a;
        if (
180) {
            
= -cos_table_180[180];
        } else {
            
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 aint b) {
        return (
b) ? b;
    }

    
// возвращает меньшее из 2 чисел
    
public static int min(int aint b) {
        return (
b) ? b;
    }

    
// возвращает большее из 4 чисел
    
public static int max(int aint bint cint d) {
        return 
max(ab) > max(cd) ? max(ab) : max(cd);
    }

    
// возвращает меньшее из 4 чисел
    
public static int min(int aint bint cint d) {
        return 
min(ab) < min(cd) ? min(ab) : min(cd);
    }

    
// поворот точки на угол вокруг центра
    // [cx, cy] - центр
    
private void xyRotate(int xint y) {
      
int dx cx;
      
int dy 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 + (>> 1);
        
cy + (>> 1);
        
xyrotate(xy);
        
int x1 tx;
        
int y1 ty;
        
xyrotate(1y);
        
int x2 tx;
        
int y2 ty;
        
xyrotate(11);
        
int x3 tx;
        
int y3 ty;
        
xyrotate(x1);
        
int x4 tx;
        
int y4 ty;
        
tx min4(x1x2x3x4);
        
ty min4(y1y2y3y4);
        
int neww max4(x1x2x3x4) - tx 1;
        
int newh max4(y1y2y3y4) - ty 1;
        
int l neww newh;
        
int[] bmp2 null;
        
bmp2 = new int[l];
        
int dx = (neww w) >> 1;
        
int dy = (newh h) >> 1;
        for(
0newwx++)
        for(
0newhy++) {
            
xyrotate(dxdy);
            
int i neww;
            if ((
>= 0) && (l)) {
                
bmp2[i] = point(txty);
            }
        }
        return 
Image.createRGBImage(bmp2newwnewhtrue);
    } 
зато не требует каких либо библиотек
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 05.11.2011 в 13:31.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Romanzes (07.11.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 19:53.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com