|  1.01.2015 / 21:28 |  | 
| vl@volk    Пользователь 
  Сейчас: Offline 
 Имя: ВладиславОткуда: Земля
 Регистрация: 26.12.2012
 
 | RblSb,  ДатаИнпутСтрим не нужен тогда__________________
 
   знает толк | 
|  1.01.2015 / 21:57 |  | 
| Naik    Пользователь 
  Сейчас: Offline 
 Имя: %name%Регистрация: 14.03.2010
 
 | Цитата Ксакеп:RblSb, но этот алгоритм и рассчитан для того, чтобы сжимать строки.Без модификации сжимать строки он не будет, скорее наоборот
 
 | 
|  2.01.2015 / 02:25 |  | 
| Kalter    Пользователь 
  Сейчас: Offline 
 Имя: ГрибОткуда: Оренбург - Нежинка
 Регистрация: 16.10.2013
 
 | Java ME__________________
 Возникает проблема с GameCanvas: при смене экрана текущая битовая маска нажатых клавиш не сбрасывается. То есть при вызове функции getKeyStatus() после возвращения на экран можно получить биты старых нажатий.
 
 Что делать?
 
 
   Homo homini penis est. | 
|  2.01.2015 / 02:48 |  | 
| RblSb    Пользователь 
  Сейчас: Offline 
 Регистрация: 25.07.2011
 | Kalter, что за битовая маска? Я использую отдельные логические переменные для работы с джойстиком и несколько int переменных (код нажатой/отпущенной клавиши), сбросить которые можно в любой момент. Разве так не проще?
 | 
|  2.01.2015 / 02:54 |  | 
| RblSb    Пользователь 
  Сейчас: Offline 
 Регистрация: 25.07.2011
 | Модификация RLE, последовательности в 3 и менее элементов не затрагиваются. Открыть спойлер Закрыть спойлер import java.io.DataOutputStream;import java.io.IOException;import java.io.OutputStream; public class RleOutputStream extends OutputStream {   private boolean frle;  private int current,count;  private final DataOutputStream out;   public RleOutputStream(OutputStream out) {    this.out=new DataOutputStream(out);    current=-2;    count=0;  }   public void write(int b) {}   private void offByte() throws IOException {    //идентификаторы    if (frle==false) {      if (count>3) {        out.writeByte(253);         frle=true;      }    }    else if (count<4) {      out.writeByte(254);      frle=false;    }     if (count>3) { //если сжатие имеет смысл      //out.writeByte(253); //идентификатор начала      if (count>249) { //побайтовое ограничение        for (int i=0;i<count/250;i++) {          out.writeByte(250);          out.writeByte(current);        }        count=count%250;      }      out.writeByte(count);      out.writeByte(current);      //out.writeByte(254); //идентификатор конца    }    else { //обычная запись      for (int i=0;i<count;i++)        out.writeByte(current);    }  }   public void writeByte(int b) throws IOException {    if (b==current) { //байт равен прошлому      count++;    } else { //иной байт      offByte();      current=b;      count=1;    }  }   public void flush() throws IOException {    offByte();    out.flush();    //super.flush();  }}
Открыть спойлер Закрыть спойлер import java.io.DataInputStream;import java.io.IOException;import java.io.InputStream; public class RleInputStream extends InputStream {   private boolean frle;  private int b,count,current;  private final DataInputStream input;   public RleInputStream(InputStream input) {    this.input = new DataInputStream(input);  }   public int read() throws IOException {    if (!frle) { //сжатие не активировано      b=input.read();       if (b==253) frle=true;      else current=b;    }     if (frle) { //ищем конец      if (count<1) b=input.read();      if (b==254) {        frle=false;        b=input.read();         if (b==253) {          frle=true;          b=input.read();        }        else current=b;      }    }     if (frle) {      if (count<1) {        count=b;        current=input.read();      }      count--;    }     return current;  }}
Пример (байты 253,254 не должны использоваться): 1 2 1 1 1 2 2 2 2 7 7 7 7 7 7 3 >> 1 2 1 1 1 253 4 2 6 7 254 3Изменено RblSb (2.01 / 03:02) (всего 4 раза)
 | 
|  2.01.2015 / 04:07 |  | 
| RooMeN    Пользователь 
  Сейчас: Offline 
 Откуда: Нижний НовгородРегистрация: 18.01.2010
 
 | Посоветуйте литературу по Java SE
 | 
|  2.01.2015 / 04:19 |  | 
| Kalter    Пользователь 
  Сейчас: Offline 
 Имя: ГрибОткуда: Оренбург - Нежинка
 Регистрация: 16.10.2013
 
 | __________________RooMeN, для какого уровня?Можешь выбрать  сам.   Извиняюсь за очередную рекламу, просто ресурс действительно очень хороший.
   Homo homini penis est.Изменено Kalter (2.01 / 04:21) (всего 1 раз)
 | 
|  2.01.2015 / 04:36 |  | 
| Kalter    Пользователь 
  Сейчас: Offline 
 Имя: ГрибОткуда: Оренбург - Нежинка
 Регистрация: 16.10.2013
 
 | __________________RblSb, не знаю... Вот же: int keyStates = getKeyStates();if ((keyStates & GameCanvas.FIRE_PRESSED) != 0) {    //поймали кнопку FIRE}
То есть в битовой маске содержатся нажатия (один раз сразу 3 поймал), где каждое нажатие занимает 1 бит (информация о том, какой именно хранится в определённых константах *_PRESSED в GameCanvas). Таким образом с помощью нехитрых битовых и логических операций мы можем поймать более, чем одну нажатую кнопку. Ещё раз опишу свою проблему. 1. Смена X экрана на Y экран во время нажатия на любую кнопку. 2. Смена Y экрана на X экран. Старое нажатие (на первом шаге) никуда не исчезло!
   Homo homini penis est. | 
|  2.01.2015 / 10:45 |  | 
| Ксакеп    Модератор форума 
  Сейчас: Offline 
 Регистрация: 20.06.2012
 | Kalter,  а скинь сорец класса-экрана. Интересует больше, определяешь ли ты там свои обработчики нажатий.
 
 RooMaN, попробуй «Брюс Эккель "Философия Java". 4-е издание» — сильная книга.
 
 
 Rb|Sb, неправильный у тебя какой-то поток получился. Почему это я не могу использовать байты 253, 254? А если мне сильно захочется? Придумай способ, как можно избежать таких ограничений. Например, дублироваь биты: 253 253 ...
 
 Изменено Ксакеп (2.01 / 10:55) (всего 3 раза)
 | 
|  2.01.2015 / 11:00 |  | 
| Kalter    Пользователь 
  Сейчас: Offline 
 Имя: ГрибОткуда: Оренбург - Нежинка
 Регистрация: 16.10.2013
 
 | __________________Разве что убрал всё лишнее: Открыть спойлер Закрыть спойлер /*TODO: add package*/ import java.io.IOException; /** * Name: Screen * * @author Kalter */public final class Name extends Screen {     public Name() throws IOException {    }     //override    public void run() {        while(getGameLoop()) {            fps.process();            checkKey();            update();            paint();            sleep(20);            fps.maximal();        }    }     private void ckeckKey() {        int keyCode = getKeyStates();    }     private void update() {    }     private void paint() {        flushGraphics();    }}
   Homo homini penis est.Изменено Kalter (2.01 / 11:03) (всего 2 раза)
 |