Как сделать шашки на Android?

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 24 июн 2013, 15:49

KamiSempai писал(а):
Arssir писал(а):А если проще объяснить? Вместо Activity activity нужно писать Context context?
Именно. Как Вы назовете параметр не так критично, но Класс должен быть Context.
Но так не работает метод getWindowManager()

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как сделать шашки на Android?

Сообщение KamiSempai » 24 июн 2013, 15:54

Arssir писал(а):Возникла еще одна странная проблема. Я хочу разместить картинку шахматного поля по центру экрана, картинка - квадратная. Я задал ей размер ширины и высоты, равный ширине экрана, вписывается идеально. Чтобы разместить ее по центру я задал координату Y равную половине высоты экрана минус половина высоты картинки. По идеи должен получится квадрат в центре экрана, но поле смещается немного вниз. Предполагаю, что это из-за панели сверху экрана показывающую время, зарядку и тому подобное, а также название приложения. Если проблема не в этом все равно хотелось бы узнать как избавится от этих панелей.
Посмотрел в самое начало и ужаснулся еще больше. Зачем для одного статичного метода целый класс создавать? И при чем тут размеры экрана когда Вы рисуете на View? Для этого нужно пользоваться getMeasuredWidth() и getMeasuredHeight().
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 24 июн 2013, 16:31

KamiSempai писал(а):Посмотрел в самое начало и ужаснулся еще больше. Зачем для одного статичного метода целый класс создавать? И при чем тут размеры экрана когда Вы рисуете на View? Для этого нужно пользоваться getMeasuredWidth() и getMeasuredHeight().
Я использую те методы которые знаю, о существовании getMeasuredHeight() ни в одном известном мне учебнике не сказано. В классе Size у меня уже не один метод, а несколько, которые высчитывают мне необходимые размеры. Так было удобнее и компактней, но теперь благодаря getMeasuredHeight(), наверно потребность в этом классе отпала.

И все таки, как избавится от панели сверху?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как сделать шашки на Android?

Сообщение KamiSempai » 24 июн 2013, 16:44

Arssir писал(а):И все таки, как избавится от панели сверху?
Нужно в манифесте для своей активити выбрать тему с припиской NoTitlebar. Например, @android:style/Theme.Black.NoTitleBar

Вот откопал интересную тему по созданию нестандартных компонентов: http://habrahabr.ru/post/176643/
Когда-то эта статья мне очень помогла. Надеюсь и Вам поможет.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 24 июн 2013, 20:37

KamiSempai писал(а):
Arssir писал(а):И все таки, как избавится от панели сверху?
Нужно в манифесте для своей активити выбрать тему с припиской NoTitlebar. Например, @android:style/Theme.Black.NoTitleBar
Название убралось, а вот панель времени и зарядки нет.

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

Re: Как сделать шашки на Android?

Сообщение xr0m » 24 июн 2013, 21:42

[syntax=java]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// requesting to turn the title OFF
requestWindowFeature(Window.FEATURE_NO_TITLE);

// making it full screen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.activity_main);
}
[/syntax]
С английским в гугл траслейтор.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как сделать шашки на Android?

Сообщение KamiSempai » 24 июн 2013, 21:57

Arssir писал(а):Название убралось, а вот панель времени и зарядки нет.
@android:style/Theme.Black.NoTitleBar.Fullscreen
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 03 июл 2013, 07:42

Я уже написал большую часть приложения, но код получается очень громоздким и запутанным. Во многом из-за обилия картинок, и того что всю графику я рисовал внутри основного View класса в методе protected void onDraw(Canvas canvas) {} Он получился больше 120 строчек длинной и состоит в основном из элементов canvas.drawBitmap(картинка, х, у, null); и логических условий их выполнения. А вся логика игры и координаты картинок разбросаны по нескольким разным классам. Вообщем хаос. Мне бы хотелось узнать можно ли как то переложить графику на другие классы, чтобы картинка рисовалась там же, где и условие при котором она рисуется.
Или каким-то образом сослаться на другой класс или отправить ее туда.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Как сделать шашки на Android?

Сообщение rezak90 » 03 июл 2013, 09:33

показывай код и мы посмотрим =)
R.id.team
Политика на форуме запрещена

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как сделать шашки на Android?

Сообщение KamiSempai » 03 июл 2013, 10:28

rezak90 писал(а):показывай код и мы посмотрим =)
Тут скорее всего вопрос больше по архитектуре.
Arssir писал(а):Я уже написал большую часть приложения, но код получается очень громоздким и запутанным. Во многом из-за обилия картинок, и того что всю графику я рисовал внутри основного View класса в методе protected void onDraw(Canvas canvas) {} Он получился больше 120 строчек длинной и состоит в основном из элементов canvas.drawBitmap(картинка, х, у, null); и логических условий их выполнения. А вся логика игры и координаты картинок разбросаны по нескольким разным классам. Вообщем хаос. Мне бы хотелось узнать можно ли как то переложить графику на другие классы, чтобы картинка рисовалась там же, где и условие при котором она рисуется.
Или каким-то образом сослаться на другой класс или отправить ее туда.
Чего вы там такого делаете, что у вас прорисовка на 120 строк получилась? Там всего-то нужно пару циклов, один рисует шахматную доску, другой фигуры, и еще одна строка для выделения выбранной фигуры.

Графику на другие классы перекладывать не советую, потом самому можно запутаться. В идеале должно хватить 4 классов:
1) View отображающий доску. В него передается массив с фигурами. А еще он должен обрабатывать касания и передавать информацию о нажатой позиции через колбэк.
2) Класс с логикой игры. В него передаются действия игрока (взял фигуру, передвинул ее). Естественно их нужно проверять на корректность. А еще у него тоже должен быть колбэк, который информирует о каких либо игровых действиях. Например если мы кликнули по доске, View через колбэк сообщила о позиции, после чего мы передали в этот класс информацию о клике по ячейке,если в этой ячейке есть наша шашка, она должна выделиться, если шашка уже выделена и мы ходим, шашку нужно передвинуть. Вся эта информация должна идти из класса логики через колбэки.
3) Activity в которой описана связь между доской и классом логики. Вся обработка колбеков осуществляется в ней.
4) Искусственный интеллект. Обдумывает ход, после чего имитирует нажатие по доске. Думать он должен в другом потоке.

Вот и все. Самым сложным тут будет искусственный интеллект. Остальное раз плюнуть.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 03 июл 2013, 11:17

KamiSempai писал(а):Чего вы там такого делаете, что у вас прорисовка на 120 строк получилась? Там всего-то нужно пару циклов, один рисует шахматную доску, другой фигуры, и еще одна строка для выделения выбранной фигуры.
Да вы правы, класс прорисовки скорее больше логикой игры забит, попробую перенести ее в другой класс.
KamiSempai писал(а):Вот и все. Самым сложным тут будет искусственный интеллект. Остальное раз плюнуть.
Я пока что делаю игру на двоих, искусственный интеллект - это слишком сложно.

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: Как сделать шашки на Android?

Сообщение Nyashka » 08 июл 2013, 13:39

Как насчет такой архитектуры? Если словами:

Код: Выделить всё

Класс активити {
        убрать панели;
        установить вью;
}
Класс Вьюв {
        МассивСписок <Шашка> Шашки = новый МассивСписок <Шашка>();
        Конструктор(){
                циклы 2 раза по 8 создать новую шашку вычисляя при этом координаты и поместить в МассивСписок Шашки;
                загрузить картинки;
        }
        наПрорисовку(){
                нарисовать доску;//вроде очевидно
                цикл для номер_шашки от 0 до Шашки.размер(){
                нарисоватьКруг(Шашки.взять(номер_шашки).координаты.х, Шашки.взять(номер_шашки).координаты.у, Шашки.взять(номер_шашки).диаметр)
        }
        наНажатие(){
                определяем тип прикосновения и 
                если нажатие то определяем на какую нажали и можно ли ее выделить; //(могу описать подробнее)
                иначе если движение то перерисовываем ту область где шашка движется;
                иначе если отпустили то определяем допустим ли выполненный ход игрока, если допустим то если убили в процессе хода то вычислить номер_убитой и обозначить Шашки.взять(номер_убитой).убита=да;
        }
}
Класс Шашка {
        Координаты;
        Диаметр;
        Цвет;
        булева убита=нет;
        Конструктор(х, у, д, ц) { //понятно что тут
        }
}

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как сделать шашки на Android?

Сообщение Foenix » 08 июл 2013, 13:47

Arssir, не сделал еще шашки? свистни потом, с удовольствием поиграем, жду не дождусь уже.
Ты сетевую делаешь?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

=bor=
Сообщения: 267
Зарегистрирован: 21 мар 2013, 12:26

Re: Как сделать шашки на Android?

Сообщение =bor= » 08 июл 2013, 14:35

Nyashka писал(а):Если словами:
Доходчиво. :)

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 08 июл 2013, 14:40

Nyashka писал(а):Как насчет такой архитектуры? Если словами:

Код: Выделить всё

Класс активити {
        убрать панели;
        установить вью;
}
Класс Вьюв {
        МассивСписок <Шашка> Шашки = новый МассивСписок <Шашка>();
        Конструктор(){
                циклы 2 раза по 8 создать новую шашку вычисляя при этом координаты и поместить в МассивСписок Шашки;
                загрузить картинки;
        }
        наПрорисовку(){
                нарисовать доску;//вроде очевидно
                цикл для номер_шашки от 0 до Шашки.размер(){
                нарисоватьКруг(Шашки.взять(номер_шашки).координаты.х, Шашки.взять(номер_шашки).координаты.у, Шашки.взять(номер_шашки).диаметр)
        }
        наНажатие(){
                определяем тип прикосновения и 
                если нажатие то определяем на какую нажали и можно ли ее выделить; //(могу описать подробнее)
                иначе если движение то перерисовываем ту область где шашка движется;
                иначе если отпустили то определяем допустим ли выполненный ход игрока, если допустим то если убили в процессе хода то вычислить номер_убитой и обозначить Шашки.взять(номер_убитой).убита=да;
        }
}
Класс Шашка {
        Координаты;
        Диаметр;
        Цвет;
        булева убита=нет;
        Конструктор(х, у, д, ц) { //понятно что тут
        }
}
шашка может стать дамкой, не?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: Как сделать шашки на Android?

Сообщение Nyashka » 08 июл 2013, 15:54

anber писал(а): шашка может стать дамкой, не?
Там много чего упущено, я лишь архитектуру описывал. Так же опущено как мы получаем координаты и как они изменяются
Если нужны подробности я с радостью поясню каждый из этапов.
Про шашку-дамку это добавить свойство:
Булева дамка = нет;
в свойства класса Шашка и менять это свойство на 'да' когда в результате хода игрока передвигаемая шашка по Y оказалась за пределами какой то относительной координаты для одного цвета, и до какой то координаты для другого цвета

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 14 июл 2013, 21:05

Nyashka писал(а):Как насчет такой архитектуры? Если словами:

Код: Выделить всё

Класс активити {
        убрать панели;
        установить вью;
}
Класс Вьюв {
        МассивСписок <Шашка> Шашки = новый МассивСписок <Шашка>();
        Конструктор(){
                циклы 2 раза по 8 создать новую шашку вычисляя при этом координаты и поместить в МассивСписок Шашки;
                загрузить картинки;
        }
        наПрорисовку(){
                нарисовать доску;//вроде очевидно
                цикл для номер_шашки от 0 до Шашки.размер(){
                нарисоватьКруг(Шашки.взять(номер_шашки).координаты.х, Шашки.взять(номер_шашки).координаты.у, Шашки.взять(номер_шашки).диаметр)
        }
        наНажатие(){
                определяем тип прикосновения и 
                если нажатие то определяем на какую нажали и можно ли ее выделить; //(могу описать подробнее)
                иначе если движение то перерисовываем ту область где шашка движется;
                иначе если отпустили то определяем допустим ли выполненный ход игрока, если допустим то если убили в процессе хода то вычислить номер_убитой и обозначить Шашки.взять(номер_убитой).убита=да;
        }
}
Класс Шашка {
        Координаты;
        Диаметр;
        Цвет;
        булева убита=нет;
        Конструктор(х, у, д, ц) { //понятно что тут
        }
}
У меня нету View, я всю графику и логику сделал при помощи методов:
protected void onDraw(Canvas canvas)
{
...
} и
public boolean onTouchEvent(MotionEvent event)
{
...
}
игра уже рабочая можно играть вдвоем на одном экране. Сейчас думаю как сделать анимацию, но проблема в том что при моей реализации графики, стандартную анимацию сделать не возможно. Все статьи которые я смотрел на эту тему, используют xml файлы, а я так не могу. Думаю единственным вариантом для меня сейчас - использовать Timer, и по нему перемещать координаты картинок.
Foenix писал(а):Arssir, не сделал еще шашки? свистни потом, с удовольствием поиграем, жду не дождусь уже.
Ты сетевую делаешь?
Я обязательно сделаю сетевой режим (попробую)), но пока для меня главная задача это - анимация.

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: Как сделать шашки на Android?

Сообщение Nyashka » 15 июл 2013, 14:51

Arssir писал(а): У меня нету View, я всю графику и логику сделал при помощи методов:
protected void onDraw(Canvas canvas)
{
...
} и
public boolean onTouchEvent(MotionEvent event)
{
...
}
Так членами какого класса являются обработчики нажатий и прорисовки, если не View или SurfaceView? (Сорри если ответ на этот вопрос был в этой теме, просто хочется быстро подсказать)
Вот кусок кода для работы с таймером:

Код: Выделить всё

    Timer timer;
    TimerTask tTask;
//...
// где то в onCreate()  или в конструкторе класса
        timer = new Timer();
        schedule(); //запуск таймера
//...
    void schedule(){
        if (tTask != null) tTask.cancel();
        	tTask = new TimerTask() {
            public void run() {//что делаем по таймеру. к примеру, вызываем перерисовку
                postInvalidate();
            }
        };
        timer.schedule(tTask, 120, 40); //40 - это интервал работы таймера
    }
У себя в программе я по другому использую таймер, а это отрывок из примера как сделать змейку http://davidmd.ru/2012/02/24/%D0%BF%D0% ... 2%D1%8C-1/

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 15 июл 2013, 22:16

Nyashka писал(а):
Arssir писал(а): У меня нету View, я всю графику и логику сделал при помощи методов:
protected void onDraw(Canvas canvas)
{
...
} и
public boolean onTouchEvent(MotionEvent event)
{
...
}
Так членами какого класса являются обработчики нажатий и прорисовки, если не View или SurfaceView? (Сорри если ответ на этот вопрос был в этой теме, просто хочется быстро подсказать)
Вот кусок кода для работы с таймером:

Код: Выделить всё

    Timer timer;
    TimerTask tTask;
//...
// где то в onCreate()  или в конструкторе класса
        timer = new Timer();
        schedule(); //запуск таймера
//...
    void schedule(){
        if (tTask != null) tTask.cancel();
        	tTask = new TimerTask() {
            public void run() {//что делаем по таймеру. к примеру, вызываем перерисовку
                postInvalidate();
            }
        };
        timer.schedule(tTask, 120, 40); //40 - это интервал работы таймера
    }
У себя в программе я по другому использую таймер, а это отрывок из примера как сделать змейку http://davidmd.ru/2012/02/24/%D0%BF%D0% ... 2%D1%8C-1/
У меня весь MainActivity, выглядит так...

Код: Выделить всё

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		GView v = new GView(this);
		setContentView(v);
	}
}
GView - класс наследуемый от View, все что там есть это

Код: Выделить всё

public GView(Context context) { super(context); }
protected void onDraw(Canvas canvas)
	{
...
}
public boolean onTouchEvent(MotionEvent event)
		{
...
}

Nyashka
Сообщения: 40
Зарегистрирован: 19 мар 2013, 13:06

Re: Как сделать шашки на Android?

Сообщение Nyashka » 15 июл 2013, 23:18

Arssir писал(а): GView - класс наследуемый от View
Таки есть View. У View есть метод postInvalidate() для вызова перерисовки (произойдет вызов onDraw). Код таймера приводил выше, его надо занести в код класса вьюва, а в конструктор или в onCreate занести первый вызов таймера. Возможно вы это уже и сами поняли, я только только с этим разобрался и решил поделиться =)

Ответить