Poruszanie paletką.

0

Siemka
Robię w Visual C++ grę typu pong, i mam problem z poruszaniem paletką.
Myślałem o czymś takim:

                char n = getchar();  
		switch(n)
		{
		case 'w': niebieska->Top=niebieska->Top-1; break;
		case 's': niebieska->Top=niebieska->Top+1; break;
	       }; 

P.S. Zaincludowałem bibliotekę conio.h

0

No i?
Jaki problem?

0

No taki że nie działa. Próbowałem też z

 getchar()

ale też nie działa.

0

Wydaje mi się, że to co chcesz uzyskać to za pomocą funkcji getch().
Po funkcji getchar() musisz zatwierdzić wybór enterem.

0

Myślałem że to dlatego że mam to w timerze, ale jak zrobiłem funkcje to też nie działa.

0

Kod który pokazałeś jest poprawny, więc błąd jest gdzie indziej. Byćmoże nie odświeżasz ekranu.

0

Ok, to cały kod źródłowy timera. Program się uruchamia, piłka lata po ekranie, ale paletka zwana niebieska się nie przesuwa

 private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
			 {
				 pilka->Left=pilka->Left+x;
				 pilka->Top=pilka->Top+y; 
				 
				 char n = getch();  
				 switch(n)
				 {
				 case 'w': niebieska->Top=niebieska->Top-1; break;
				 case 's': niebieska->Top=niebieska->Top+1; break;
				 };
				 if(pilka->Top<=0) y=-y;
				 if(pilka->Top+pilka->Size.Height==Form1::Size.Height)
			     {
					 pilka->Top = Form1::Size.Height-pilka->Size.Height;	 
					 y=-y;
						 
				 };
				 if((pilka->Left==niebieska->Left+niebieska->Size.Width)&&(pilka->Top+pilka->Size.Height>=niebieska->Top)&&(pilka->Top<=niebieska->Top+niebieska->Size.Height)) x=-x;
				 if((pilka->Left+pilka->Size.Width==czerwona->Left)&&(pilka->Top+pilka->Size.Height>=czerwona->Top)&&(pilka->Top<=czerwona->Top+czerwona->Size.Height)) x=-x;
				 if(pilka->Left==0)
				 {
					 pktc++;
					 MessageBox::Show("Niebieski: "+Convert::ToString(pktn)+"Czerwony: "+Convert::ToString(pktc));
					 pilka->Left=500;
					 pilka->Top=300;
					 x=-x;
					 y=-y;
				 };
				 if(pilka->Left+pilka->Size.Width==Form1::Size.Width)
				 {
					 pktn++;
					 MessageBox::Show("Niebieski: "+Convert::ToString(pktn)+" Czerwony: "+Convert::ToString(pktc));
					 pilka->Left=500;
					 pilka->Top=300;
					 x=-x;
					 y=-y;
				 };
			 }
0

Piszesz program okienkowy, prawda? A getchar() czyta z konsoli.

0

A getch() też?

0

Też

0

A jak to zrobić w programie okienkowym?

0

W C++/CLI wykonujesz takie działanie:

  1. Deklarujesz zmienną typu ConsoleKeyInfo keyPressed;
  2. Z poziomu pętli w której wszystko wykonujesz wpisujesz keyPressed = Console::ReadKey(true);
  3. Sprawdzasz **if(keyPressed.Key == 'w') to cośtam.

Więcej na ten temat znajdziesz tutaj: http://books.google.pl/books?id=pLztSzr_8QwC&pg=PT181&lpg=PT181&dq=C%2B%2B/CLI+get+key+pressed&source=bl&ots=KpY00Fm8Gh&sig=yJhnlw-YHZ6pnVgNTvCVOOYSHlY&hl=pl&sa=X&ei=7lYgT8C3MY_PsgazzvHNDA&sqi=2&ved=0CEYQ6AEwBA#v=onepage&q=C%2B%2B%2FCLI%20get%20key%20pressed&f=false

0

Wyskakuje error:
error C3063: operator '==': all operands must have the same enumeration type

Jak próbowałem używać innych sposobów z tej książki to crashowało.

0

Piszesz w C++/CLI czy w C#?

0

C++/CLI, kompilator Microsoft Visual C++ 2010 Express

0

Nie wiem, nie znam się na tym. Musisz zatem pokombinować coś z KeyEventArgs^
http://msdn.microsoft.com/en-us/library/system.windows.input.keyeventargs.aspx

0

Skoro w WinForms zapewne piszesz, to tam są takie rzeczy jak event'y (jak prawie wszędzie). Jest event onKeyDown i wstaw na niego tą domyślną funkcję. Wpisz tam teraz podobny kod:

if (e->KeyCode == Keys::W)
    niebieska->Top--;
if (e->KeyCode == Keys::S)
    niebieska->Top++;
// itd.
0

No dzięki już działa. Teraz tylko mam pytanie czy da się jakoś przyspieszyć poruszanie się piłki i paletek bo na razie są bardzo powolne.

0

Zmieniając wartość przesunięcia, teraz z ++ musisz z powrotem zmienić na += wartosc;, gdzie wartosc to po prostu wartość przesunięcia, np. 5.

0

Dziękuje za pomoc.

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