Obsługa "strzelania" w C++

Obsługa "strzelania" w C++
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

Witam wszystkich serdecznie! Piszę swoją pierwszą grę i chciałbym Was prosić o podpowiedź. Wprowadziłem obsługę klawiatury i chciałem na podobnej zasadzie obsłużyć też funkcję strzelania. Jednak jeśli próbuję zrobić to analogicznie do wyżej wspomnianego poruszania się z tym że w pętli po każdym przesunięciu wykonuję opóźnienie pętli o 1 sekundę za pomocą Sleep(1000) jednakże "pocisk" zamiast przesuwać się co sekundę wyżej "stoi" w miejscu i dopiero po odczekaniu odpowiedniej ilości sekund znajduje się w pożądanym miejscu :/ . Fragment który próbowałem napisać z wykorzystaniem sleep'a jest pogrubiony i zakomentowany w funkcji void p_tank::move(). Z góry dziękuję za wszelką podpowiedź ;) . Poniżej zamieszczam kod:

Kopiuj
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <windows.h>


using namespace std;

int const w = 40;
int const h = 30;

struct tank_pos
{
	int x, y;
};

class Map
{
	int **map;
public:
	Map();
	void draw();
	void put_player(tank_pos&);
	void put_shot(tank_pos&);
	void reset();
	~Map();
};

class p_tank
{
	tank_pos player;
	tank_pos shot;
	int kierunek;
public:
	p_tank();
	tank_pos& pozycja_czolgu();
	void move();
	~p_tank();
};


Map::Map()
{
	map = new int*[h];
	for (int i = 0; i < h; ++i) {
		map[i] = new int[w];
	}
	for (int i = 0; i < h;i++)
	for (int j = 0; j < w; j++)
		map[i][j] = 0;
}

void Map::draw()
{
	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < w; j++)
		{
			switch (map[i][j])
			{
			case 0:
				cout << " ";
				break;
			case 1:
				cout << "T";
				break;
			case 2:
				cout << "*";
				break;
			}
		}
		cout << endl;
	}
}

void Map::put_player(tank_pos &player) 
{
	map[player.x][player.y] = 1;
}


void Map::reset()
{
	for (int i = 0; i < h; i++)
	for (int j = 0; j < w; j++)
		map[i][j] = 0;
}

Map::~Map()
{
	if (map)
	{
		delete[] map;
		map = NULL;
	}
}

p_tank::p_tank()
{
	player.x = 29;
	player.y = 20;
}

tank_pos& p_tank::pozycja_czolgu()
{
	return player;
}



void p_tank::move()
{
	switch (getch())
	{
		case 'w':
			**/*for (int i = player.x; i > 25; i--)
			{
				Sleep(1000);
				player.x--;
			}*/**
			
			if (player.x - 1 == -1)
				break;
			else
				player.x--;
			kierunek = 1;
			break;
		case 's':
			if (player.x + 1 == h)
				break;
			else
				player.x++;
			kierunek = 2;
			break;
		case 'a':
			if (player.y - 1 == -1)
				break;
			else
				player.y--;
			kierunek = 3;
			break;
		case 'd':
			if (player.y + 1 == w)
				break;
			else
				player.y++;
			kierunek = 4;
			break;
	}
}

p_tank::~p_tank()
{
}

int _tmain(int argc, _TCHAR* argv[])
{
	Map mapa;
	p_tank T;
	for (;;)
	{
		mapa.reset();
		mapa.put_player(T.pozycja_czolgu());
		mapa.draw();
		T.move();
		system("cls");
	}
	system("PAUSE");
	return 0;
}
edytowany 1x, ostatnio: m18193
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Może to dla tego że jeszcze nie zaimplementowałeś tego pocisku.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

tak wiem ale to dlatego że próbowałem to "rozgryźć" na czymś co działa. Innymi słowy po naciśnięciu klawisza 'w' obiekt T powinien sie przesuwać w górę dopóki i > 25, a teraz działa w ten sposób że czeka tam 4/5 sekund i dopiero pojawia się w określonym miejscu. Nie mogę uzyskać animacji lecącego pocisku.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Czy w trakcie lotu pocisku ten twój tank może się poruszać czy nie?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

Myślę że powinien ale najpierw chciałem się skupić na samej animacji :)

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

twoja funkcja move powinna sprawdzać poprzez kbhit czy coś wciśnięto.
Jeżeli tak to pobrać klawisz poprzez getch i go obsłużyć.
Jeżeli nie - to pomijasz całego switch'a
Po switch w pętle (bo może być wiele lecących pocisków) przesuwasz wszystkie pociski o jakiś krok bliżej celu.
Po czym dajesz sleep na jakieś 100 ms (to tylko 10 klatek na sekundę).


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

hmmmmm masz na myśli coś takiego:
(na razie dalej interpretuję że czołg to pocisk :P i po naciśnięciu 'w' powinien przesuwać się w górę co 100ms )

Kopiuj
void p_tank::move()
{
	if(kbhit)
	{
		switch (getch())
		{
		
			case 'w':
				for (int i = player.x; i > 0; i--)
				{	
					player.x--;
					Sleep(100);
				
				}break;
		/*	if (player.x - 1 == -1)
				break;
			else
				player.x--;
			kierunek = 1;
			break;*/
			case 's':
				if (player.x + 1 == h)
					break;
				else
					player.x++;
				kierunek = 2;
				break;
			case 'a':
				if (player.y - 1 == -1)
					break;
				else
					player.y--;
				kierunek = 3;
				break;
			case 'd':
				if (player.y + 1 == w)
					break;
				else
					player.y++;
				kierunek = 4;
				break;
		}	
	}
}

tylko że teraz też nie widać jak ten pocisk przelatuje przez mape :/

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

void Map::draw() ma uwzględniać wszystkie pociski.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

no tak obiekt który powinien się przesuwać przesyłam przez referencję do klasy map nadaje mu wartość 1 i przeszukuję całą tablicę w poszukiwaniu 0 i 1 i nadaje im znak graficzny. Wiem że gdzieś tam jest błąd ale nie mogę go dostrzec i dlatego bardzo proszę o jakąś dokładniejszą wskazówkę :)

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1

To bardzo proste, idziesz na forum wróżbitów i dostajesz wskazówkę, tu niestety nie ma takich wybitnych talentów więc trzeba pokazać kod.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

Wrzucam ponownie pełny kod: :)

Kopiuj
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <windows.h>


using namespace std;

int const w = 40;
int const h = 30;

struct tank_pos
{
	int x, y;
};

class Map
{
	int **map;
public:
	Map();
	void draw();
	void put_player(tank_pos&);
	void put_shot(tank_pos&);
	void reset();
	~Map();
};

class p_tank
{
	tank_pos player;
	tank_pos shot;
	int kierunek;
public:
	p_tank();
	tank_pos& pozycja_czolgu();
	void move();
	~p_tank();
};


Map::Map()
{
	map = new int*[h];
	for (int i = 0; i < h; ++i) {
		map[i] = new int[w];
	}
	for (int i = 0; i < h;i++)
	for (int j = 0; j < w; j++)
		map[i][j] = 0;
}

void Map::draw()
{
	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < w; j++)
		{
			switch (map[i][j])
			{
			case 0:
				cout << " ";
				break;
			case 1:
				cout << "T";
				break;
			}
		}
		cout << endl;
	}
}

void Map::put_player(tank_pos &player) 
{
	map[player.x][player.y] = 1;
}


void Map::reset()
{
	for (int i = 0; i < h; i++)
	for (int j = 0; j < w; j++)
		map[i][j] = 0;
}

Map::~Map()
{
	if (map)
	{
		delete[] map;
		map = NULL;
	}
}

p_tank::p_tank()
{
	player.x = 29;
	player.y = 20;
}

tank_pos& p_tank::pozycja_czolgu()
{
	return player;
}



void p_tank::move()
{
	if(kbhit)
	{
		switch (getch())
		{
		
			case 'w':
				for (int i = player.x; i > 0; i--)
				{	
					player.x--;
					Sleep(100);
				
				}break;
		/*	if (player.x - 1 == -1)
				break;
			else
				player.x--;
			kierunek = 1;
			break;*/
			case 's':
				if (player.x + 1 == h)
					break;
				else
					player.x++;
				kierunek = 2;
				break;
			case 'a':
				if (player.y - 1 == -1)
					break;
				else
					player.y--;
				kierunek = 3;
				break;
			case 'd':
				if (player.y + 1 == w)
					break;
				else
					player.y++;
				kierunek = 4;
				break;
		}	
	}
}

p_tank::~p_tank()
{
}

int _tmain(int argc, _TCHAR* argv[])
{
	Map mapa;
	p_tank T;
	for (;;)
	{
		mapa.reset();
		mapa.put_player(T.pozycja_czolgu());
		mapa.draw();
		T.move();
		system("cls");
	}
	system("PAUSE");
	return 0;
}
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0
  1. Wywal pętle pod 'w', tam musisz jedynie zanotować cel pocisku oraz aktualną pozycje pocisku w składowych klasy.
  2. Nadal draw nie rysuje żadnego pocisku.
  3. Nadal move nie przesuwa żadnego pocisku.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

nie no własnie jak ogarne zasade to dopisze odpowiednie metody na razie chciałbym żeby po wciśnięciu akurat 'w' tank przesuwał się w górę cały czas o jedną wartość i żeby ten ruch był widoczny ;)

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Nie rozumiem, oczekujesz że ktoś za ciebie to zrobi?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

W życiu!! chciałbym tylko podpowiedź uzyskać dlaczego jak wcisne 'w' to program nie działa tak że tank przesuwa się co 100ms ku górze o jedną wartość. Jeśli uda mi się uzysakć coś takiego to bez problemu dopisze sobie metody do strzału.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Tak dzieje się dla tego że masz pętle wewnątrz której nic się nie rysuje tylko zmienia się player.x, dopiero po zakończeniu pętli następuje jakieś rysowanie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 9 lat
  • Postów:9
0

hmm no tak a masz jakiś pomysł jak przed każdą dekrementacją przesyłać aktualną pozycję do funkcji draw???

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Jak to naprawić podałem wcześniej.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)