Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Рисование пазлов, нужен совет

11K
12 мая 2012 года
proc
32 / / 23.07.2006
Здравствуйте. Начал изучать программирование с написания Паззлов - аналога обычных картонных. Нужен совет в каком направлении двигать булки. В данный момент реализовал рисование на канве кругов и их перетаскивание, выглядит это так:


Код:
public class GameWindow extends Activity{
   
    private GraphicsView myView;
    private int selDot = -1;
    private int imgInd;
   
    private class GraphicsView extends View{
        //Класс, реализущий перетаскиваемую точку
        private class Dot {
            float dotX, dotY;
            Paint dotPaint;
        }
               
        private Dot[] arrDots;
        private final int dflColor = Color.YELLOW;
        private int Rad = 20;
        private float initialX, initialY,
                      offsetX, offsetY;
       
        public GraphicsView(Context context) {
            super(context);
                                               
            //Рисуем пять точек с произвольными координатами
            Random rnd = new Random();
            int i;          
            arrDots = new Dot[5];
            for (i=0; i<5; i++){
                arrDots[i] = new Dot();
                arrDots[i].dotX = rnd.nextInt(400);
                arrDots[i].dotY = rnd.nextInt(400);
                arrDots[i].dotPaint = new Paint();
                arrDots[i].dotPaint.setColor(dflColor);
            }
           
            //Собственно обработчик перетаскивания точки
            setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()){
                       case MotionEvent.ACTION_DOWN:
                           float posX = event.getX();
                           float posY = event.getY();    
                             
                           for (int i = 0; i < 5; i++){
                               if (posX > (arrDots[i].dotX - Rad) &&
                                   posX < (arrDots[i].dotX + Rad) &&
                                   posY > (arrDots[i].dotY - Rad) &&
                                   posY < (arrDots[i].dotY + Rad)){
                                   initialX = arrDots[i].dotX;
                                   initialY = arrDots[i].dotY;
                                   offsetX = posX;
                                   offsetY = posY;
                                   arrDots[i].dotPaint.setColor(Color.CYAN);
                                   selDot = i;
                               }
                               else
                                   arrDots[i].dotPaint.setColor(dflColor);
                           }
                       break;
                       case MotionEvent.ACTION_MOVE:
                           if (selDot >= 0){                              
                               arrDots[selDot].dotX = event.getX() +
                                                      initialX - offsetX;
                               arrDots[selDot].dotY = event.getY() +
                                                      initialY - offsetY;
                           }
                       break;
                       case MotionEvent.ACTION_UP:
                           for (int i = 0; i < 5; i++)
                               arrDots[i].dotPaint.setColor(dflColor);
                           selDot = -1;
                       break;        
                       case MotionEvent.ACTION_CANCEL:
                       break;
                    }
                    return true;
                }
            });
        }
       
        //Перерисовываем точки на канве
        @Override
        public void onDraw(Canvas canvas){
            for (int i = 0; i < 5; i++)
                canvas.drawCircle(arrDots[i].dotX, arrDots[i].dotY, Rad,
                                  arrDots[i].dotPaint);
            invalidate();
        }
    }
   
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
           
        myView = new GraphicsView(this);
        myView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                                LayoutParams.FILL_PARENT));
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        ll.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                                            LayoutParams.FILL_PARENT));
        ll.addView(myView);
        setContentView(ll);
    }
}

По всему этому имею несколько вопросов, просьба откликнуться действительно разбирающихся людей ))) Интересует даже не столько пример, сколько общий принцип реализации, т.е. в каком направлении копать.
1. Как вырезать из Bitmap-а кусок произвольной формы и реализовать их склеивание при соприкосновении? Я думаю делать это с помощью класса Path, но в гугле ничего конкретного не нашел, может плохо гуглил.
2. Никогда не работал с OpenGL, может быть с помощью нее можно сделать все проще?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог