Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Организация структуры объектов - Программирование Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Объясните про поля класса http://www.cyberforum.ru/android-dev/thread1045263.html
Всем привет. Объясните, пжл., почему когда я в полях класса идентифицирую какую-нибудь view (например, вот так): EditText edTexEnterInterval = (EditText) findViewById(R.id.edTexEnterInterval); то...
Программирование Android Остановка зацикленого потока Есть активити. Из него запускается сервис. В методе onStartCommand сервиса, запускается поток, в котором присутствует бесконечный цикл. При остановке сервиса из активити, поток продолжает работать.... http://www.cyberforum.ru/android-dev/thread1044763.html
GPS Tracker Программирование Android
Функционал: шлёт GPS координаты по UDP. Струкутра: Activity - запускает и останавливает сервис, отображает кол-во отправленных и принятых пакетов, позволяет менять некоторые настройки (частота...
Программирование Android Авторизированное http соединение (coockies)
Здравствуйте, на сервере авторизация проверяется так: - проверяется есть ли куки (login & pass) - если есть присваивается статус "авторизованный" и more actions.. - если нет то присваивается...
Программирование Android Ошибка потока в сервисе http://www.cyberforum.ru/android-dev/thread1043842.html
Создаю сервис, он должен выполнять парсинг сайта, загрузку звука с сайта, сохранение этого звука на флешку и воспроизведение. Написал код который все это выполняет в Активити. Но нужно чтобы это все...
Программирование Android Кнопка ответа на звонок из приложения Всем привет! У меня возникла следующая проблема: в приложении хочу сделать кнопку ответа на входящий звонок, при этом чтобы стандартный экран ответа ОС на звонок не отображался поверх моей... подробнее

Показать сообщение отдельно
GukZiLLA
35 / 35 / 2
Регистрация: 30.11.2013
Сообщений: 102
18.12.2013, 20:14
Ну, массив классов - это массив родительских объектов.
Все остальные объекты мира наследуются всегда от родительского.
В родительском классе описаны самые основные методы и переменные.

Объявите в родительском классе переменную type и у вас будут разные типы объектов по их именам.
У кирпича String type = "brick", у монстра, например, "monster" и т.п.

Если грамотно делать, то расчеты и отрисовка должны происходить в одном цикле.
А чтобы при тормозах отрисовки не возникало замедления - юзайте deltaTime (разница по времени между двумя ближайшими кадрами) - она должна быть равна единице, и все рассчеты умножайте на deltaTime.

Создайте в каком-нибудь из базовых классов метод draw и отрисовывайте персонажей в потомках.
Также у каждого персонажа живого свои методы переопределяются.

Не нужно создавать отдельные массивы для отрисовки. просто в цикле прогона по всем объектам детектите их по типу(type), о котором говорил выше.

Если type == brick, то его можно привести под (Brick) и вытянуть все методы и переменные.


Например вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
List<Obj> listObj = new ArrayList<Obj>();
    
    class Obj {
        String type;
        
    }
    
    class Brick extends Obj {
 
        int x;
        int y;
        int width;
        int height;
        
        Brick(String name, int x, int y, int width, int height) {
            this.type = name; // parent type
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
        }
        
        public void draw(Canvas c) {
            // .........
            Log.i("brick", "draw");
        }
        
        
        
    }
    
    
    class Monster extends Obj {
 
        int x;
        int y;
        int width;
        int height;
        float speed;
        int damage;
        
        Monster(String name, int x, int y, int width, int height, float speed, int damage) {
            this.type = name; // parent type
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
            this.speed = speed;
            this.damage = damage;
        }
        
        public void move(float deltaTime) {
            // .......
            Log.i("monster", "move");
        }
        
        public void draw(Canvas c) {
            // .........
            Log.i("monster", "draw");
        }
        
    }
Проверим, сработает ли))

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// for example
        for(int i = 0; i <= 10; i++) {
            listObj.add(new Brick("brick", i*10, i*10, 100, 100));
            listObj.add(new Monster("monster", i*10, i*10, 20, 40, 5, 10));
        }
        
        // main loop
        for(Obj o : listObj) {
            if(o.type.hashCode() == "brick".hashCode()) {
                Brick b = (Brick) o;
                b.draw(null);
            }
            if(o.type.hashCode() == "monster".hashCode()) {
                Monster m = (Monster) o;
                m.draw(null);
                m.move(1);
            }
        }
На выходе видим:

brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
brick: draw
monster: draw
monster: move
Как-то так. Везде есть нюансы и лучше делать конечно все через движок, например LibGDX.

Добавлено через 12 минут
Вообще для динамического удаления монстров надо будет юзать Iterator

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Iterator<Obj> iter = listObj.iterator();
        while(iter.hasNext()) {
            Obj o = iter.next();
            if(o.type.hashCode() == "brick".hashCode()) {
                Brick b = (Brick) o;
                b.draw(null);
            }
            if(o.type.hashCode() == "monster".hashCode()) {
                Monster m = (Monster) o;
                m.draw(null);
                m.move(1);
                
                // удаляем монстра
                if(m.life <= 0) {
                    iter.remove();
                }
            }
        }
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru