Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
1

Динамическое создание динамических обьектов

04.02.2014, 13:29. Просмотров 1238. Ответов 16
Метки нет (Все метки)

Пишу игру. Есть уровни. В каждом уровне заданное количество обьектов-соперников.
Есть класс Соперник, который содержит функции перемещения, отображения и т д. Есть класс, который всем этим управляет.
Надо реализовать метод в котором бы создавались Соперники в зависимости от уровня, причем их количество не зависит от уровня.
Есть идея такая . Создаю переменную LEVEL целого типа.
У меня максимальное количество соперников ограничено шестью.
Обьявляю в главном классе 6 Сопреников и присваюю им null.
Java
1
2
3
4
5
6
Rival rival1=null;
Rival rival2=null;
Rival rival3=null;
Rival rival4=null;
Rival rival5=null;
Rival rival6=null;
Первый уровень задается в конструкторе (для начала пойдет)
Далее в функции проверки завершения уровня делаю
Java
1
2
3
4
5
6
7
8
9
10
11
12
if(isWin()) // если победил
        {
LEVEL=LEVEL+1;
            switch (LEVEL) //
            {
            case '2':  // уровень 2
                 // и тут допустим в первом уровне у меня был 1 Соперник
                 // я делал так, создаю сколько мне надо соперников, допустим 3
                
 Rival rival1=new Rival(параметры);
 Rival rival2= new Rival (параметры);
 Rival rival3= new Rival (параметры);
Но, в главном классе у меня идет управление соперниками, функции Перемещения, Отрисовки, которые вызывают соответствующие функции Соперников.
Допустим функция Перемещения будет выглядеть так
Java
1
2
3
4
5
6
7
8
9
10
public void Move()
{
rival1.move();
rival2.move();
rival3.move();
rival4.move();
rival5.move();
rival6.move();
 
}
Но, в первом уровне создан только один соперник, а остальные null.
Как быть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2014, 13:29
Ответы с готовыми решениями:

Создание динамических таблиц
Столкнулась с проблемой при создании таблицы. Мне нужно, чтобы после того как...

Динамическое создание интерфейса
Здравствуйте уважаемые. Помогите справиться с задачей. Хочу динамически...

Динамическое создание интерфейса
Уважаемые форумчане, не подскажите как можно реализовать создание интерфейса в...

Динамическое создание кнопки
Добрый день, искал и перебровывал много способов, но не один не помог( Нужно...

Динамическое создание View
Есть шаблон: <?xml version="1.0" encoding="utf-8"?> <LinearLayout...

16
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.02.2014, 13:59 2
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Обьявляю в главном классе 6 Сопреников
Java
1
List<Rival> rivals;
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Далее в функции проверки завершения уровня делаю
Java
1
2
3
4
5
6
7
8
9
if(isWin())  {
LEVEL=LEVEL+1;
switch (LEVEL) {
            case '2':
                 rivals = new ArrayList<Rival>(3);
        for (int i = 0; i < 3; i++) {
            Rival rival = new Rival(параметры);
            rivals.add(rival);
        }
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Допустим функция Перемещения будет выглядеть так
Java
1
2
3
4
5
6
    public void Move() {
        for (int i = 0; i < rivals.size(); i++) {
            Rival rival = rivals.get(i);
            rival.move();
        }
    }
1
LighterV
4 / 4 / 0
Регистрация: 08.08.2013
Сообщений: 48
04.02.2014, 13:59 3
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Rival rival1=null;
Rival rival2=null;
Rival rival3=null;
Rival rival4=null;
Rival rival5=null;
Rival rival6=null;
Похоже, что вы не знаете, что такое массивы или списки.
Ваш код из 6 объектов Ruval можно представить как
Java
1
Rival[] rivals = new Rival[6];
А ещё лучше
Java
1
List<Rival> rivals = new ArrayList<Rival>();
Читайте про коллекции Java в интернете или книгах.
1
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
04.02.2014, 15:58  [ТС] 4
Netscape, почему после создание нового уровня не работает onTouchEvent()
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
 public boolean onTouchEvent(MotionEvent e) 
    {
        Log.d(tag,"Touch");
        for(int i=0; i<boxs.size(); ++i)
        {
            Box box=boxs.get(i);
            box.MoveBox((int)e.getX(),(int) e.getY());
        }
                
                
        
        player.MovePlayer((int)e.getX(),(int) e.getY());
        
        if(isWin())
        {
            Log.d(tag, "isWin():true");
            switch ( level_ )
            {
            
            
            case 2:
                Log.d(tag, "switch");
        
        // затираю маску
                Log.d(tag, "clear Mask");
                canvas_Mask.drawBitmap(fon_white, 0, 0, null);
        // создаю Player і задану кількість Box
                player= new Player(this, photo_player,367,613);
                boxs=new ArrayList<Box>(3);
                Box box1= new Box (this, photo_box, 288, 534);
                boxs.add(box1);
                Box box2= new Box (this, photo_box, 288, 613);
                boxs.add(box2);
                Box box3= new Box (this, photo_box, 446, 534);
                boxs.add(box3);
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.02.2014, 16:05 5
Исходя из этого кода, сказать ничего не могу. Выглядит вполне нормально.
Единственное, я бы разделил onTouchEvent на типы (ACTION_UP, ACTION_DOWN, etc).
1
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
04.02.2014, 16:09  [ТС] 6
Netscape, класс управления наследовал от SurfaceView
рисую так, в отдельном потоке
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
public void run()
        {
            
            while (running)
            {
                                            
                Canvas canvas = null;
             
                
                try
               {
                    // подготовка Canvas-а
             
                    canvas = view.getHolder().lockCanvas();
                    synchronized (view.getHolder())
                    {
                        // собственно рисование
                        
                        Draw(canvas);
                
                       
                        
                    }
                }
                catch (Exception e) { }
                finally
                {
                    if (canvas != null)
                    {
                        view.getHolder().unlockCanvasAndPost(canvas);
                        
                    }
                }
            }
Когда то слышал что onTouchEvent прикреплен к поверхности, может быть он ее каким то образом теряет?
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.02.2014, 16:18 7
Цитата Сообщение от ASDFD12 Посмотреть сообщение
canvas_Mask.drawBitmap(fon_white, 0, 0, null);
этот метод работает?
в куске кода invalidate не наблюдаю.

Добавлено через 1 минуту
Java
1
super.onTouchEvent(event);
тоже не вижу.
1
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
04.02.2014, 16:31  [ТС] 8
Цитата Сообщение от Netscape Посмотреть сообщение
этот метод работает?
Все команды в операторе switch выполняються - заменяеться фон, выводяться новые соперники обновляеться положение Player, и потом не работает onTouch.
Цитата Сообщение от Netscape Посмотреть сообщение
в куске кода invalidate не наблюдаю.
я его не вызываю у меня прорисовка происходит автоматически
Сейчас попробую добавить
Java
1
super.onTouchEvent(event);
Добавлено через 3 минуты
ничего не изменилось
0
verylazy
04.02.2014, 16:31
  #9

Не по теме:

Цитата Сообщение от ASDFD12 Посмотреть сообщение
выполняються - заменяеться выводяться обновляеться
:wall:
не читать

0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.02.2014, 16:39 10
Покажите мне класс Player.
0
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
04.02.2014, 16:43  [ТС] 11
verylazy, пишу гибридом украинский+русский

Добавлено через 4 минуты
Netscape, основные функции
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
 
public class Player {
    
public GameView gameView;
    
    //спрайт
public Bitmap bmp;
final String tag="TAG";
//х и у координаты рисунка
public int x1;
public int y1;
 
Canvas canvas_bitmap;
Bitmap bitmap;
 
public boolean moving=false;
 
 
private boolean isYacheyka=false;
private int coord_yachejki[]={0,0};
private boolean YacheykaIsSosedWithPlayer=false;
 
 public void MovePlayer(int cordinat_X, int cordinat_Y)
 {
     // проверка положения ящиков
     
     
     
     
    
     this.isYacheyka(cordinat_X, cordinat_Y);
     this.isYacheykaSosedWithPlayer(this.coord_yachejki[0], this.coord_yachejki[1]);
     if (this.YacheykaIsSosedWithPlayer)
     {
         if(this.moving==true){
             Log.d(tag,"Player, moving:true, minayu koordinatu");
         this.x1=this.coord_yachejki[0];
         this.y1=this.coord_yachejki[1];
         this.moving=false;
         Log.d(tag,"Player, koordinatu pominalu, moving:"+this.moving);
         }
         
     }
    public Player(GameView gameView, Bitmap bmp1, int x, int y)
{
    bitmap=gameView.bitmap;
    canvas_bitmap = new Canvas(bitmap);
    this.bmp = bmp1;                    //возвращаем рисунок
    this.gameView = gameView;
 
    
    this.x1 = x;                      
    this.y1 =y ; 
    
    
} 
 }
public void Draw()
{
    //Log.d(tag, "player.ondraw"+"x1="+this.x1+"y1="+this.y1);
    canvas_bitmap.drawBitmap(bmp, this.x1, this.y1, null);
}
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.02.2014, 16:51 12
Цитата Сообщение от ASDFD12 Посмотреть сообщение
Canvas canvas_bitmap;
никак не могу понять, зачем здесь канвас?
Он должен быть только один.
1
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
04.02.2014, 16:57  [ТС] 13
я рисую в два bitmapa c помощью двух canvas. Один используется для маски, второй для вывода на экран.
На экран вывожу с помощью канваса прикрепленного к поверхности
Java
1
 canvas = view.getHolder().lockCanvas();
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.02.2014, 17:02 14
Окей, я не понимаю зачем это, всегда рисовал на одном, и мне хватало.

А если попробовать, не создавать нового игрока, а только изменить координаты текущему,
т.е. вместо
Java
1
player= new Player(this, photo_player,367,613);
написать как-то так:
Java
1
2
player.setX(367);
player.setY(613);
1
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
04.02.2014, 17:09  [ТС] 15
Netscape, не помогло
стектрейс останавливается на
Java
1
ViewRootImpl.deliverInputEvent(ViewRootImpl$QueuedInputEvent) line: 3546
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
04.02.2014, 17:13 16
Ну я уже и не знаю в какую сторону гадать.
В общем, если хотите, давайте полностью проект, в личку например, ну, если нет, то нет.
1
ASDFD12
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 544
04.02.2014, 23:25  [ТС] 17
Netscape,
спасибо буду разбираться.

Добавлено через 6 часов 8 минут
разобрался, спасибо за просмотры
0
04.02.2014, 23:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2014, 23:25

Динамическое создание кнопки
Добрый день, подскажите пожалуйста как программно можно создать кнопку или...

Динамическое создание объекта
Всем привет! Заранее извиняюсь за глупый вопрос. Подскажите, пожалуйста, кто...

Динамическое создание элементов на активити
Здравствуйте! Возникла проблема динамического создания элементов. К примеру,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru