Вход

Просмотр полной версии : ><> Aqua-battle <><



ALKO
17.01.2011, 15:03
:v2_dizzy_fisher: Самое время порыбачить.
Возник вопрос по этой игрухе.
Каким образом проверить одновременное нажатие клавиш для движения по диагонали? (ADSW)
Думаю проверять 254 порт и параллельно inkey-символ,но громоздко получается.

ALKO
17.01.2011, 15:05
Всегда создавал под кемпстон и с этим проблем не было.
А вот как же быть с клавой?

psb
17.01.2011, 15:11
если на бейсике, то in #xxFE и выделять биты. inkey только для одной кнопки.

ALKO
17.01.2011, 15:20
а можно по подробнее,именно для ASDW ?
И желательно не в HEX а в DEC,это ж sinclair-Basic.

Spectramine
17.01.2011, 17:05
"Так, например, порт 254 (FE) служит для связи процессора
с клавиатурой, магнитофоном, звуковым динамиком и телеэкраном.
Для примера рассмотрим содержимое байта данных, поступаю-
щих или выдаваемых по этому порту.

ПОРТ FE (ВВОД)
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │
└───┴─┬─┴─┬─┴───┴───┴───┴───┴─┬─┘
│ └─────────┬─────────┘
А │
Б
А. Шестой бит указывает на наличие сигнала на магнитофон-
ном разъеме EAR (вход в компьютер). 1 - нет сигнала, 0 есть
сигнал.
Б. Младшие пять битов определяют какая из пяти клавиш каж-
дого полуряда клавиатуры была нажата. Бит равен нулю, если кла-
виша была нажата и 1, если нет.


Для тех, кто не имеет книги Виккерса, напомним, как зада-
ются адреса портов при опросе клавиатуры.
1. Мы указали, что 16-разрядная адресная шина (от А0 до
А15) указывает на адрес внешнего порта.
2. Порт FE задается состоянием адресных линий А0...А7. При
этом А0 - включена, А1...А7 - выключены:
1111 1110
Об остальных адресных линиях А8...А15 мы пока не говорим.
3. В то же время, мы указали, что клавиши полуряда опраши-
ваются по пяти битам данных, поступающим с этого порта
(D0...D5).
4. При этом адресные линии А8...А15 могут указывать о ка-
ком именно полуряде идет речь.
Клавиатура "Спектрума" имеет 40 основных клавиш. Они
разбиты на 8 полурядов по 5 клавиш в каждом.
┌────────────────────┬───────────────────┐
3 │ 1................5 │ 6...............0 │ 4
├────────────────────┼───────────────────┤
2 │ Q................T │ Y...............P │ 5
├────────────────────┼───────────────────┤
1 │ A................G │ H...........ENTER │6
├────────────────────┼───────────────────┤
0 │ C.SHIFT..........V │ B...........SPACE │7
└────────────────────┴───────────────────┘

Этим полурядам соответствует следующее состояние адресных
линий А8...А15.
┌───────────────┬───────────────┐
3 │ 1111 0111 = 247 │ 1110 1111 = 239 │ 4
├───────────────┼───────────────┤
2 │ 1111 1011 = 251 │ 1101 1111 = 223 │ 5
├───────────────┼───────────────┤
1 │ 1111 1101 = 253 │ 1011 1111 = 191 │ 6
├───────────────┼───────────────┤
0 │ 1111 1110 = 254 │ 0111 1111 = 127 │ 7
└───────────────┴───────────────┘
Таким образом, для опроса произвольного полуряда адрес его
порта равен:
256*(255-2^n) + 254
└──────┬────────┘ └─┬─┘
│ │

А8...А15 А0...А7
Здесь n - номер полуряда.
Например, опросить клавиши от 1 до 5 можно следующей ко-
мандой из Бейсика:
PRINT IN (256*(255-2^3)+254) или проще:
PRINT IN 63486
Младшие пять битов того байта, который поступает с этого
порта, указывают, какая именно клавиша была нажата. При этом
следует помнить:
- самый младший бит соответствует внешней клавише полуря-
да;
- при нажатой клавише соответствующий ей бит выключается,
т.е. если ни одна клавиша не была нажата, то все пять младших
битов включены, и Вы получите 255.

"


Итого,
(IN 64510) - даст нам состояние полуряда клавиатуры Q-T
(IN 65022) - состояние полуряда A-G
но выделить из них отдельные клавиши будет сложновато, из-за того, что в бейсике нет побитных логических операций.

Как вариант, примерно так:
LET k1=INT ((IN 64510)/2)
IF (k1- INT(k1/2)*2)=0 THEN клавиша W нажата

LET k2=IN 65022
LET t=INT (k2/2)
IF (k2-t*2)=0 THEN клавиша A нажата
LET k2=t: LET t=INT (k2/2)
IF (k2-t*2)=0 THEN клавиша S нажата
LET k2=t: LET t=INT (k2/2)
IF (k2-t*2)=0 THEN клавиша D нажата

ALKO
18.01.2011, 14:56
мне со всего этого нужно было только:

(IN 64510) - даст нам состояние полуряда клавиатуры Q-T
(IN 65022) - состояние полуряда A-G

ALKO
18.01.2011, 15:40
Чего же она не работает по диагонали?:dizzy_mad_old:

ALKO
18.01.2011, 15:46
a1=64510
a2=65022

---------- Post added at 16:43 ---------- Previous post was at 16:41 ----------

В смысле комбинации A+W, D+W
по идее,она ж сперва проверяет одну за тем вторую букву,не выходя из подпрограммы.

---------- Post added at 16:44 ---------- Previous post was at 16:43 ----------

то есть ступеньками должно двигаться...

---------- Post added at 16:44 ---------- Previous post was at 16:44 ----------

по идее...

---------- Post added at 16:44 ---------- Previous post was at 16:44 ----------

Но не хотит...

---------- Post added at 16:45 ---------- Previous post was at 16:44 ----------

210 строка к перемещению не относится.

---------- Post added at 16:46 ---------- Previous post was at 16:45 ----------

хотелось бы это покомпактнее сделать,для быстродействия

Spectramine
18.01.2011, 19:16
Во-первых, бит магнитофона может быть и 0.
Во-вторых, если a1=64510, a2=65022, перепутаны адреса портов полурядов.
А так, по идее, A+W и D+W должны работать.

ALKO
19.01.2011, 13:27
:v2_dizzy_messed:

ALKO
19.01.2011, 13:31
Во-первых, бит магнитофона может быть и 0.
Во-вторых, если a1=64510, a2=65022, перепутаны адреса портов полурядов.
Ya cherez PRINT IN 64510,IN 65022 proveryal.

---------- Post added at 14:31 ---------- Previous post was at 14:30 ----------


А так, по идее, A+W и D+W должны работать.
Vot imenno "po idee"

ALKO
20.01.2011, 15:17
Наконец-то исправил ошибку.

ALKO
20.01.2011, 15:19
как там звук?
Не сильно раздражает?
А то я создаю на терминале,где отсутствуют колонки.

---------- Post added at 16:19 ---------- Previous post was at 16:18 ----------

Осталось пару заключительных штрихов

osa
20.01.2011, 15:34
звук не особо раздражает, но я не успеваю даже первую рыбу съесть:)

Andrew771
20.01.2011, 15:44
но я не успеваю даже первую рыбу съесть:)

Я тоже. А так задумка прикольная.

ALKO
20.01.2011, 15:55
Я успел 3 штуки захавать.(не с первого раза конечно же)
Надо будет процессор чем-нибудь ещё занять,дабы замедлить ход "рыбёшек"

---------- Post added at 16:55 ---------- Previous post was at 16:54 ----------

там они и так через 4 такта игрока двигаются.

osa
20.01.2011, 16:15
2 смог, надо чуть замедлить, а то двигаются с такой же скоростью, что и игрок. куча рыбок через некоторое время слишком кучкуются

ALKO
20.01.2011, 16:47
Вот тут вроде попроще будет:

ALKO
20.01.2011, 16:54
То что кучкуются,меня самого раздражает.
Может сделать разное приращение по координатам?
Просто привык к трём противникам ещё с Lode Runner'а.

---------- Post added at 17:54 ---------- Previous post was at 17:49 ----------

Ха!
Баг!
Когда заточишь 10 штук,караси замирают.:v2_dizzy_vodka:

ALKO
20.01.2011, 17:11
Уже исправил:

ALKO
20.01.2011, 17:12
Там чем больше заточишь,тем агрессивнее становится троица.