Jump to content
  • 0

pomoc Nepovolená zóna


jefo1011

Dotaz

Zdravím, z nějakého důvodu mi nefunguje funkce strcmp i přesto, že na základě informací zjištěných na wikipedii dělám všechno korektně.

Mám vytvořené detekování zón:
 

new ZonyMiniher[][Zona] = {

	{"Queens",                      {-2533.00,458.40,0.00,-2329.30,578.30,200.00}},
	{"Kings",             		{-2994.40,-811.20,0.00,-2178.60,-430.20,200.00}},
	{"City Hall",                  {-2324.90,-2584.20,-6.10,-1964.20,-2212.10,200.00}}
};

Následně zjišťuji hráčovu pozici a porovnávám definované souřadnice abych zjistil, ve které zóně se nachází. Výsledek formátuji do stringu RealZone.

Minihra se odehrává v San Fierru, konkrétně ve dvou zónách, které jsou vedle sebe - Queens a Kings. Hráčům chci nechat volný pohyb ale ty, kteří přejdou do nepovolené zóny, chci potrestat. Mám tedy vytvořenou funkci, kde používám již zmíněné strcmp:
 

if(strcmp(RealZone, "Queens", true) == -1 || strcmp(RealZone, "Kings", true) == -1) SendClientMessage(playerid, MAGENTA, "Vrať se do bezpečné zóny!");
else SendClientMessage(playerid, MAGENTA, "Nacházíš se v bezpečné / povolené zóně.");

Zóny si pro jistotu i zobrazuji pomocí TextDrawu abych zjistil, zda se string RealZone na základě porovnávání formátuje korektně - formátuje se korektně.

Problém však spočívá v tom, že ať už jsem v zónách Queens či Kings nebo v zakázané zóně City Hall, za každým dostávám hlášení Vrať se do bezpečné zóny! Tedy to vypadá tak, že za každým je výsledek porovnávání -1 (to znamená, že nějaký znak se neshoduje). Já se ptám, jak je to možné? Ještě jsem si pro jistotu string RealZone i printoval do konzole, zda tam není někde chyba v znaménku no ne, vypadá to, že je všechno napsáno správně.

Řeším to už s přestávkami nějaký ten pátek a původně jsem se chtěl zakládání podobných témat vyhnout, protože je to poměrně banální chyba, no kdyby se našel někdo, kdo by mi pomohl tuto záhadu rozlousknout, tak bych byl velmi rád.

Za veškeré rady předem děkuji. :-P

Link to comment
Share on other sites

2 odpovědí na tuto otázku

Recommended Posts

  • 0
před 2hodinami, jefo1011 said:

Následně zjišťuji hráčovu pozici a porovnávám definované souřadnice abych zjistil, ve které zóně se nachází. Výsledek formátuji do stringu RealZone.

Takže, jestliže to správně chápu, tak nejdříve zjistíš pozice hráče a podle toho do nějakého řetězce vkládáš jméno té pozice? Takže vlastně zjišťuješ dvě informace, zónu a jméno zóny?
Nicméně, já bych doporučoval zkrátka si udělat dvě funkce a to jestliže je v jakékoliv zóně a pak jestliže je v té dané zóně:

bool IsPlayerInAnyZone(playerid) {
	// ...
	return true;	
}

bool IsPlayerInZone(playerid, zonename[]) {
	// ...
	return true;
}

Proč? Za 1. určitě dynamika. V případě, že bys přidával další zóny, nemusíš pak porovnávat každé jméno zóny individuálně...

for (new i = 0; i < sizeof(ZonyMiniher); i++) {
	if (...)
}

A za 2. mnohem víc jsi tím zjednodušíš práci, protože pak už jen porovnáš jestliže je v zóně, nebo ne, a jestli jo, tak v jaké:

if (IsPlayerInAnyZone(playerid)) {
	if (IsPlayerInZone(playerid, "City Hall")) {
		SendClientMessage(playerid, MAGENTA, "Nacházíš se v bezpečné / povolené zóně.");
	} else {
		SendClientMessage(playerid, MAGENTA, "Vrať se do bezpečné zóny!");
	}
}

Pokud jde o "nefunkční" komparaci, tak ono taky tam můžou být neviditelné znaky třeba další řádek, nebo tabování, které neuvidíš.
Nebo, někde během formátování přidáváš něco navíc.
Zkoušel si printovat i celý průběh formátování slovo po slově, řetězec po řetězci? Je možné, že některé funkce(například strlen()) se svojí unikátní návratovou hodnotou vrací jiné údaje a proto se nemusí shodovat.

Edited by Scydo
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...