Keypressed, czyli gra ze sterowaniem impulsowym.

0

Witam, ostatnio borykam się z problemem kierowania postacią w grze 2D.
Postać ma miarowo przyspieszać poprzez naciśnięcie klawisza w bok, ale zamiast tego następuje krótki impuls, a dopiero po chwili prawidłowe przyspieszanie. Jest to związane z wpisywaniem znaków w DOS'ie, tak więc moje pytanie brzmi: Jak pominąć czas zwłoki między pierwszym znakiem, a jego powtarzaniem?

A tutaj krótki przykład kodu:

for i:=0 to 2000 do
		
			begin
			
			
				if Keypressed then
					begin

						com:=ReadKey;
			
						case com of
							chr(77): 
								begin
									dir:=dir+1;
									
								end;
							chr(75): 
								begin
									dir:=dir-1;
									
								end;
				
						end;
					
			end;

(...)

Aha, 77 i 75 to lewo/prawo. A góra/dół?

Z góry dzięki za odpowiedź,
Sinsky

0

to dla mnie jakiś armagedon:) robisz gre 2D pod dos? używasz VCL czy samo WinAPI.
nie możesz sobie chodzenia zrobic w timerku i wcisniecie klawisza w FormKeyDown
zaupaj ta gre gdzieś to sobie obejrzymy . może ci coś doradzę jak całkiem mnie nie zamurujesz:D

0
lankusiek napisał(a)

to dla mnie jakiś armagedon:) robisz gre 2D pod dos? używasz VCL czy samo WinAPI.
nie możesz sobie chodzenia zrobic w timerku i wcisniecie klawisza w FormKeyDown
zaupaj ta gre gdzieś to sobie obejrzymy . może ci coś doradzę jak całkiem mnie nie zamurujesz:D

Jak będę w domu to demko wyślę.
Gra nie używa żadnych bibliotek (ewentualnie Crt do sterowania), tak więc ponawiam pytanie:
Jak poprawić to sterowanie?

0

Za pomocą wbudowanych procedur w Pascala nic więcej z tego nie wyciśniesz.
W zasadzie masz 3 alternatywy:

  1. Poczytaj o wstawkach asm i przerwaniach dotyczacych klawiatury.
  2. Poszukaj gotowych unitów w google.
  3. Zrób to w Delphi.
0

Dobra, to chyba będzie tak:

asm
	xor ah,ah
	int 16h
	mov &com,al
end;

com to zmienna char, tam pobieram znak.
Czy to będzie coś w tym stylu?

//Edit: Działa, ale tak samo jak w pierwszym przypadku. Potrzebuję innego sposobu.

0

ty się zabierasz za asemblera? pisząc tekst typu:

Aha, 77 i 75 to lewo/prawo. A góra/dół?

[rotfl]

0

Nie wiem, strzałki z tym kodem działały należycie.
Nie uczę się tablic ASCII na pamięć;]
@lankusiek: Przymknij się i pomóż;]

0

nie wiem co ty rozumiesz przez słowo: sterowanie impulsowe tzn? jak wcisnę klawisz to ma postać po prostu iść czy ma wykonać tylko jeden ruch?. poza tym powiedziałem ci ,ze pomogę jak zaupasz source swojego projektu. wrzuć gdzieś na rapida czy gdziekolwiek. chyba potrafisz ? czy nie? xD

0

nie no myślałem, ze gadamy o delphi a ty wyskakujesz mi z modułem pisanym w asemblerze.
Tak to ja ci nie pomogę bo asm to dla mnie czarna magia.

0
lankusiek napisał(a)

nie no myślałem, ze gadamy o delphi a ty wyskakujesz mi z modułem pisanym w asemblerze.
Tak to ja ci nie pomogę bo asm to dla mnie czarna magia.

lankusiek napisał(a)

ty się zabierasz za asemblera? pisząc tekst typu:

Aha, 77 i 75 to lewo/prawo. A góra/dół?

[rotfl]

bez komentarza;]

To są jedynie wstawki assemblerowe, a odcinek kodu na sterowanie klawiszami to czysty pascal;]

W każdym razie dzięki za pomoc, zmotywowałeś mnie do pracy;]
Pozdro i czekam na dalsze propozycje.

//Przydałoby się, aby zrobić to na buforze klawiatury, tak, aby można było jednocześnie nacisnąć i odczytać dwa klawisze na raz. Sam sposób. Czy to będzie paszczal, czy asm, czy coś innego, jest obojętne.

0

właśnie przez bufor klawiatury masz problem. wejdź w okno commandline wciśnij i przytrzymaj jakiś klawisz zobaczysz ten sam efekt.
Żeby się pozbyć problemu musisz odczytać ScanCode bezpośrednio z portu klawiatury.

0

Nie muszę nigdzie wchodzić, na samym początku to powiedziałem;] I wiem, że trzeba zrobić to na skankodzie, ale nie wiem jak.
Próbowałem asma, lecz przy stosowaniu skankodów postać cały czas idzie w kierunku pierwszego naciśniętego klawisza (16h, AH=0), czyli cały czas bierze pierwszy znak z bufora. Przy zastosowaniu AH=1 tego samego przerwania gra reaguje prawidłowo,ale przycina się, bo czeka na klawisz. Jak więc wyczyścić bufor? (Tandy2000 nie działa) Może użyć innego przerwania? 21h zaradzi?

0

oczywiście, że innego. użyj przerwania 9 i odczytuj dane z portu 60H, resztę znajdziesz w google.

0

Witam,
Chciałem tylko powiedzieć, że ostatnio użyłem tego przerwania i działa jak należy, nie licząc tego, że windows cały czas wydaje dźwięki przy naciskaniu klawiszy :/
Oto kod, który szybko zaimprowizowałem:

		
				asm
					int  09h
					in      al,   60H
					mov	&com, al
				end;
						case com of
							chr($4D): 
								begin
									dir:=dir+1;
									
								end;
								
							chr($4B): 
								begin
									dir:=dir-1;
									
								end;
								
							chr($48): 
								begin
									grv:=grv-2;

								end;
								
							chr($50):
								begin
									grv:=grv+1;

								end;
					
							
						

Skarćcie mnie, jak coś jest źle.
Pozdro,
Sinsky

1 użytkowników online, w tym zalogowanych: 0, gości: 1