motofan logo
> 

Делаю Тетрис - Присоединяйтесь., Сделай игру на свой вкус.

Грустный
сообщение 12.10.2006, 23:41 Закрепленное сообщение!


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Тетрис
А теперь и Линии
Проект создавался как «учебный», но меня так никто и не поддержал :) .

Требования:
CLDC1.0
MIDP1.0/MIDP2.0
MMAPI 1.1 (JSR 135)
Не зависит от разрешения экрана (в разумных пределах :) )

Проверенно на:
Motorola V180, V360
Sony-Ericsson K700


Тетрис
Последняя версия 3.1:
Прикрепленное изображениеПрикрепленное изображение
Исходники:
Прикрепленный файл src.rar   ( 36.2 килобайт ) Кол-во скачиваний: 513

Программа:
Прикрепленный файл MIDP1_0.rar   ( 28.36 килобайт ) Кол-во скачиваний: 387
или с мобильного телефона через WAP:
wap.upmobile.ru/users_files/tetris3013.jad

Прикрепленный файл MIDP2_0.rar   ( 28.5 килобайт ) Кол-во скачиваний: 513


Рекомендую почитать:
"Programming Game AI by Example" by Mat Buckland.
С.Стелтинг, О.Маассен - "Применение шаблонов JAVA"
"Java Design Patterns: A Tutorial" By James W. Cooper

Информация по StateMashin (и много другой интересной) на русском есть на
САЙТ ПО АВТОМАТНОМУ ПРОГРАММИРОВАНИЮ И МОТИВАЦИИ К ТВОРЧЕСТВУ

История проекта:
1.0.1:
- под любое разрешение (в разумных пределах)
1.1.0:
- фигуры 4-х цветов
- восстановление после перехода в паузу (закрытия крышки на V180-360)
1.2.1:
- показывает (и сохраняет в RecordSourse) 5 лучших результатов.
- в Options можно менять:
размер 20х10 или 18х10 (для V180 рекомендую 18х10)
реакцию на удержание стрелок в игре (Slide):
1.2.2:
- наконец-то разобрался с RecordStore.
(Кому интересно, смотри OptionsStore и ARecordStore)
- устранены мелкие недочёты.
- малость оптимизировал работу с памятью.
1.2.3:
- показывается следующая фигура
2.0.0:
- появился звук
2.1.0:
- теперь и по-русски
2.1.1:
- для Нокий 60 серии сделал полноэкранный режим (спасибо dmtrlbdv)
2.1.2:
- исправлен режим "Sound OFF"
- исправлен выбор языка
3.0:
- умерены требования к размеру памяти
- возможность запуска на телефонах с MIDP1.0 (тестировал только на эмуляторах)
- немного "раскрашен" интерфейс
- теперь фигура не начинает движения, пока не закончится уборка заполненых линий
- режим "повтор" действует только на кнопки "вправо"/"влево"
3.1:
- циклическая прокрутка в меню
- возможность выбора направления вращения


Линии:
Последняя версия 1.1:
Прикрепленное изображение
Исходники:
Прикрепленный файл src.rar   ( 36.86 килобайт ) Кол-во скачиваний: 410

Программа:
Прикрепленный файл MIDP1_0.rar   ( 29.36 килобайт ) Кол-во скачиваний: 370
или с мобильного телефона через WAP:
wap.upmobile.ru/users_files/lines3013.jad

Прикрепленный файл MIDP2_0.rar   ( 29.47 килобайт ) Кол-во скачиваний: 382

История проекта:
1.0:
- первая версия: "движок" взят из Тетриса 3.0
1.1:
- циклическая прокрутка в меню

Сообщение отредактировал Грустный - 5.7.2007, 6:07
Прикрепленный файл src.rar   ( 36.86 килобайт ) Кол-во скачиваний: 410
Прикрепленный файл src.rar   ( 36.2 килобайт ) Кол-во скачиваний: 513
Прикрепленный файл MIDP1_0.rar   ( 28.36 килобайт ) Кол-во скачиваний: 387
Прикрепленный файл MIDP2_0.rar   ( 28.5 килобайт ) Кол-во скачиваний: 513
Прикрепленный файл MIDP1_0.rar   ( 29.36 килобайт ) Кол-во скачиваний: 370
Прикрепленный файл MIDP2_0.rar   ( 29.47 килобайт ) Кол-во скачиваний: 382
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 20.9.2006, 7:30


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Грустный. Понедельник, 18 Сентября 2006, 16:59
Цитата
По-видимому, как и многие, кто просматривает этот форум, я отношусь к категории начинающих разработчиков  .

Начинать какое-либо дело в одиночку – трудно.
Поэтому выношу предложение:
Создать учебный проект по написанию приложений для телефонов.
И шаг за шагом совместно двигаться вперёд.

Меня смущают темы, на которых народ берётся сразу за «гонки», «браузеры» и т.д.

Предлагаю начать с простого – тетрис, арканоид и т.п.

Если кого заинтересовало – поддержите  .

Valleo. Понедельник, 18 Сентября 2006, 17:17
Цитата
Это не простейшее, легче сделать броузер, чем тетрис или арканоид.
Самое легкое - это вывод hellowworld на экране дисплея.
...
...
Причина закрытия (Valleo 18-09-2006): Дублирует существующую тему


Я не считаю, что написать тетрис на яве сложно.

За пару дней получилось кое-что.

Экранчики:
Прикрепленное изображение
Прикрепленное изображение

На данный момент:
- на эмуляторах идёт, на моём V360 - только меню
- хотелось бы уличшить дизайн
- добавить звук

Сообщение отредактировал Грустный - 13.10.2006, 0:42
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
2 страниц V  1 2 >  
Ответ в темуСоздание новой темы
Ответов(1 - 39)
Грустный
сообщение 21.9.2006, 4:37


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Версия 1.0.1 - под любое разрешение (в разумных пределах).

Сообщение отредактировал Грустный - 13.10.2006, 0:40
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 22.9.2006, 6:07


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Разобрался, почему не правильно работает на телефоне:
у эмулятора и телефона не совпадают клавиши (например "круглаш" на эмулаторе даёт "FIRE_PRESSED", а не телефоне нидаёт ничего)

Кроме того, доработал совместимость с CLDC 1.0 (у супруги V180).
Пришлось добавить класс MyRandom вместо java.util.Random (в CLDC 1.0 нет nextInt(int))


Код

// взято из документации J2ME Wireless Toolkit 2.2
import java.util.Random;

public class MyRandom extends Random {
 public int nextInt(int n) {
     if (n<=0)
         throw new IllegalArgumentException("n must be positive");

     if ((n & -n) == n)  // i.e., n is a power of 2
         return (int)((n * (long)next(31)) >> 31);

     int bits, val;
     do {
         bits = next(31);
         val = bits % n;
     } while(bits - val + (n-1) < 0);
     return val;
 }
}


Проверено на SE K700.
С кнопками всё соответствует эмулятору.

Сообщение отредактировал Грустный - 13.10.2006, 0:49
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 24.9.2006, 22:17


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Проверил на V180 - с кнопками таже история, что и на v360 - не соответствуют эмулятору :(
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 25.9.2006, 3:24


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Нашёл книжку "Programming Game AI by Example" by Mat Buckland.
Пробую паттерн StateMchine.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
belpilgrim
сообщение 25.9.2006, 5:33


Мастер
****

Группа: Пользователи
Сообщений: 193
Регистрация: 14.10.2005
Из: Беларусь
Пользователь №: 54 460
Модель телефона: HTC G1, E770
Прошивка: 1.5 v3, VistaRTM

Рейтинг: 117



кнопки надо проверять через
if(getGameAction(keyCode) == FIRE) {
.. ура нажали FIRE, причем на всех телах и эмуляторах
}
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 25.9.2006, 22:36


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Цитата(belpilgrim @ Понедельник, 25 Сентября 2006, 16:33)
кнопки надо проверять через
if(getGameAction(keyCode) == FIRE) {
.. ура нажали FIRE, причем на всех телах и эмуляторах
}
*



это если Canvas.keyPressed()
а если GameCanvas.getKeyStates(), то
Код
if ((key & GameCanvas.FIRE_PRESSED) != 0){...}


Пробовал в GameCanvas использовать keyPressed() - вроде как наследуется от Canvas.
В наследнике Canvas достаточно:
Код
protected void keyPressed(int keyCode)
{
...
}


В GameCanvas не вызывается.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Andy51
сообщение 26.9.2006, 13:14


0xFFFF
******

Группа: Разработчики
Сообщений: 832
Регистрация: 28.3.2006
Из: Нижний Новгород
Пользователь №: 76 255
Модель телефона: E398, Milestone 2
Прошивка: 49R w/ElfPack2


Настроение:
^^,



Рейтинг: 1224



Грустный, помнится, я тоже разбирался с кнопками. В wtk, вроде, константы кнопок правильно заданы, но они не совпадают с раскладкой эмулятора из Motorola SDK - там у констант знак не тот :(
А GameCanvas.getKeyStates() чем плох - он выдаст далеко не все клавиши, которые вводит юзер... Там вроде есть группы клавиш, имеющие одинаковое значение. А чем хорош - можно сделать обработку одновременных нажатий :)
Цитата
в CLDC 1.0 нет nextInt(int)
blink.gif я же его юзал на 372 прошивке, с CLDC1.0
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
dmtrlbdv
сообщение 26.9.2006, 15:16


Интересующийся
**

Группа: Пользователи
Сообщений: 32
Регистрация: 26.9.2006
Из: Питер
Пользователь №: 100 712
Модель телефона: nokia 3230

Рейтинг: 0



Цитата
Пробовал в GameCanvas использовать keyPressed() - вроде как наследуется от Canvas.
В наследнике Canvas достаточно:
CODE
protected void keyPressed(int keyCode)
{
...
}
В GameCanvas не вызывается.


В Вашем наследнике от GameCanvas в конструкторе должно быть так

// false разрешает "старый" метод обработки клавиш
super(false);

тогда keyPressed будет отрабатывать.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 27.9.2006, 0:22


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Andy51, я проверял на V180 - именно nextInt(int) нет, есть nextInt() :( (кстати на эмуляторе V180 тоже ругается на nextInt(int))
Цитата(Andy51 @ Среда, 27 Сентября 2006, 0:14)
blink.gif я же его юзал на 372 прошивке, с CLDC1.0


dmtrlbdv - спасибо большое.
Работает. clap;applo

Невнимательно читал документацию. :(
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
wl`
сообщение 27.9.2006, 6:04


Интересующийся
**

Группа: Пользователи
Сообщений: 49
Регистрация: 13.12.2005
Пользователь №: 61 943
Модель телефона: Nokia 6681
Прошивка: ??

Рейтинг: 7.5



cldc к этому не имеет никакого отношения, nextInt(int) - это из MIDP2.0
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 27.9.2006, 23:21


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Цитата(wl` @ Среда, 27 Сентября 2006, 17:04)
cldc к этому не имеет никакого отношения, nextInt(int) - это из MIDP2.0
*


А как тогда понимать:
Из документации WTK22:
Цитата
java.util
Class Random

Since:
JDK1.0, CLDC 1.0

nextInt
public int nextInt(int n)

Since:
CLDC 1.1

Из «Motorola V180 Developer Reference Sheet»
Цитата
J2ME™ Information:
CLDC v1.0 and MIDP v2.0 compliant

Из «Motorola V360/V361 Developer Reference Sheet»:
Цитата
Additional API’s JSR 82, JSR 118,
JSR 120, JSR 135,
JSR 139, JSR 205

(JSR 139 - Connected Limited Device Configuration (CLDC) 1.1 API)

Хотя в спецификации не указано, но в V360 есть и «JSR 75 - File Connection»


Цитата(Грустный @ Понедельник, 25 Сентября 2006, 14:24)
Нашёл книжку "Programming Game AI by Example" by Mat Buckland.
Пробую паттерн StateMchine.
*




Разобрался со StateMashine - лично мне очень упростило написание меню и интерфейса с пользователем.
Возможно в тетрисе я и прегнул с использованием этого патерна - но зато проверил его в действии.

В меню также применил патерн Command и CommandHolder (у меня Action и ActionHolder, чтобы не путаться с Command из MIDP).

Кстати, попутно возник вопрос: можно ли обрабатывать Command из MIDP в FullScreenMode без отображения на экране?

Например повесить на SOFT2 паузу, но без вот этого: Прикрепленное изображение


Новое в 1.1.0:
- фигуры 4-х цветовПрикрепленное изображение
- восстановление после перехода в паузу (закрытия крышки на V180-360)

Следующий шаг: разобраться с RecordStore для хранения настроек и результатов. Присоединяйтесь.

Сообщение отредактировал Грустный - 13.10.2006, 0:43
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
wl`
сообщение 28.9.2006, 4:55


Интересующийся
**

Группа: Пользователи
Сообщений: 49
Регистрация: 13.12.2005
Пользователь №: 61 943
Модель телефона: Nokia 6681
Прошивка: ??

Рейтинг: 7.5



с моторами никогда не работал, но мне кажется не стоит использовать команды в полноэкранном режиме - лучше обрабатывать софтклавиши в keyPressed, например так:
Код

void keyPressed(int k){
  if(k==21 || k==-6) // lsoft
      doLSoft();
  else if(k==22 || k == -7) //rsoft
      doRSoft();
  else{
      // other keys
  }
}

при таком подходе софтклавиши будут нормально обрабатываться на Motorolla, SE, Nokia

----

но если обрабатывать все же нужно именно Command, то в таком случае это тоже можно сделать, в методах doLSoft(), doRSoft() насильно вызывая метод commandAction с нужными кнопками (сами кнопки при этом на канвас не добавлятся, но канвас реализует интерфейс CommandListener).
это может потребоваться в том случае, если наш канвас обрабатывает команды от Форм, Cписков и прочее - логику обработки нажатий софт-клавиш можно поместить в одно место.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 28.9.2006, 5:30


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Цитата(wl` @ Четверг, 28 Сентября 2006, 15:55)
с моторами никогда не работал, но мне кажется не стоит использовать команды в полноэкранном режиме - лучше обрабатывать софтклавиши в keyPressed, например так:
Код

void keyPressed(int k){
  if(k==21 || k==-6) // lsoft
      doLSoft();
  else if(k==22 || k == -7) //rsoft
      doRSoft();
  else{
      // other keys
  }
}

при таком подходе софтклавиши будут нормально обрабатываться на Motorolla, SE, Nokia

У разных производителей разные коды софиклавиш. При чём, не всегда совпадают с кодами эмуляторов.
----
Цитата
но если обрабатывать все же нужно именно Command
...

Просто при использовании Command софтклавиши срабатывают на всех телафонах. В полноэкранном режиме на экран ничего не добавляется, только при нажатии появляется картинка со списком привязанных Command'ов . А она мне не нужна :( Отрисовка идёт до передачи управления в CommandListener.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
wl`
сообщение 28.9.2006, 5:55


Интересующийся
**

Группа: Пользователи
Сообщений: 49
Регистрация: 13.12.2005
Пользователь №: 61 943
Модель телефона: Nokia 6681
Прошивка: ??

Рейтинг: 7.5



вообще, под разные модели телефонов делают разные порты, можно с уверенностью сказать, что твой универсальный мидлет не будет работать на какой-нибудь лыже или ещё где (ну, к примеру, его не удается запустить на эмуляторе MidpX, с ошибкой: No such method equalsIgnoreCase). И в этих портах учитываются особенности конкретных моделей (к примеру, размер экрана, те же многострадальные софтклавиши). вот при портировании и задаются соответствующие коды клавиш.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 28.9.2006, 6:11


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Пока проверял на Сони-эриксон k700, Нокиа 7270, Самсунг(не помню модель, что-то из новых), Fly МР220, Моторола V180,V360.
Кроме проблем с софтклавишами и getKeyStates, других несовместимостей не нашёл.
(о CLDC 1.0 я уже писал)
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
wl`
сообщение 28.9.2006, 6:44


Интересующийся
**

Группа: Пользователи
Сообщений: 49
Регистрация: 13.12.2005
Пользователь №: 61 943
Модель телефона: Nokia 6681
Прошивка: ??

Рейтинг: 7.5



ну, к примеру, на моей NGAGE QD не работает (MIDP1.0, CLDC 1.0), на 6681 - в углу экрана, как выйти, не понял, убивал процесс...

вообще, еще иногда в играх с простым управлением дублируют софтклавиши на кнопки "*" и "#"
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 28.9.2006, 6:57


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Цитата(wl` @ Четверг, 28 Сентября 2006, 17:44)
ну, к примеру, на моей NGAGE QD не работает MIDP1.0, CLDC 1.0), на 6681 - в углу экрана, как выйти, не понял, убивал процесс...
всё таки Game API - сдандарт только с MIDP2.0, просто мне на MIDP1.0 лень возиться с буферизацией, да и пишу я главным образом для себя и супруги :)
Цитата
вообще, еще иногда в играх с простым управлением дублируют софтклавиши на кнопки "*" и "#"
*


и я так решил

Естественно, для игр с графикой посложнее :) чет тетрис, придётся под каждое разрешениие портить :(
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 28.9.2006, 23:41


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Пробовал переделать под MIDP-1.0 - вроде бы и не сложно, но ограничения по памяти - не для начинающего.
А писать с ноля - лень.
Если у кого есть желание оптимизировать - выкладываю переделанные исходники, ошибок по компиляции нет, но при запуске выдаёт java.lang.OutOfMemoryError.
Прикрепленный файл src_MIDP1.rar   ( 26.44 килобайт ) Кол-во скачиваний: 227
Прикрепленный файл src_MIDP1.rar   ( 26.44 килобайт ) Кол-во скачиваний: 227
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
IceflaSh
сообщение 30.9.2006, 16:09


Интересующийся
**

Группа: Пользователи
Сообщений: 45
Регистрация: 26.6.2006
Пользователь №: 89 149
Модель телефона: e398
Прошивка: Rokr

Рейтинг: 5



Цитата(Грустный @ Понедельник, 25 Сентября 2006, 11:24)
Нашёл книжку "Programming Game AI by Example" by Mat Buckland.
Пробую паттерн StateMchine.
*


Можешь дать работающий линк? немогу найти :(
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 2.10.2006, 0:51


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Цитата(IceflaSh @ Воскресенье, 1 Октября 2006, 3:09)
Можешь дать работающий линк? немогу найти :(
*


Странно, яндекс выдал кучу ссылок :)
Я брал больше года назад на realcoding.net.
http://www.realcoding.net/downloads/view/1075
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 4.10.2006, 0:55


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Версия 1.2.1:

Показывает (и сохраняет в RecordSourse) 5 лучших результатов.
В Options можно менять:
- размер 20х10 или 18х10 (для V180 рекомендую 18х10)
- реакцию на удержание стрелок в игре (Slide):
OFF - не реагирует
ON - реагирует
Настройки пока не сохраняются :(
Переход на следующий уровень на 500-х очках.

Далее:
- сохранение настроек
- отображение следующей фигуры
- ну и конечно, звук.

Сообщение отредактировал Грустный - 13.10.2006, 0:45
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Stranger
сообщение 4.10.2006, 6:21


Опытный
***

Группа: Почётные мотофаны
Сообщений: 135
Регистрация: 4.7.2005
Из: Донецк,Украина
Пользователь №: 45 406
Модель телефона: E60, E398
Прошивка: 49r

Рейтинг: 116



Просмотрел твои исходники. Не знаю, зачем так все усложнять. Зачем столько классов, зачем эти все package. Попробуй убрать все package, переместив все одну корневую папку и увидишь, насколько уменьшится размер jar'a. Понимаешь, такое простоe приложение как тетрис не должно валиться с OutOfMemoryException. Для игры оптимально использовать максимум 5-7 классов: 1 - расширяющий Midlet, второй - Canvas, имплеминтирующий интерфейс Runnable. В методе run() поместить какой-нибудь handle(), запрос на перерисовку. Ну можно еще какой-нибудь класс типа LevelClass придумать, экземпляры которого будут создаваться с каждым уровнем, можно еще какой-нибудь UtilClass, содержащий статические функции, часто используемые в игре и все...Поверь, все проекты, которые я видел, содержали не более вышеуказанного числа классов. Это ведь J2me!
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
wl`
сообщение 4.10.2006, 18:05


Интересующийся
**

Группа: Пользователи
Сообщений: 49
Регистрация: 13.12.2005
Пользователь №: 61 943
Модель телефона: Nokia 6681
Прошивка: ??

Рейтинг: 7.5



Stranger, загляни в jar и ты увидишь, что обфускатор убрал все пакеты.
во-вторых, это учебный пример, а не рабочая игра.
в третьих, есть игрушка (и конкретнее, Mobile Mafia), в которой больше 200 классав, по сути вся игра - одни классы (300 кб), и ресурсы она грузит по жопорезу, около мегабайта.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 4.10.2006, 23:29


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



wl`, спасибо.

Stranger. Java, всё таки, ОО, и делался таким, вовсе не для того чтобы сваливать всё в одну кучу.
А множество пакетов - так, когда буду делать следующий проект, то без проблем воспользуюсь наработками.
Так, меню я делал для арканоида :) , и его перенос в тетрис занял 10 минут, а добавление второго - 5.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 5.10.2006, 0:30


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Stranger, спасибо за идею :) использовать ByteArrayOutputStream и DataOutputStream для работы с RecordStore.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Inferpse
сообщение 7.10.2006, 16:41


Ветеран
*****

Группа: Пользователи
Сообщений: 485
Регистрация: 27.5.2006
Пользователь №: 84 962
Модель телефона: -

Рейтинг: 195



Скачал тетрис из этого поста.
Но вот кнопки ты не все определил... blink.gif Только FIRE кажется.
А как же влево и вправо?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
dmtrlbdv
сообщение 7.10.2006, 20:46


Интересующийся
**

Группа: Пользователи
Сообщений: 32
Регистрация: 26.9.2006
Из: Питер
Пользователь №: 100 712
Модель телефона: nokia 3230

Рейтинг: 0



Грустный

С реалкодинга не скачал (ссылка не работает), но всё-таки нашёл книжулю :) . Подозреваю , что много народа столкнётся с такой-же проблемой. Поэтому , если Вам не трудно в двух словах бы объяснили , что такое паттерн StateMchine. Ибо раз уж проект учебный , то имеет смысл , т.к. в чужом коде разбираться новичку , на которого в принципе идёт рассчёт, будет тяжело, тем более не зная , что в коде реализуется ( а если ещё учесть , что у многих с англицким проблемы rolleyes.gif и даже скачав книгу им будет тяжко :) ).
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Stranger
сообщение 8.10.2006, 17:10


Опытный
***

Группа: Почётные мотофаны
Сообщений: 135
Регистрация: 4.7.2005
Из: Донецк,Украина
Пользователь №: 45 406
Модель телефона: E60, E398
Прошивка: 49r

Рейтинг: 116



dmtrlbdv,
в ближайшее время я постараюсь написать F.A.Q, в котором были бы изложены основные принципы создания игры(пусть это будет простейший арканоид). Ну а в качестве добавки в F.A.Q будут помещены заметки о проблемах, возникающих при портировании игр.

P.S.
Тов. Грустный назначен куратором данной темы :)
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 9.10.2006, 6:59


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Цитата(InfernalCorpse @ Воскресенье, 8 Октября 2006, 3:41)
Скачал тетрис из этого поста.
Но вот кнопки ты не все определил...  blink.gif  Только FIRE кажется.
А как же влево и вправо?
*



В классе Menu обрабатываю:
Canvas.DOWN
Canvas.UP
Canvas.FIRE
Остальные не нужны (пока).

В классе Game:
GameCanvas.LEFT_PRESSED
GameCanvas.RIGHT_PRESSED
GameCanvas.DOWN_PRESSED

-7 (SOFT2 - SonyEricson)
-22 (SOFT2 - Motorola)
Canvas.KEY_POUND (для других :))
Canvas.UP
Canvas.LEFT
Canvas.RIGHT

Для тетриса пока достаточно...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 9.10.2006, 23:44


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Информация по StateMashin (и много другой интересной) на русском есть на САЙТ ПО АВТОМАТНОМУ ПРОГРАММИРОВАНИЮ И МОТИВАЦИИ К ТВОРЧЕСТВУ
В дву словах :)

Некая сущьность может находится в нескольких состояниях. Каждое состояние определяем классом. В классе можно определить действия, которые надо выполнить при входе в состояние (enter), при выходе (exit) и в игровом цикле (execute).
Пример:
Каждый пункт меню (MenuItem) может быть в двух состояниях - выделенном (StateSelected) и невыделенном (StateUnselected).
При входе в каждое из этих состояний меняем цвет пункта и шрифта:
Код
((MenuItem)item).setColor(((MenuItem)item).m_Menu.m_Style.UnselColor);
((MenuItem)item).setFontColor(((MenuItem)item).m_Menu.m_Style.UnselFontColor);

Использование:
Для простоты применения определяем интерфейс состояния:
Код
public interface IState {
    public void enter(IBaseEntity entity);
    public void execute(IBaseEntity entity);
    public void exit(IBaseEntity entity);
}

В классе состояния используем паттерн Singleton («одиночка»):
Конструктор делаем «приватным»:
Код
    private StateUnselected(){}

храним ссылку на этот класс
Код
    private static StateUnselected instance;

и «публичный» метод для доступа:
Код
    public static StateUnselected getInstance(){
 if (null == instance){
     instance=new StateUnselected();
 }
 return instance;
    }

В результате у нас всегда будет всего один экземпляр StateUnselected.

В классе имеющем состояния определяем объект класса StateMachine:
Код
private StateMachine m_StateMachine;

Для доступа к нему публичный метод:
Код
   public StateMachine getStateMachine(){
       return m_StateMachine;
   }

В реализации меню применяю ещё один интересный паттерн Command.
Я обозвал его Action чтобы не путать с Command из JDK.
Смысл Action такой же как и Command из JDK – выполнить действия, не зная ничего о их природе.
Пример:
Отобразить главное меню (перевести Engine в состояние StateOnMenu)
В Engine определяем класс
Код
   public class MainMenu implements IAction {
       public void execute() {
           m_StateMachine.changeState(StateOnMenu.getInstance());
       }
   }

В MenuItem, который реализует интерфейс ActionHolder, передаём указатель на MainMenu через setAction().
В Menu при нажатии FIRE вызываем MainMenu.Execute():
Код
((IActionHolder) MenuItem.getAction().execute();

При этом MenuItem совершенно не важно, что он запускает.

Возможно, мои объяснения не слишком ясны.
Рекомендую почитать:
С.Стелтинг, О.Маассен - "Применение шаблонов JAVA"
"Java Design Patterns: A Tutorial" By James W. Cooper
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
dmtrlbdv
сообщение 10.10.2006, 20:57


Интересующийся
**

Группа: Пользователи
Сообщений: 32
Регистрация: 26.9.2006
Из: Питер
Пользователь №: 100 712
Модель телефона: nokia 3230

Рейтинг: 0



Другое дело clap;applo Теперь , чтобы кому-то разобраться в коде , не нужно будет потратить уйму времени на поиски и выкачивание книги. ( Т.е. конечно книга всё равно не помешает , но и её текущее отсутствие не станет непреодолимой преградой к пониманию того , что творится в коде ). Спасибо. :)
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 12.10.2006, 3:34


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Версия 1.2.2

Изменения:
- Наконец-то разобрался с RecordStore.
(Кому интересно, смотри OptionsStore и ARecordStore)
- Устранены мелкие недочёты.
- Малость оптимизировал работу с памятью :)

Ближайшие планы:
- Добавить паказ следующей фигуры.

Нужна помощь:
- где взять звуки (и музыку)
- ну и, конечно, нужны тестеры :)

В силу сказаного мной в посте Obfuscator, Optimizing a Java ME, переделал класс VectorPainted:
Код
   public void paint(Graphics g){
       for(int i=0,k=objects.size();i<k;i++){
               ((IPainted)objects.elementAt(i)).paint(g);
       }
   }

Будет в исходниках следующей версии.

Сообщение отредактировал Грустный - 13.10.2006, 0:46
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Stranger
сообщение 12.10.2006, 7:20


Опытный
***

Группа: Почётные мотофаны
Сообщений: 135
Регистрация: 4.7.2005
Из: Донецк,Украина
Пользователь №: 45 406
Модель телефона: E60, E398
Прошивка: 49r

Рейтинг: 116



Наведи порядок, пожалуйста, в теме. Вынеси все важное в одно сообщение, а я или другой модер закреплю его.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Frozen Fire
сообщение 13.10.2006, 4:54


Интересующийся
**

Группа: Пользователи
Сообщений: 80
Регистрация: 1.11.2005
Из: Симферополь
Пользователь №: 56 648
Модель телефона: Nokia E61
Прошивка: 3.0633.09.04

Рейтинг: 7.5



Что-то в исходниках одна картинка...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 15.10.2006, 21:48


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Цитата(Frozen Fire @ Пятница, 13 Октября 2006, 15:54)
Что-то в исходниках одна картинка...
*


А она одна и есть :) , остальное рисуется - зато не зависит от разрешения (см. tetris.MyImage).
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
dmtrlbdv
сообщение 15.10.2006, 21:56


Интересующийся
**

Группа: Пользователи
Сообщений: 32
Регистрация: 26.9.2006
Из: Питер
Пользователь №: 100 712
Модель телефона: nokia 3230

Рейтинг: 0



Цитата(Грустный @ Понедельник, 16 Октября 2006, 1:48)
А она одна и есть :) , остальное рисуется - зато не зависит от разрешения (см. tetris.MyImage).
*


Он имел ввиду , что там ТОЛЬКО картинка
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 17.10.2006, 1:15


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Версия 2.0.0:
- Добавил звук (см. tetris.AudioPlayer)
Использую MIDI и WAV. Пробовал MP3 - слишком большая задержка перед началом воспроизведения.
- Добавил мигание линий перед "уборкой".

Жуки:
У знакомого на SE K700 глючат кнопки - при нажатии на "софт" (левый/правый) и возврат - программа зависает,
не зависимо от того где находишься, в меню или в игре - странно, т.к. эти кнопки в меню не отслеживаю, а в игре - только правый "софт" (-7).
На "#" в игре реагирует правильно.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Грустный
сообщение 17.10.2006, 5:22


Dum vivimus vivamus
***

Группа: Пользователи
Сообщений: 102
Регистрация: 23.6.2006
Пользователь №: 88 814

Рейтинг: 29



Версия 2.1.0:
Переключение языка - Русский/Английский.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Делаю Тетрис - Присоединяйтесь., Сделай игру на свой вкус. · Разработка Java-игр · Forum
 

2 страниц V  1 2 >
Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 18.7.2025, 0:43

Форум живёт: