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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 314
#1

onTouchEvent в потоке - Программирование Android

21.02.2012, 12:02. Просмотров 4363. Ответов 22
Метки нет (Все метки)

Здравствуйте. Задача изменить с помощью onTouchEvent(MotionEvent event) переменную public int b и отрисовать графику с новым параметром в цикле – без invalidate();.
Переменная public int b наверняка меняется но метод
Java
1
2
3
4
5
 public void onDraw(Canvas canvas) 
       {
           x=x+b;
        canvas.drawBitmap(bmp, x, y, null);
       }
не видит этого изменения.
Вот основные классы
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
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.view.MotionEvent;
 
 public class Sprite {
   
     private GameView gameView;
    
    private Bitmap bmp;
   public int x = 0;
    private int y = -155;
     public int b=1;
  
    /**Ширина*/
    private int width;
    
    /**Высота*/
    private int height;
    public boolean onTouchEvent(MotionEvent event)
    {
        Float X=(Float)event.getX();
        Float Y=(Float)event.getY();
        int Action=event.getAction();
        
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
           b=5; 
                }
        if (event.getAction() == MotionEvent.ACTION_UP)
        {
             b=55;
                }
                if (event.getAction() == MotionEvent.ACTION_MOVE)
                {
                     
                        }
        return true;
    }      
       /**Конструктор*/
    public Sprite(GameView gameView, Bitmap bmp) 
    {
          this.gameView = gameView;
          this.bmp = bmp;
          this.width = bmp.getWidth(); 
          this.height = bmp.getHeight(); 
    }
 
       public void onDraw(Canvas canvas) 
       {
           x=x+b;
        canvas.drawBitmap(bmp, x, y, null);
       }
}
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
 public class GameView extends SurfaceView {
   
   
    /**Загружаем спрайт*/
    private Bitmap bmp;
        
    /**Поле рисования*/
    private SurfaceHolder holder;
    
    /**объект класса GameView*/
    private GameManager gameLoopThread;
    
    /**Объект класса Sprite*/
    private Sprite sprite;
    
   
    /**Конструктор*/
    public GameView(Context context) 
    {
          super(context);
          gameLoopThread = new GameManager(this);
          holder = getHolder();
          
          /*Рисуем все наши объекты и все все все*/
          holder.addCallback(new SurfaceHolder.Callback() 
          {
                        /*** Уничтожение области рисования */
                 public void surfaceDestroyed(SurfaceHolder holder) 
                 {
                        boolean retry = true;
                        gameLoopThread.setRunning(false);
                        while (retry) 
                        {
                               try 
                               {
                                     gameLoopThread.join();
                                     retry = false;
                               } catch (InterruptedException e) 
                               {
                               }
                        }
                 }
 
                 /** Создание области рисования */
                 public void surfaceCreated(SurfaceHolder holder) 
                 {
                        gameLoopThread.setRunning(true);
                        gameLoopThread.start();
                 }
 
                 /** Изменение области рисования */
                 public void surfaceChanged(SurfaceHolder holder, int format,
                               int width, int height) 
                 {
                 }
          });
          bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bad1);
          sprite = new Sprite(this,bmp);
          
    }
 
    /**Функция рисующая все спрайты и фон*/
    protected void onDraw(Canvas canvas) 
    {
          canvas.drawColor(Color.BLACK);
          sprite.onDraw(canvas);
         
    }
   
          }
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
import android.graphics.Canvas;
 
public class GameManager extends Thread
{
       /**Наша скорость в мс = 10*/
       static final long FPS = 500;
      
       /**Объект класса GameView*/
       private GameView view; 
 
       /**Задаем состояние потока*/
       private boolean running = false;
      
       /**Конструктор класса*/
       public GameManager(GameView view) 
       {
             this.view = view;
       }
 
        /**Задание состояния потока*/
       public void setRunning(boolean run) 
       {
             running = run;
       }
 
       /** Действия, выполняемые в потоке */
 
       @Override
       public void run() 
       {
             long ticksPS = 1000 / FPS;
             long startTime;
             long sleepTime;
             while (running) {
                    Canvas c = null;
                    startTime = System.currentTimeMillis();
                    try {
                           c = view.getHolder().lockCanvas();
                           synchronized (view.getHolder()) {
                                  view.onDraw(c);
                           }
                    } finally {
                           if (c != null) {
                                  view.getHolder().unlockCanvasAndPost(c);
                           }
                    }
                    sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
                    try {
                           if (sleepTime > 0)
                                  sleep(sleepTime);
                           else
                                  sleep(5);
                    } catch (Exception e) {}
             }
       }
}
Подскажите пожалуйста в чем тут причина?
0
Вложения
Тип файла: zip Tectnzapasn5.zip (3.12 Мб, 14 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2012, 12:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос onTouchEvent в потоке (Программирование Android):

Разгрузка onTouchEvent - Программирование Android
Пишу игру. В методе onTouchEvent у меня проходят практически все емкие операции - создание уровней игры (а это инициализация многих...

Не срабатывает onTouchEvent - Программирование Android
Всем доброго Вечера, недавно занимаюсь программирование под Android. Каким образом реализовать корректную обработку onTouchEvent в ниже...

Обработка onTouchEvent в Activity - Программирование Android
Хочу в активити обрабатывать все прикосновения, независимого от того, были ли они на кнопке или на свободном пространстве. Однако после...

OnTouchEvent - нарисовать точку - Программирование Android
Здравствуйте! Уже который час мучаюсь с программой. В том месте где пользователь прикасается к экрану нужно нарисовать точку (Circle)....

Warning: Custom view overrides onTouchEvent but not performClick - Программирование Android
У меня есть кастомный view который перегружает onTouchEvent следующим образом. На котором и висит варнинг. @Override public boolean...

ServerSocket в новом потоке - Программирование Android
По нажатию на кнопку запускаю новый поток. в Потоке открывается порт и ждет подключения: public void onClick(View view) { // TODO...

22
dajver
409 / 273 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
29.02.2012, 23:08 #16
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Что то я запутался. Это все надо писать в одном классе или в разных? По идее если почти все у вас private то в одном, но кучу ошибок выдает
import android.graphics.Canvas;

У вас нет случайно готового проекта?
Как я понял у тебя в проекте класс GameView наследует SurfaceView { а в этом классе класс поток GameManager } правильно? Если да то пиши все кроме метода - интерфейса в класс поток - GameManager.

Java
1
2
3
4
5
6
7
mDrawScreen = new DrawHelper()
       {
           public void draw(Canvas canvas)
           {
               onDraw(canvas);                  //ОШИБКА
           }
       };
пишется в метода онТач или конструкторе, в зависимости от требуемого эффекта, это не отдельный метод, как и его братюня
Java
1
mDrawGameover = new DrawHelper(){}
Проекта готового нет, если нужно то сделаю.
1
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 314
01.03.2012, 21:23  [ТС] #17
Цитата Сообщение от dajver Посмотреть сообщение
Если да то пиши все кроме метода - интерфейса в класс поток - GameManager
Если я все правильно понял онтач тоже надо писать в GameManager, но тогда координаты х и у будут не доступны для манипуляций в onTouchEvent(MotionEvent event) из класса Sprite , придется переписывать метод onDraw(canvas);, а впрочем у меня и так не работает и без проекта мысль не понятна (буду признателен если вы выложите проект). Если все методы onDraw(canvas); написаны в одном классе (как у меня в предыдущем вложение) то все переменные изменяются в onTouchEvent, но это не удобно - приходится многие свойства объекта (персонажа) писать заново да и все писать на одной странице очень не удобно, можно попробовать как тут вызывать метод из из других классов (Sprite1,Sprite2...) но тогда придется под каждую реакцию противника писать свой класс. Может стоит попробовать вызывать эти переменный как методы (sprite.х, sprite.у...)?
1
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 314
02.03.2012, 14:13  [ТС] #18
Цитата Сообщение от dajver Посмотреть сообщение
А если по теме то тебе нужно создать второй метод рисования который будет рисовать во втором потоке после нажатия на экран. Делаем так:
Создаем интерфейс для дальнейшего использования в потоке:
В общем я догадался, можно не чего не перерисовывать и не создавать ни каких методов. Можно просто сделать х – public и вызвать его в классе GameView, туда же онтач, и не надо внедрятся в поток, все изменения становятся видны. И весь ИИ можно писать в одном классе. Мне только не понятно в чем преимущество вашего способа по сравнению с этим?
Кстати, как вы думаете, на AndEngine легче будет создать такого типа игру?
1
Вложения
Тип файла: zip Tectn5.zip (3.76 Мб, 10 просмотров)
Тип файла: zip andenginen52.zip (3.75 Мб, 8 просмотров)
dajver
409 / 273 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
04.03.2012, 02:47 #19
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
В общем я догадался, можно не чего не перерисовывать и не создавать ни каких методов. Можно просто сделать х – public и вызвать его в классе GameView, туда же онтач, и не надо внедрятся в поток, все изменения становятся видны. И весь ИИ можно писать в одном классе. Мне только не понятно в чем преимущество вашего способа по сравнению с этим?
Кстати, как вы думаете, на AndEngine легче будет создать такого типа игру?
Мой способ делает все немного не так как у Вас, я наверно не так понял задачу, и нафигачил лишнего.

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

А вообще я бы заюзал OpenGL ES вот это хорошая игрушка! Что что, а вот на нем можно собрать любую игру.
1
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 314
05.03.2012, 13:29  [ТС] #20
Честно говоря я не больше двух месяцев изучаю JAVA и не могу не воспользываться случаем чтобы у Вас спросить одно не понятное место с точки зрения языка (об котором я пака ни чего не нашел в книгах). Вот оно самое страшное место
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
 public void run() 
       {
             long ticksPS = 1000 / FPS;
             long startTime;
             long sleepTime;
             while (running) {
                    Canvas c = null;
                    startTime = System.currentTimeMillis();
                    try {
                           c = view.getHolder().lockCanvas();
                           synchronized (view.getHolder()) {
                                  view.onDraw2(c);
                           }
                    } finally {
                           if (c != null) {
                                  view.getHolder().unlockCanvasAndPost(c);
                           }
                    }
                    sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
                    try {
                           if (sleepTime > 0)
                                  sleep(sleepTime);
                           else
                                  sleep(25);
                    } catch (Exception e) {}
             }
       }
Если в catch (Exception e) {} удалить скобки {}, в которых не чего не происходит, то возникает ошибка. Зачем же нужны эти скобки, если в них не чего не происходит? По внешнему виду catch (Exception e) {} походит на функцию, в теле которой не чего не происходит. Зачем тогда эта функция тут присутствует?
0
Bes-s
30 / 30 / 2
Регистрация: 05.11.2011
Сообщений: 178
05.03.2012, 13:50 #21
try{ попытаться сделать это }
catch(Exception ex){ если не получилось, то сделать это(в случае ошибки в блоке try{}) }
finnaly{сделать в любом случае(обычно ради избежания nullPointerException возникших в результате провала try{})}
так вот... finnaly употреблять необязательно. но если в блоке try{} возникает ошибка - надо обязательно выполнить блок catch{}. если же выполнять нечего - тут и крашает. по логике java, catch обязателен к выполнению - хотя бы вывести AlertDialog с кодом ошибки...
1
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 314
05.03.2012, 14:40  [ТС] #22
А еще бывает вот такое "});". Например тут
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
 public GameView(Context context) 
    {
          super(context);
          gameLoopThread = new GameManager(this);
          holder = getHolder();
          
          
          
          /*Рисуем все наши объекты и все все все*/
          holder.addCallback(new SurfaceHolder.Callback() 
          {
                        /*** Уничтожение области рисования */
                 public void surfaceDestroyed(SurfaceHolder holder) 
                 {
                        boolean retry = true;
                        gameLoopThread.setRunning(false);
                        while (retry) 
                        {
                               try 
                               {
                                     gameLoopThread.join();
                                     retry = false;
                               } catch (InterruptedException e) 
                               {
                               }
                        }
                 }
 
                 /** Создание области рисования */
                 public void surfaceCreated(SurfaceHolder holder) 
                 {
                        gameLoopThread.setRunning(true);
                        gameLoopThread.start();
                 }
 
                 /** Изменение области рисования */
                 public void surfaceChanged(SurfaceHolder holder, int format,
                               int width, int height) 
                 {
                 }
          });                                     //ВОТ ОНО
          bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bad1);
          sprite = new Sprite(this,bmp);
          
    }
Количество открывающих и закрывающих скобок одинаково, зачем тогда нужно "});"( и что это такое)?
0
dajver
409 / 273 / 18
Регистрация: 18.09.2010
Сообщений: 1,112
05.03.2012, 20:13 #23
Цитата Сообщение от nnnikotinnn995 Посмотреть сообщение
Честно говоря я не больше двух месяцев изучаю JAVA и не могу не воспользываться случаем чтобы у Вас спросить одно не понятное место с точки зрения языка (об котором я пака ни чего не нашел в книгах). Вот оно самое страшное место

Если в catch (Exception e) {} удалить скобки {}, в которых не чего не происходит, то возникает ошибка. Зачем же нужны эти скобки, если в них не чего не происходит? По внешнему виду catch (Exception e) {} походит на функцию, в теле которой не чего не происходит. Зачем тогда эта функция тут присутствует?
Это метод, в любом случае он должен иметь фигурные скобки - это вход в метод, если их нет значит в метод нету входа и он не рабочий. Это как диструктор.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2012, 20:13
Привет! Вот еще темы с ответами:

Остановить задачу в потоке - Программирование Android
Как можно остановить задачу в потоке, если использует ExecutorService ? ExecutorService es = Executors.newFixedThreadPool(2);

Handlers в новом потоке - Программирование Android
Почему не могу создать handlers в новом потоке ? Thread streamThread = new Thread(new Runnable() { public void run() { ...

Установить listener в потоке - Программирование Android
Нужно установить listener, но нет возможности его установить на Activity, можно ли как то обойти это. Есть возможность работы с Thread и...

Подскажите - не вызывается метод в потоке - Программирование Android
progress = ProgressDialog.show(getActivity(), "Please wait...", "Applying changes may take a few minutes.",...


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

Или воспользуйтесь поиском по форуму:
23
Yandex
Объявления
05.03.2012, 20:13
Ответ Создать тему
Опции темы

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