[#1] IDCMP - input z klawiatury C/C++
Pytanie dla wielu pewnie banalne, ale nie widze nigdzie jasnej odpowiedzi. Czy dla CUSTOM SCREENa mozna z Intuition wyciagnac komunikaty z IDCMP ? Próbuje to rozkminic ale widze ze jest flaga dla okien ale nie widze dla screena.
[#2] Re: IDCMP - input z klawiatury C/C++

@arturB, post #1

Bo faktycznie nie ma.
Najprosciej, mozna otworzyc okno tybu BACKDROP na caly ekran i z niego czerpac informacje.
[#3] Re: IDCMP - input z klawiatury C/C++

@Phibrizzo, post #2

No to jest chyba jedyna metoda... A ja mam pytanie związane z tematem. W jaki sposób wykryć wciśnięte 2 lub więcej klawiszy poprzez IDCMP?
[#4] Re: IDCMP - input z klawiatury C/C++

@pisklak, post #3

Z tego co pamiętam IDCMP Cię informuje o tym jak przycisk został wciśnięty lub puszczony - więc w obsłudze zdarzenia musisz patrzeć który przycisk jest zgłaszany i na boku pamiętać jego stan.

Zdarzenia wciśnięcia dwóch przycisków naraz hardware Amigi nie przewiduje. Zawsze z kontrolera klawiatury dostaniesz najpierw jeden a potem drugi przycisk.

Ostatnia aktualizacja: 29.06.2021 18:29:38 przez teh_KaiN
[#5] Re: IDCMP - input z klawiatury C/C++

@Phibrizzo, post #2

Ok. To na szybko pare pytan:
Okno backdrop
- otwieram takie okno samodzielne i dziedziczy kolory po schemacie wb czy otwieram okno na swoim screenie? Nie wiem w ktorym wariancie takie okno jest "zrobialne"
- rozumiem ze wtedy rysuje tez po tym oknie?
- jesli okno samodzielne to rozdzielczosc na full size tez jak wb... hmm...
- jakos inaczej mozna w prosty sposob odczytywac klawiature?
[#6] Re: IDCMP - input z klawiatury C/C++

@pisklak, post #3

W jaki sposób wykryć wciśnięte 2 lub więcej klawiszy poprzez IDCMP?


Po otwarciu okna do jego portu zaczną napływać komunikaty od Intuition. Są one zbudowane następująco:
struct IntuiMessage{
.
.
.
UWORD Qualifier;
.
.
};

Qualifier - w większości typów komunikatów IDCMP w polu tym znajdzie się informacja o wciśniętych klawiszach Alt, Shift, itp. Każdemu z tych klawiszy przyporządkowana jest wartość:
.
.
.
IEQUALIFIER_MIDBUTTON
IEQUALIFIER_RBUTTON
IEQUALIFIER_LEFTBUTTON

Ponieważ każdej z tych flag odpowiada inny bit, dowolna ich liczba może być ustawiona jednocześnie.
[#7] Re: IDCMP - input z klawiatury C/C++

@arturB, post #5

Ciężko mi jest zrozumieć pierwsze pytanie-myślnik. To od Ciebie zależy czy okno otwierasz na WB czy na swoim screenie. Ja robię to tak (jeśli chodzi o okno na screenie), ze najpierw otwieram ekran a potem okno i jeśli jesteśmy przy kick2.0+ to ustawiam w WA_CustomScreen adres okna. Jak chcesz to wykręcę prosty przykładzik w C (razem z czytaniem klawiszy). Daj tylko znak.

Drugi myślnik. Nie za bardzo wiadomo w jaki sposób chcesz rysować. Za pomocą funkcji OS ? To wtedy wyłuskujesz RastPort z okna i cześć.

Trzeci myślnik. Samodzielne to masz na myśli okno na ekranie WB ? Jeśli tak to ty określasz jego rozmiary, jeśli chcesz na "full size" to robisz LockPubScreen() (a potem UnlockPubScreen ) i dostajesz wskaźnik na strukturę Screen i możesz wyłuskać odpowiednie rozmiary.

Czwarty myślnik: Według mnie odczytanie klawiatury z okna z pomocą IDCMP_RAWKEY to najłatwiejszy sposób.

Jak coś mało jasne to śmiało pytaj.
1
[#8] Re: IDCMP - input z klawiatury C/C++

@arturB, post #5

Otwierasz swój screen. Na nim okno. Rysujesz po rastporcie okna, ale, jeżeli twój ekran nie jest publiczny (domyślnie nie jest) i wiesz, że nie będziesz miał na nim innych okien, możesz po rastporcie ekranu. Ten drugi sposób jest trochę szybszy. Wtedy zazwyczaj też flagami dobrze jest wyłączyć górną belkę. Niemniej rastport ekranu nie ma layera, czyli sam musisz się pilnować, żeby nie wyjechać poza ekran. Jeżeli to zrobisz, operacja nie zostanie przycięta, ale uszkodzi zawartość pamięci.

Inaczej można klawiaturę odczytywać za pomocą keyboard.device.
4
[#9] Re: IDCMP - input z klawiatury C/C++

@arturB, post #5

- Wszystko zalezy od tego czy chcesz aby twoj program byl na wlasnym ekranie czy nie. Musisz wziac pod uwage:
a) czy faktycznie potrzebujesz calej powierchni ekranu
b) czy bedziesz uzywal wlasnych zdefiniowanych przez ciebie kolorow.
c) czy liczba dostepnych kolorow jest za mala na WB i potrzebujesz ich wiecej.
d) czy ekran WB jest dla twojego programu za duzy/maly.
Jesli piszesz np: gre to wiadomym jest ze wlasny ekran to podstawa. Jesli jakas pchelke to moze wystarczy otworzyc standardowe okno na WB.

- Zazwyczaj rysuje sie po RastPorcie okna, tak jak to Asman wspomnial.

- Musisz pamietac ze okno typu Backdrop lezy pod wszystkimi innymi. Jesli otworzysz takie okno na WB to najwyzej tapete na nim polozysz. Jesli juz musisz na WB i calym ekranie to proponuje okno bez ramek i gadzetow belkowych.

- IDCMP mysle jest najprostrzym sposobem (o tym tez wspomniano)

Ostatnia aktualizacja: 30.06.2021 10:57:00 przez Phibrizzo
2
[#10] Re: IDCMP - input z klawiatury C/C++

@Phibrizzo, post #9

Podsumowuje wszystkie powyzsze:
- Chce miec kolory niezalezne od WB wiec otworze screen i backdrop window na nim - obecnie mam tylko custom screen w 4bp i nie moge w ten sposob uzyc IDCMP

- Obecnie do poligonow wystających poza custom screen mam napisany clipping - czy jesli uzywam okna to tez musze tej procedury uzywac?

- Uzyje IDCMP bo jest prosty i chyba wystarczajacy do moich potrzeb

- Asman : jesli byś przedstawil taką prostą konstrukcję - okno na wlasnym ekranie + draw + keyboard to bys mi oszczędził z tydzień pracy i pół głowy siwych włosów.

- Pozostaje inne pytanie - ten sam program uruchomiony na klasyku i NG - w obu przypadkach screen 640x400 wyglada tak samo ale na NG moglbym wybrac jakis inny rozmiar. Czy skądś mozna wylistować dostępne rozdzielczości ?
- Jest jeszcze inna kwestia - do odczytu czasu ( zeby wyliczyc fps) otwieram message port zegara itd. Widze ze majac okno moge tez pobrac przez IDCMP informacje z zegara. Czy to jest szybsze niz cala ta pisanina z otwieraniem, odczytem zamykaniem message portu itd ?
Nie ukrywam ze skoro moj prosty silnik 3d moze oszczedzić np 1-2 fps to ja to chce
[#11] Re: IDCMP - input z klawiatury C/C++

@Krashan, post #8

Nie pamiętam czy już o to pytałem, ale czemu rysowania po rastporcie ekranu jest szybsze ? Bo tak na mój chłopski rozum, to w obydwu przypadkach mamy do czynienia ze strukturą rastport i jakoś nie widzę tego przyspieszenia. Mógłbyś wpuścić trochę światła w mój jakże chłopski rozumek. Dzięki
[#12] Re: IDCMP - input z klawiatury C/C++

@asman, post #11

Nie pamiętam czy już o to pytałem, ale czemu rysowania po rastporcie ekranu jest szybsze?
Z mojej wiedzy wynika, że RastPort ekranu nie ma podpiętego Layera. To powoduje, że w zasadzie bezpośrednio rysujemy w bitmapie ekranu, nie zważając na okna i cokolwiek, co rysuje Intuition. Rysując do RastPortu ekranu nadpiszemy otwarte na nim okna, a nawet menu ekranowe, jeżeli w tym momencie będzie otwarte. Okna nie dostaną IDCMP, że muszą się odrysować.

Layer załatwia nam dwie sprawy – po pierwsze obcina wszystkie operacje graficzne do swoich granic, po drugie kontroluje obszary zakryte innymi obiektami Intuition (przede wszystkim oknami). Czyli, zwłaszcza jeżeli pracujemy w okienku, odwala za nas mnóstwo żmudnej roboty. Ale to się oczywiście nie dzieje w zerowym czasie. W sytuacji kiedy pracujemy na custom screenie bez żadnych okien (albo mamy tylko jedno okno backdrop, do łapania myszy/klawiatury) i bez systemowego menu, oraz mamy własny system przycinania operacji graficznych do granic ekranu, rysując do Rp ekranu oszczędzamy czas.
2
[#13] Re: IDCMP - input z klawiatury C/C++

@Krashan, post #12

rysując do Rp ekranu oszczędzamy czas.


A między tymi funkcjami jest jakaś istotna różnica w wydajności?

BltBitMap()
BltBitMapRastPort()
[#14] Re: IDCMP - input z klawiatury C/C++

@nogorg, post #13

@Asman, Krashan

Rysowanie w okna może przyśpieszyć lub spowolnić operacje rysujące.

Przyśpieszyć, bo w okna możemy zainstalować tzw. regiony, które przycinają dodatkowo operacje rysujące do mniejszych obszarów.

Spowolnić, bo dla każdej operacji rysującej potrzebne jest obliczenie przycięcia oraz zablokowanie warstwy przed zmianami z innych aplikacji.

Czyli jeżeli rysujemy serię małych elementów, wtedy narzut w przypadku przycinania jest duży, bo każdy element przycinamy indywidualnie. Ma to duże znaczenie, jeżeli operacja rysująca jest skomplikowana.

Rzeczywiście - w przypadku zasłoniętych okienek, operacja rysująca może rysować w bufor rezerwowy.

W OS jest dostępna przydatna funkcja DoHookClipRects(), która pozwala na szybszy dostęp do okienek i jest wykonywana dla każdego prostokąta. Uwzględnia regiony.

Używam jej bardzo często i polecam.

@Nogorg

Zasadniczo nie ma dużej różnicy między tymi funkcjami jeżeli wykonamy jedną tego typu operację.

W przypadku gdy mamy do czynienia z serią operacji, to BltBitMap() jest zdecydowanie szybsza niż BltBitMapRastPort() wykonane na RastPorcie z podpiętą warstwą.
[#15] Re: IDCMP - input z klawiatury C/C++

@nogorg, post #13

A między tymi funkcjami jest jakaś istotna różnica w wydajności?

BltBitMap()
BltBitMapRastPort()
Tak, jeżeli RastPort ma podpięty Layer.
[#16] Re: IDCMP - input z klawiatury C/C++

@Hexmage960, post #14

Zasadniczo nie ma dużej różnicy między tymi funkcjami jeżeli wykonamy jedną tego typu operację.
Różnica jest zawsze, nieważne ile operacji wykonujemy. Ewentualnie, jeżeli robimy to rzadko, różnica może być nieistotna w konkretnym zastosowaniu. Ale to nie to samo.
[#17] Re: IDCMP - input z klawiatury C/C++

@arturB, post #10

Jest jeszcze inna kwestia - do odczytu czasu

Mysle ze do tego celu warto uzyc timer.device i funkcje GetSysTime();
[#18] Re: IDCMP - input z klawiatury C/C++

@arturB, post #10

- Asman : jesli byś przedstawil taką prostą konstrukcję - okno na wlasnym ekranie + draw + keyboard to bys mi oszczędził z tydzień pracy i pół głowy siwych włosów.


Obadaj sobie,

link

To prosty przykładzik, który kopiuje kostkę (16x16x4) na ekran (za pomocą rastport ekranu)

Nie ma tam pliku wykonywalnego, ale jakbyś potrzebował to daj znak.
Jak masz pytania to śmiało.
[#19] Re: IDCMP - input z klawiatury C/C++

@asman, post #18

Ooo... Fajna i czysta struktura programu. u mnie to bajzel ze sam sie dziwie ze jeszcze dziala. Zawsze sobie obiecuje ze pozniej posprzatam jak bedzie dzialac Dzieki wielkie... Rysujesz po screenie nie po oknie jak rozumiem? Okno jest do uzyskania dostepu do inputow ?
[#20] Re: IDCMP - input z klawiatury C/C++

@arturB, post #19

Rysujesz po screenie nie po oknie jak rozumiem? Okno jest do uzyskania dostepu do inputow ?

2 x tak.
[#21] Re: IDCMP - input z klawiatury C/C++

@asman, post #20

Z ciekawosci zapytam: w swoim kodzie zamykasz biblioteki nie sprawdzajac czy faktycznie przed zamknieciem jest otwarta.
Czy to bezpieczne?
[#22] Re: IDCMP - input z klawiatury C/C++

@Phibrizzo, post #21

Czy to bezpieczne?
Od wersji 36 execa CloseLibrary(NULL) jest bezpieczne.
[#23] Re: IDCMP - input z klawiatury C/C++

@teh_KaiN, post #4

Wprawdzie klawiatura jest podlaczona do Amigi standardowo przez serial, wiec faktycznie jej procesor przesyla kody klawiszy po kolei, ale system to buforuje. KBD_READMATRIX z keyboard.device pozwala odczytac bitowa mape stanu klawiszy, przechowywana przez system.
2
[#24] Re: IDCMP - input z klawiatury C/C++

@Krashan, post #8

Uzylem wstepnie keyboard.device ale program dziwnie sie zachowywal. Owszem odczytuje eventy ale nie wykonuje reszty petli w ktorej oprocz odczytu eventow jest renderowanie obrazu. Jak wylacze odczyt eventow to wszystko spowrotem dziala. Ktoś coś?
[#25] Re: IDCMP - input z klawiatury C/C++

@arturB, post #24

Ciężko coś powiedzieć, musiałbyś zamieścić kawałek kodu odpowiedzialny za otworzenie keboard.device (wraz z tworzeniem requesta) i samo odczytywanie eventów, bo jak rozumiem, robisz to za pomocą DoIO.
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem