Jump to content
  • 0

pomoc Textdraw/Změna pozice


The_boslosos-CZ

Dotaz

Popis problému:


Ahoj.

Pokouším se vytvořit mapu pomocí textdrawu. Jde o to že jsem na internetu našel veřejný skript, který zobrazuje (marker) na mapě textdrawu a následně aktualizuje pozici hráče, něco ve smyslu on-line mapa, ale ne v prohlížeči ale přímo ve hře.

Celý skript funguje tak jak má, přesné zobrazení markeru na pozici mapy (vytvořené).

Problém je bohužel v tom, že celá mapa vytvořena pomocí textdrawu je celkem velká, zabírá dost prostoru na obrazovce. Proto mě napadlo vytvořit pomocí TDEditoru nové textdrawy map ale trošku menší. a pouze dva díly map.

* P.S: Celkem jsou čtyři díly, dva díly na hoře (San Fiero a Las Venturas) a dva díly jsou dole (Mount Chill. red county a spol a celé Los Santos) no a potom je ještě jedna celá mapa textdrawu a to je základní mapa.

Čtyři díly (SA:MP)
Cgt6cU8KTECdA6hepTALGQ.jpeg
1BQ52tm_QjCuI8OyaQvv6w.jpeg
W7XIa0pbQB2g55orqN7XrA.jpeg
3tK5Amk8RoeXp3cjfxy9UA.jpeg



GTA SA Original mapa

48xsAa64Q7eOScwxVevF4w.jpeg



Jak jsem psal výše ty textdrawy jsou hold větší, tak že jsem vytvořil znovu textdrawy ale v menší podobě + jsem nevytvořil všechny čtyři díly ale pouze dva, protože bych potřeboval zobrazit jen jedno město a né celou mapu san andreas, je to pro mě zbytečné, dokonce jsem zkoušel tu originální mapu (celá), ale i tam mi to dělalo problémy.

Lépe řečeno si myslím že někde bude problém v tomhle stocku

 

stock CheckMapCords(Float:x, Float:y, &Float:X, &Float:Y)
{
if(y < -3000) y = -3000;
else if(y > 3000) y = 3000;
if(x < -3000) x = -3000;
else if(x > 3000) x = 3000;
// TextDrawTextSize(Map[0], 172.000000, 141.000000);
if(y > -3000 && y < 3000 && x > -3000 && x < 3000)
{
if(y < 0) Y = 230 + 138 * -y / 3000; //207
else if(y >= 0) Y = 230 - 138 * y / 3000;
if(x < 0) X = 473 - -x * 151 / 3000;//318
else if(x >= 0) X = 473 + x * 151 / 3000;
}
return true;
}

Zkoušel jsem zadat menší hodnoty, popřípadě hodnoty těch mnou vytvořených textdrawů menších, ale vždycky ten marker naskočil mimo tu mapku vytvořenou, někde na obrazovce.



Chyby/varování kompilátoru a při běhu:

/


Kód:

 

#include 
#include 
#include 

new Text:Map[4], Text:PlayerDraw[MAX_PLAYERS], Text:StatsDraw[MAX_PLAYERS];
new bool:ShowMap[MAX_PLAYERS];


public OnFilterScriptInit()
{
	Map[0] = TextDrawCreate(324.500000, 112.125000, "samaps:gtasamapbit1");
TextDrawTextSize(Map[0], 151.000000, 138.000000);
TextDrawAlignment(Map[0], 1);
TextDrawColor(Map[0], 0xFFFFFF70);
TextDrawBackgroundColor(Map[0], 255);
TextDrawFont(Map[0], 4);

Map[1] = TextDrawCreate(475.500000, 112.125000, "samaps:gtasamapbit2");
TextDrawTextSize(Map[1], 151.000000, 138.000000);
TextDrawAlignment(Map[1], 1);
TextDrawColor(Map[1], 0xFFFFFF70);
TextDrawBackgroundColor(Map[1], 255);
TextDrawFont(Map[1], 4);

Map[2] = TextDrawCreate(324.500000, 249.937500, "samaps:gtasamapbit3");
TextDrawTextSize(Map[2], 151.000000, 138.000000);
TextDrawAlignment(Map[2], 1);
TextDrawColor(Map[2], 0xFFFFFF70);
TextDrawBackgroundColor(Map[2], 255);
TextDrawFont(Map[2], 4);

Map[3] = TextDrawCreate(475.000000, 249.937500, "samaps:gtasamapbit4");
TextDrawTextSize(Map[3], 151.000000, 138.000000);
TextDrawAlignment(Map[3], 1);
TextDrawColor(Map[3], 0xFFFFFF70);
TextDrawBackgroundColor(Map[3], 255);
TextDrawFont(Map[3], 4);
	return 1;
}

public OnPlayerUpdate(playerid)
{
	if(ShowMap[playerid]) UpdateMap(playerid);
	return 1;
}

stock CheckMapCords(Float:x, Float:y, &Float:X, &Float:Y)
{
if(y < -3000) y = -3000;
else if(y > 3000) y = 3000;
if(x < -3000) x = -3000;
else if(x > 3000) x = 3000;
// TextDrawTextSize(Map[0], 172.000000, 141.000000);
if(y > -3000 && y < 3000 && x > -3000 && x < 3000)
{
if(y < 0) Y = 230 + 138 * -y / 3000; //207
else if(y >= 0) Y = 230 - 138 * y / 3000;
if(x < 0) X = 473 - -x * 151 / 3000;//318
else if(x >= 0) X = 473 + x * 151 / 3000;
}
return true;
}
stock CreatePlayerMapDraws(playerid,giveplayerid)
{
if(!ShowMap[playerid]) return 1;
new string[50], Float:x, Float:y, Float:z, Float:Pos_X, Float:Pos_Y;
GetPlayerPos(giveplayerid, x, y, z);
CheckMapCords(x, y, Pos_X, Pos_Y);
PlayerDraw[playerid] = TextDrawCreate(Pos_X, Pos_Y, ".");
TextDrawFont(PlayerDraw[playerid], 1);
TextDrawLetterSize(PlayerDraw[playerid], 0.49, 2.9);
TextDrawColor(PlayerDraw[playerid], 0x253fcfFF);
TextDrawSetOutline(PlayerDraw[playerid], 1);
new Name[24];
GetPlayerName(giveplayerid,Name,24);
format(string, sizeof(string), "ID: %i ~y~ %s", giveplayerid, Name);
StatsDraw[playerid] = TextDrawCreate(Pos_X-10, Pos_Y+10, string);
TextDrawFont(StatsDraw[playerid], 1);
TextDrawLetterSize(StatsDraw[playerid], 0.16, 0.6);
TextDrawColor(StatsDraw[playerid], 0xFFFFFFFF);
TextDrawSetOutline(StatsDraw[playerid], 1);
TextDrawShowForPlayer(playerid, PlayerDraw[playerid]);
TextDrawShowForPlayer(playerid, StatsDraw[playerid]);
return true;
}

stock DestroyPlayerMapDraws(playerid)
{
TextDrawHideForAll(PlayerDraw[playerid]);
TextDrawDestroy(PlayerDraw[playerid]);
TextDrawHideForAll(StatsDraw[playerid]);
TextDrawDestroy(StatsDraw[playerid]);
return true;
}

stock UpdateMap(playerid)
{
if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING)
{
DestroyPlayerMapDraws(playerid);
if(IsPlayerConnected(playerid))
{
CreatePlayerMapDraws(playerid,GetPVarInt(playerid,"give_id"));
}
}
return true;
}
stock TogglePlayerMap(playerid, toggle)
{
if(toggle)
{
if(!ShowMap[playerid])
{
new Float:X, Float:Y, Float:Z;
GetPlayerCameraPos(playerid, X, Y, Z);
if(X == -1795 && Y == 1735 && Z == -99) return SendClientMessage(playerid, -1, "Error");
TextDrawShowForPlayer(playerid, Map[0]);
TextDrawShowForPlayer(playerid, Map[1]);
TextDrawShowForPlayer(playerid, Map[2]);
TextDrawShowForPlayer(playerid, Map[3]);
ShowMap[playerid] = true;
TextDrawShowForPlayer(playerid, PlayerDraw[playerid]);
TextDrawShowForPlayer(playerid, StatsDraw[playerid]);
}
}
else
{
TextDrawHideForPlayer(playerid, PlayerDraw[playerid]);
TextDrawHideForPlayer(playerid, StatsDraw[playerid]);
TextDrawHideForPlayer(playerid, Map[0]);
TextDrawHideForPlayer(playerid, Map[1]);
TextDrawHideForPlayer(playerid, Map[2]);
TextDrawHideForPlayer(playerid, Map[3]);
ShowMap[playerid] = false;
}
return true;
}

CMD:su(playerid, params[])
{
if(!ShowMap[playerid])
{
if(sscanf(params,"d",params[0])) return SendClientMessage(playerid, -1, "playerid: /su [ID]");
if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid,-1,"not connected");
SetPVarInt(playerid,"give_id",params[0]);
TogglePlayerMap(playerid, 1);
}
else
{
DeletePVar(playerid,"give_id");
TogglePlayerMap(playerid, 0);
SendClientMessage(playerid,-1,"Disable");
}
return 1;
}

 




Dodatečné poznámky:

Výše uvedený kód, je ten základní veřejný na fórku, plně funkční s tím že ty textdrawy jsou větší, pouze potřebuji nastavit stock CheckMapCords, který bude ten market ukazovat správně na novém vytvořeném textdrawu mapky (menší).


Otázky či nejasnosti pište, určitě odpovím a lépe vysvětlím.

 

https://prnt.sc/g1vkhu

 

https://prnt.sc/g1vkvs

 

https://pastebin.com/raw/Saq1wciY

Edited by The_boslosos-CZ
Link to comment
Share on other sites

10 odpovědí na tuto otázku

Recommended Posts

  • 0
stock CheckMapCords(Float:x, Float:y, &Float:X, &Float:Y)
{
     clamp(x, -3000, 3000);
     clamp(y, 0, 3000); // 0 - 3000 -> horní díly

     // velikost mapy td = 151.000000, 138.000000
     // pozice levého horního td = 324.500000, 249.937500

     X = x * (151 / 3000) + 324.5 + 151;         // x velikost mapy, x souřadnice levého td
     Y = y * (138 / 3000) + 249.9375;            // y velikost mapy, y souřadnice levého td
}

// EDIT: opraveno

Edited by Lukasz
  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

  • 0

Máš tam ten aktuální kód? Dával jsem edit.

 

Jak to máš s tím, že chceš zobrazovat jen některé části? Zobrazuješ tam kompletní mapu. Kód je dělaný na horní dvě části.

  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Jop, mám ten poslední upravený stock. Zkusil jsem vytvořit jeden textdraw, ta celá mapka (základní).

Map[0] = TextDrawCreate(330.000030, 263.681488, "samaps:map");
	TextDrawLetterSize(Map[0], 0.000000, 0.000000);
	TextDrawTextSize(Map[0], 149.000000, 98.000000);
	TextDrawAlignment(Map[0], 1);
	TextDrawColor(Map[0], -1);
	TextDrawSetShadow(Map[0], 0);
	TextDrawSetOutline(Map[0], 0);
	TextDrawBackgroundColor(Map[0], 255);
	TextDrawFont(Map[0], 4);
	TextDrawSetProportional(Map[0], 0);
	TextDrawSetShadow(Map[0], 0);

A zároveň jsem se pokusil pochopit ten upravený stock tebou icon_e_biggrin.gif Oprav mě prosím tě když tak.

stock CheckMapCords(Float:x, Float:y, &Float:X, &Float:Y)
{
     clamp(x, -3000, 3000);
     clamp(y, 0, 3000); // 0 - 3000 -> horní díly

     // velikost mapy td = 151.000000, 138.000000
     // pozice levého horního td = 324.500000, 249.937500

     X = x * (149 / 3000) + 330.0 + 149;         // x velikost mapy, x souřadnice levého td
     Y = y * (98 / 3000) + 263.681488;            // y velikost mapy, y souřadnice levého td
}

EDIT:// Momentálně to zobrazuje jen jeden textdraw základní.

 

http://prntscr.com/g1wiaz

Edited by The_boslosos-CZ
Link to comment
Share on other sites

  • 0

Ah, myslel jsem, že je v clamp první parametr jako reference.

stock CheckMapCords(Float:x, Float:y, &Float:X, &Float:Y)
{
     // velikost mapy td = 151.000000, 138.000000
     // pozice levého horního td = 324.500000, 249.937500

     X = clamp(x, -3000, 3000) * (149 / 3000) + 330.0 + 149;         // x velikost mapy, x souřadnice levého td
     Y = clamp(y, 0, 3000) * (98 / 3000) + 263.681488;            // y velikost mapy, y souřadnice levého td
}
Edited by Lukasz
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Jak jsem psal, kód je dělaný na horní dvě části (jestli chceš jiné, napiš). Celá mapa je tvořena ze 4 části (všechny hodnoty v té funkci odpovídají tomuto rozdělení) a ty to zobrazuješ do jedné části.

Uprav tedy hodnoty na poloviny (149 / 2, 98 / 2) a přičti k proměnné Y polovinu z 98 (mapa obsahuje i dolní části).

 X = clamp(x, -3000, 3000) * (149 / 6000) + 330.0 + 149/2;         // x velikost mapy, x souřadnice levého td
 Y = -clamp(y, 0, 3000) * (98 / 6000) + 263.681488 + 98/2;         // y velikost mapy, y souřadnice levého td


//EDIT: Přidané - před clamp, td mají jiný souřadnicový systém

Edited by Lukasz
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Mohl bych tě poprosit jestli by si to přepsal ty souřadnice pro ten jeden textdraw ? Zkopíruji ti ho z předešlého příspěvku.

        Map[0] = TextDrawCreate(330.000030, 263.681488, "samaps:map");
	TextDrawLetterSize(Map[0], 0.000000, 0.000000);
	TextDrawTextSize(Map[0], 149.000000, 98.000000);
	TextDrawAlignment(Map[0], 1);
	TextDrawColor(Map[0], -1);
	TextDrawSetShadow(Map[0], 0);
	TextDrawSetOutline(Map[0], 0);
	TextDrawBackgroundColor(Map[0], 255);
	TextDrawFont(Map[0], 4);
	TextDrawSetProportional(Map[0], 0);
	TextDrawSetShadow(Map[0], 0);

Je to jedna celá mapa, textdraw. Chci to zkusit prvně na jeden textdraw to si myslím že bude pro mě jednoduší a pak se budu pokoušet to přidávat pro ty části těch dalších map TD.

 

EDIT: // Z těch více části je to o něco více složitější.

Edited by The_boslosos-CZ
Link to comment
Share on other sites

  • 0

Je to stále divné, pořád se ten marker nepohybuje, přitom sem použil tvou upravenou verzi stocku pro ten jeden textdraw mapky.

 

stock CheckMapCords(Float:x, Float:y, &Float:X, &Float:Y)
{
    // velikost mapy td = 151.000000, 138.000000
    // pozice levého horního td = 324.500000, 249.937500


    X = clamp(x, -3000, 3000) * (149 / 6000) + 330.0 + 149/2;         // x velikost mapy, x souřadnice levého td
    Y = -clamp(y, 0, 3000) * (98 / 6000) + 263.681488 + 98/2;         // y velikost mapy, y souřadnice levého td
}

V podstatě nic jiného jsem neměnil nepřidával, krom tvého stocku, posledního.

 

EDIT:// Ale vytvořilo ho to na jiné pozici na té mapce.

 

http://prntscr.com/g1xxnt

 

 

https://pastebin.com/Az3EsW4v

Edited by The_boslosos-CZ
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...