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 раза) |