![]() |
|
Модераторы: Rickert Страницы: (9) Все « Первая ... 2 3 [4] 5 6 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]()
|
|
| Rpahut |
|
||||||||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Эту строчку можно было хотя бы скопировать у меня. Зачем там квадратные скобки (points [][]...
У BlueJ конечно кривые сообщения об ошибках, но если он ругается на эту строчку, значит ошибку стоит искать именно в ней. Зачем исправлять объявление массива, к которому у Явы нет никаких претензий?
...то массив будет нулевого размера, потому что эта строка выполняется до конструктора класса, и в переменных cols и rows еще лежат нули. Дальше вы еще пытаетесь с этим массивом что-то делать - отсюда и все ошибки. Так делать не надо!
Метод drawCircle() вы добавили сами ;). Пусть он пока остается, только сделайте его private. Для отрисовки точки используйте ее метод paint().
Читайте все что я пишу внимательнее. Мы по несколько раз на одни и те же грабли наступаем. --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||||||||
|
|||||||||||
| Qawra |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
Я поняла ..у меня даже точки прорисовались ...правда они пока выглядят пустыми кружками .Надо наверно одновременно с рисованием вызывать метод закрашивающий кружки . Цвет у них по умолчанию чёрный.
Попыталась я закрасить кружочки добавив строчку
пытаюсь добавить MouseListener к решётке
Это сообщение отредактировал(а) Qawra - 17.1.2009, 00:24 |
||||||||
|
|||||||||
| Rpahut |
|
||||||||||||||||||||||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Это замечательно! Рекомендации по движению дальше: 1. Сначала прочитайте, не вникая сильно, что я тут понаписал, постарайтесь уловить суть идеи. 2. Начните читать с начала, подробнее разбирая каждый пункт. Вносите изменения в код по мере продвижения. 3. Добавляйте в свой код комментарии, особенно касательно новых для вас вещей - так лучше усваивается. 4. Спрашивайте, если что непонятно. ______________________________________ Так, мы убедились что GridsCanvas и точки рисуются, так что пока отложим доработки (мы еще доработаем рисование сетки и точки). Есть более важная весчь - это обработка мыши, чтобы можно было щелкать по точкам. Для того чтобы ловить события мыши, мы добавим implements MouseListener в класс Grids, и в него же впишем метод:
Пояснение: implements MouseListener значит что класс, к которому это приписано, желает получать сообщения о том, что происходит с мышью. Ява будет передавать классу сообщения о мыши, но чтобы их получать, в классе должны иметься определенные методы: public void mouseEntered(MouseEvent e) // вызывается, когда мышка входит в пределы действия компонента public void mouseExited(MouseEvent e) // наоборот public void mouseDragged(MouseEvent e) // кнопка нажата и мышка двигается public void mouseClicked(MouseEvent e) // пользователь щелкнул кнопкой мыши Все эти методы должны присутствовать в классе Grids, иначе Ява не станет с ним работать; но нас интересует только где пользователь щелкнет кнопкой, поэтому мы впишем код только в mouseClicked(), а остальные методы оставим пустыми. Еще нужно указать, какой именно компонент нас интересует. Для этого в конструктор Grids вставляем:
Теперь с другой стороны - когда щелкается кнопка мыши, это значит что игрок пытается сделать ход. Поскольку игроков у нас двое, нужно знать не только координаты где произошел щелчок, но и чей (какого из игроков) сейчас ход. Поэтому добавляем в Grids переменную
а в конструкторе Grids присваиваем ей значение:
Теперь чтобы узнать чей ход можно написать
По ходу игры значение этой переменной будет меняться, и соответственно будут "переключаться" игроки - один ходит, второй отдыхает. -------------------- Теперь мы можем узнать где и какой игрок щелкнул мышкой. Дальше, допустим, мы хотим чтобы точка, в которую щелкнули, красилась цветом игрока, который щелкнул (это займет много текста). Точками управляет класс GridsCanvas (массив points находится в нем, значит он за них и отвечает), поэтому информацию о щелчке нужно сначала передать ему. Для этого можно добавить в GridsCanvas метод, принимающий соответствующие параметры, например такой:
Класс GridsCanvas уже может рассчитать в какую точку попал щелчок(если вообще попал) и передать цвет этой точке. Но, опять, чтобы точка могла принять цвет, у нее должен быть метод по типу такого:
Как рассчитать, в какую Точку попадают координаты щелчка: если чтобы определить экранные координаты точки, мы умножали ее координаты-на-поле на cellSize то здесь нам нужно наоборот, определить координаты-на-поле, поэтому делим экранные координаты на cellSize --------------отступление-------------------- Настоятельно рекомендую поместить код преобразования координат экран->поле и поле->экран в отдельные методы класса GridsCanvas:
Это важно, потому что дальше код преобразования координат у нас поменяется немного, может быть несколько раз, и вам придется либо везде менять x*cellSize на новую формулу, либо можно будет просто подправить метод field2screen(). -------------------------------------------------- Так... Метод DrawablePoint.setNewColor() я выше описал, теперь GridsCanvas.mouseWasClicked().
Довольно просто. Можете потом пощелкать в окне в стороне от сетки и посмотреть что получится =) Теперь метод mouseClicked(), с которого все и началось.
Тут, как видно, нам еще нехватает метода Player.getColor(), который возвращал бы цвет игрока, но его я думаю вы напишете без подсказок. -------------------------------------------- И все вместе с высоты птичьего полета: 1. Пользователь щелкает в окне 2. Ява вызывает Canvas.mouseClicked() 3. mouseClicked() передает информацию в GridsCanvas.mouseWasClicked() 4. mouseWasClicked() устанавливает новый цвет точки PS Да чуть не забыл - в DrawablePoint.paint() нужно вставить строчку g.setColor(color); чтобы кружок рисовался цветом точки!!! Это сообщение отредактировал(а) Rpahut - 17.1.2009, 00:38 --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
| Qawra |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
в Grids пришлось прописать как членов класса две переменные Player first и Player second
которые создаются при нажатии на кнопки в стартовом окошке
Я создала метод setNewColor в классе DrawablePoint . Но " пощелкать в окне в стороне от сетки " мне не удалось .У меня там пока только решётка и ничего больше нет Класс Player скомпелировался
Сначала я поместила
Это сообщение отредактировал(а) Qawra - 17.1.2009, 16:16 |
||||||||||
|
|||||||||||
| Rpahut |
|
||||||||||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Блин какая путаница с классами. Я как-то позабыл, что игроки у нас создаются в стартовом окне. Ну ничего, это можно поправить - вы правильно прописали игроков, осталось только убрать эти переменные из стартового окна. А то так у нас четверо игроков - двое прописаны там и двое тут. Еще нужно немного исправить программу. Привожу код:
Когда это добавите, ошибка nullPointerException должна пропасть. ________________________________
Ну, Player.getColor() на самом деле гораздо проще:
Смысл именно в том чтобы получить от игрока его цвет. first.getColor() - возвращает цвет первого игрока second.getColor() - возвращает цвет второго игрока currentPlayer.getColor() - возвращает цвет того игрока, который сейчас ходит _______________________________
=) Эти строки используются в Grids.mouseClicked(), немного в другом виде правда. Отдельно я их писал в качестве примера. --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||||||||||
|
|||||||||||||
| Qawra |
|
||||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
В Grids.mouseClicked(MouseEvent e) мы создаём обьект currentPlayer который
видимо будет использоваться только в этом классе . Могу я его обьявить private или даже наверно "protected ?
Какой идентифаер присвоить firstDefautColor и secondDefautColor пока не знаю . Они у нас появляются в стартовом окошке как private
Запустила я программу полюбоваться на решётку ... Если кликнуть то часть точек меняет цвет на цвет игрока Там правда прорисовывается лишняя точка в левом верхнем углу с координатами (0,0) которой там теоретически быть не должно . Мы рисуем точки начиная с x=1 , y=1
Точка эта тоже способна менять цвет на цвет игрока. Причём делает она это при первом же шелчке мышки на решётке ! |
||||||||||||||
|
|||||||||||||||
| Rpahut |
|
||||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
А зачем?. И объект мы не создаем, нет никакого new Player(). Мы создаем переменную, и создаем мы ее внутри метода, так что за пределами метода ее "видно" не будет. private и protected приписывается членам класса чтобы обозначить, возможен ли к ним доступ из других классов или нет. К переменным метода из за его пределов нельзя добраться независимо от того хотите вы этого или нет.
Так новую игру начать в любом случае не выйдет. Нужно стартовое окно setVisible(true) а Grids закрыть. Советую на это забить сейчас.
g.fillOval(getX() - 6, getY() - 6, 6 * 2, 6 * 2); - А вот здесь что у вас??? --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||||
|
|||||||
| Qawra |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
Это я пробовала сама кружочки закрасить
Без этого тоже работает так что я это уже отключила. Точнее я это перенесла в метод
может быть это и вызывало лишнию точку потому что теперь её ужё нет . |
|||
|
||||
| Qawra |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
Теперь я думаю можно скрыть точки которые мы создали и попытаться нарисовать точки за игроков .В GridsCanvas я отключаю пока
Когда мы нажимаем кнопку старт у нас запускается конструктор Grids
Метод Grids.mouseClicked я попыталась изменить что-бы начать рисовать точки по очереди цветами игроков . Даже не целюсь в углы решётки.Просто пытаюсь передать цвет и ход .
Это сообщение отредактировал(а) Qawra - 21.1.2009, 21:56 |
||||||
|
|||||||
| Rpahut |
|
||||||||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Вообще говоря у нас программа, если она правильно работает, уже должна менять цвет точки на цвет игрока при щелчке. Так что отключать и менять ничего не надо. Другое дело что у нас не передается ход от одного игрока другому. Логика программы такая: пока пользователь ничего не делает, в нашей программе ничего не происходит. Тут то же что и в настоящих точках, на листочке - пока вы не поставите точку, игра никуда не продвинется. Как только происходит щелчок - запускается метод mouseClicked() и все остальные, в которых наш код и выполняет всю работу, а потом программа снова засыпает до следующего щелчка. Как я раньше и писал:
Не компилируется потому что у вас опять тип переменной вместе с параметром вписан - видно это ваши самые любимые грабли Этот метод вызывает сама Ява - каждый раз когда mouse clicked. Нам этого делать не нужно! Да и в MouseEvent наша программа тогда должна перед этим вписать координаты щелчка, которого еще небыло - как вы собирались заставить это работать?... У нас в Grids.mouseClicked был кусок такой:
Чтобы игроки ходили по очереди, нужно его подправить немного:
Переменную secondPlayerMove выкиньте вообще и забудьте. У нас если fistPlayerMove равно true - значит сейчас ход первого игрока; если fistPlayerMove равно false - значит ход не первого игрока - это то есть второго. Если не ходит первый, значит однозначно ходит второй - у нас их всего двое. ----- Можно посмотреть весь код - классы Grids, GridsCanvas, DrawablePoint и Player? --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||||||||
|
|||||||||||
| Qawra |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
Методом проб и ошибок я нашла чего не хватало для рисования точек при щелчке мышкой .Точки у нас уже созданы и при щелчке они меняют цвет ,но если их создать не прорисовывая , то щелчки по пустой решётке ни к какому эфекту не приводят .
В методе mouseWasClicked вместо repaint(); нужен был points[pointX][pointY].drawCircle(x,y,this.getGraphics());
Любимые мои грабли засели в подсознании . Я слишком много и быстро прочитала о Java . Когда обьём информации превысил определённый уровень - детали перестали цеплятся сознанием и стали формироваться образы в которых переменные были прописаны вместе с параметрами ... Наверно это с сайта sun на котором я каждый день читала структуры классов что бы нарисовать GUI . Особенно трудно когда я за компьютером в школе потому что русский язык там не отображается .В результате я не могу прочитать в текстовом файле то что вы мне рекомендуете сделать и действую как получается . И получаются грабли
|
||||
|
|||||
| Rpahut |
|
||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Боюсь что все то же самое, но не на русском, я написать не смогу. No vy mozhete perevesti russkij tekst v translit na etoj stranice
Ладно.
Точки в любом случае меняют цвет, но этого естественно не видно, если у вас отключена отрисовка. Я так понял вы хотите чтобы пока точка не поставлена ее небыло видно? Для этого достаточно подправить метод DrawablePoint.paint(). Я как-то помнится советовал вам использовать DrawablePoint.paint() вместо drawCircle() - потому что drawCircle(), очевидно, рисует круг и ничего больше, а paint() отображает Точку, и отображает в том виде, в каком нам хочется. У меня например не рисуется сетка на поле - вместо этого непоставленные точки отображаются в виде пустых кружков светло-серого цвета. Поставленные точки закрашиваются цветом игрока. Вы можете сделать как вам больше нравится - например не рисовать "пустые" точки совсем - но paint() все равно должен вызываться для каждой точки. В метод paint() можно добавить условие, проверяющее поставлена точка или нет, и в зависимости от результата менять код рисования точки. Я пробежался по коду и сдается мне что у ваших точек color==null когда они не поставлены - это можно использовать:
И не надо ломать голову - просто вызываете paint(), а точка уже сама решит, рисоваться ей или нет. Объектно-ориентированное "разделяй и властвуй" в самой наглядной его форме. --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||
|
|||||
| Qawra |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
В транслите я не только глаза сломаю но и мозги могу вывихнуть .
Русский конечно лучше ... cегодня на свой ноут самодельные русские буквы приклеила Я уже пробовала использовать paint() , но у меня по какой-то причине не рисовалось и я этот метод удалила . Потом я использовала drawCircle и он рисовал пустые кружочки . Затем я заменила в самом методе drawCircle на fillOval и всё чудно прорисовалось. То есть мои точки немного овальные получились но не пустыми. Название метода drawCircle осталось по инерции. Сам метод рисует овальные цветные точки .Нужно ли его менять в интересах логики игры или можно оставить ? У меня решётка прорисовывается но точки ставятся где угодно ( даже друг на друга можно ставить ) . Для того что-бы они могли ставиться только в углах решётки нужно видимо подкорректировать методы работающие с координатами
но думаю что это не будет работать во всех возможных случаях . Могут быть OutOfBoundary Exceptions... |
||||
|
|||||
| Rpahut |
|
||||||
![]() 0xdeadbeef ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 9.4.2006 Репутация: 5 Всего: 7 |
Ну для начала - в предыдущем сообщении я приводил код, там метод подразумевался именно paint(); я сам запутался и не то название написал.
Игре абсолютно безразлично, как называются методы (кроме спец. случаев, вроде mouseClicked); но принято давать методам(и классам и переменным) имена, отражающие их назначение - с расчетом на то, что кто-то помимо программиста будет читать код, или вы сами, скажем через годик, откроете исходники и попытаетесь в них разобраться. Пока метод drawCircle() рисует только круг - можно называть его так. Но - опять то о чем я говорил, и немного забегая вперед - рисование точки это не просто рисование круга. По меньшей мере там: 1. не рисуется ничего, если точка не поставлена 2. рисуется круг, если точка поставлена 3. когда точка захвачена (внутри замкнутого контура), это тоже влияет на внешний вид точки Все вместе это нужно называть более общим словом - вроде paint() или display(). Дальше - все что нужно для рисования точек у нас уже есть. Если вас не устраивает, как рисуется точка, то вы меняете код в методе paint() (или drawCircle()) - потому что именно этот метод определяет, как рисуется точка. Может показаться не очень логичным, что paint() нужно вызывать даже для точек, которые не должны быть видны.
Но класс GridsCanvas, в котором у нас рисуются точки, не может решать, какую точку рисовать, а какую нет - у нас происходит "разделение труда" между классами, и GridsCanvas(второе имя Field) отвечает за то чтобы каждая точка рисовалась на положенном ей месте на поле. Точка не может решать, на каком месте ей нарисоваться, но она может решать рисоваться ли ей вообще. ====================================== Смысл Объектно-Ориентированного программирования в том, что программа разделяется на объекты-классы, каждый из которых занят своим делом. Когда вы пишете код класса DrawablePoint, вам не нужно держать в голове код остальных классов. Можно вообще забыть на время что есть еще какие-то классы - потому что все нужное точке она хранит внутри себя:
То же с классом GridsCanvas:
Чо-то опять длинновато получилось... --------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею? |
||||||
|
|||||||
| Qawra |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 188 Регистрация: 6.3.2007 Репутация: 3 Всего: 4 |
Методы я разделила . Теперь они выглядят так
|
|||
|
||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |