Autor Wątek: [Allegro 4.4.2] Problem z klawiszem  (Przeczytany 3718 razy)

Offline janek112

  • Użytkownik

# Listopad 27, 2013, 20:57:42
Witam wszystkich! Jest to mój pierwszy post, choć korzystam już trochę z forum. Dopiero się uczę programowania w Allegro i mam problem. Chcę dodać ekwipunek gracza(samą grafikę na razie), który będzie wyświetlał się po naciśnięciu klawisza ,,E", niestety gdy go naciskam grafika pojawia się i znika. Chciałbym aby po kliknięciu ,,E" obrazek się pojawił i został, a po ponownym kliknięciu zniknął. Również jak przytrzymam razem klawisz ,,E" jak nie ma grafiki na ekranie, ma się pojawić. Próbowałem wiele sposobów, ale nic nie działa jak powinno.
Wielkie dzięki za każdą rade i pomoc.

ps. Nie musicie szukać w google, ponieważ szukam od dwóch dni i nic.



 #include <allegro.h>
#include <iostream>
#include "main.hpp"

int i = 0;
void gui()
{
    if(key[KEY_E] && i == 0)
    {
        i = 1;
    }

    if(key[KEY_E] && i == 1 && s == 10)
    {
        i = 0;
    }
    if(i == 1)
    {
        masked_blit(inventory_pol,bufor,0,0,200,250,700,700);
    }

}

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Listopad 27, 2013, 23:39:56
Alfabetu Bozia nie dała że skracasz nazwy zmiennych do jednej litery? Czym jest i, czym jest s, jak wywołujesz tą funkcję?

Offline jerryharpman

  • Użytkownik

# Listopad 28, 2013, 00:13:55
"i" jest pewnie kontrolnym stanem logicznym klawisza (1 ma niby oznaczać ze jest wcisniety i trzymany)
Sprawdziłem że allegro nie ma funkcji keyup/keydown, ale key[KEY_E] wygląda prawidlowo.
Cześć z "i" też jest logiczna. Stawiam na problem z "s==10" :)  -> co to jest to "s" ? Jakiś timer zapewne...
<krzyk tłumu> WIECEJ KODU ! ;)

« Ostatnia zmiana: Listopad 28, 2013, 00:25:16 wysłana przez jerryharpman »

Offline janek112

  • Użytkownik

# Listopad 28, 2013, 18:31:54
To może inaczej zapytam, bo kod mam źle, jak wy byście napisali pojawiający się obrazek inventory? Jeśli nacisnę E to pojawia się i jeśli nacisnę ponownie E to znika. Męczę się nad tym od tygodnia i nic nie mogę wymyśleć :(

Offline ArekBal

  • Użytkownik

# Listopad 28, 2013, 20:10:00
jak chcesz tak bardzo stanami wciśnięty, wyciśnięty zarządzać to:

1. Jeśli wcześniej wolny, a teraz wciśnięty(naciśnięcie klawisza), to wyświetl obrazek.
2. Jeśli wcześniej wciśnięty, a teraz wolny(puszczenie klawisza), to schowaj.

ew. Jeśli wcześniej wciśnięty i teraz też wciśnięty to znaczy że klawisz przytrzymany....

Albo podpinasz się pod jakieś callbacki czy zdarzenia i podpinasz się do naciśnięcia, puszczenia.

Jak się podszkolisz to zrozumiesz i docenisz oba podejścia.

Offline Xirdus

  • Redaktor

# Listopad 28, 2013, 22:12:51
Ja bym to zrobił tak, że moduł sterowania po otrzymaniu zdarzenia wciśnięcia E wysyła menadżerowi stanów komunikat że ma zmienić stan gry na Inventory. Opcjonalnie podmieniłbym jednocześnie moduł sterowania na ten od GUI. Ale to rozwiązanie pewnie jest trochę przeinżynierowane.

Podstawowa zasada: wciśnięcie E nie wyświetla obrazka, tylko włącza ekran ekwipunku. Wyświetlenie odpowiedniego obrazka jest tylko konsekwencją włączenia ekranu ekwipunku, i odbywa się to w całkiem innej części kodu. Rozpisz sobie pętlę główną mniej więcej według tego schematu:
while (true)
{
    input();
    logic();
    render();
    /* synchronizacja zegara */
}
gdzie input() obsługuje wszystkie zdarzenia i tylko zdarzenia, logic() wykonuje jeden krok wszystkich obliczeń i uaktualnia stan gry nie sprawdzając już, jakie klawisze zostały wciśnięte, a render() zajmuje się wyłącznie narysowaniem tego co trzeba, przy czym absolutnie wszystkie rzeczy które nie mają żadnego związku z czymś poza renderowaniem powinny być zgrupowane tutaj i nigdy poza tą część kodu nie wychodzić. To tak w dużym uproszczeniu.

Offline janek112

  • Użytkownik

# Listopad 28, 2013, 22:16:59
Cytuj
1. Jeśli wcześniej wolny, a teraz wciśnięty(naciśnięcie klawisza), to wyświetl obrazek.
2. Jeśli wcześniej wciśnięty, a teraz wolny(puszczenie klawisza), to schowaj.

No tak, tylko mi chodzi o to, że
1. jeśli wcześniej nie był wciśnięty, a teraz został to pokaż obrazek.
2. jeśli został puszczony to zostaw obrazek widoczny
3. jeśli został wcześniej puszczony, a teraz znowu wciśnięty, wtedy przestań pokazywać obrazek.

To jest trudniejsze a to co napisałeś to już wiedziałem.
« Ostatnia zmiana: Listopad 28, 2013, 22:18:49 wysłana przez janek112 »

Offline ArekBal

  • Użytkownik

# Listopad 28, 2013, 22:24:46
Podsumowując:
Inicjalizujemy jako składnik klasy lub statyczna lub globalna.
bool widoczny = false;
i potem przy sprawdzaniu stanu
if(terazNacisnieto)
  widoczny = !widoczny;

:)


Ale to rozwiązanie pewnie jest trochę przeinżynierowane.
Właśnie.

Popatrz co chłopak pisze...
Nie męcz go "jeszcze". Kroczek po kroczku. :)


// sklejka postów -Xirdus
« Ostatnia zmiana: Listopad 28, 2013, 23:48:44 wysłana przez Xirdus »

Offline janek112

  • Użytkownik

# Listopad 28, 2013, 22:40:30
Koledzy, to co Xirdus napisał jest dla mnie chyba jeszcze trochę za trudne, chciałbym się nauczyć tylko jak zrobić to co napisałem wyżej. Z resztą jak na razie sobie poradzę.

Offline Xirdus

  • Redaktor

# Listopad 29, 2013, 00:01:06
Właśnie.

Popatrz co chłopak pisze...
Nie męcz go "jeszcze". Kroczek po kroczku. :)
No przecież sam pytał, jak JA bym zrobił ;) A co do rozdzielania kodu na moduły, to jest to najważniejsza zasada, którą trzeba wpajać od małego każdemu koderowi. Każdy kod powyżej 1000 linii wymaga jakiegoś ustrukturyzowania i hierarchii obiektów (nie mówię tu o hierarchii dziedziczenia) z odpowiednią enkapsulacją. Po prostu nie da się na dłuższą metę pracować z samymi zmiennymi globalnymi ustawianymi w losowych miejcach gdzie teraz potrzeba. Chociaż po pewnym momencie sam by do tego doszedł.

I wcale to nie jest takie trudne jak się wydaje. Wystarczy trochę pomyślunku i minimum planowania (za dużo planów zabiło nie jeden projekt...).

Offline ArekBal

  • Użytkownik

# Listopad 29, 2013, 12:02:35
W pracy - a akurat w c# pracujemy - mamy na tablicy scrumowej na czerwono wybite 550. Marzy nam się jeszcze to ściąć o 200.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 29, 2013, 12:44:44
ale C# to zupełnie inna bajka, tam kodu się pisze mniej do konkretnego problemu, niżeli w innych językach natywnych

Offline ArekBal

  • Użytkownik

# Listopad 29, 2013, 13:58:55
Z jednej strony się zgadzam, a z drugiej strony... to wymówka.

Offline PsichiX (ΨΧΞ)

  • Użytkownik
    • PsichiX Website

# Listopad 29, 2013, 14:36:50
chcialbym zobaczyc, jak uskuteczniasz takie pomysly w brainfucku ;)
a serio - zdrowy na umysle programista podejdzie do tego problemu zdrowo w danym mu jezyku, o. i nie ma jednej zlotej zasady, bo co jezyk to inne zasady - zadna wymowka

Offline ArekBal

  • Użytkownik

# Listopad 29, 2013, 14:48:21
Ale mówimy tu - tak mi się wydaję - o specyficznym przypadku, c# z c++.
Programuję w obu i nie widzę powodów dla których plik pisany "modern c++" miałby być większy.

//edit:gramatyka
« Ostatnia zmiana: Listopad 30, 2013, 13:58:08 wysłana przez ArekBal »