Jump to content
  • 0

pomoc Newkey vo vlastnej funkcii


TommyX

Dotaz

Vedel by mi niekto napísať krátky ukážkový kód, ako spraviť:

Keď mám vlastnú funkciu a v nej chcem zistiť, či hráč stlačil nejaký bindnutý key

 

public DrevorubacRez(playerid)

{

TogglePlayerControllable(playerid, 0);

SendClientMessage(playerid,0xFFFFFFFF,"Stlač L.Shift (Jump)");

for (new i=0;i<1;)

{

if (newkeys & KEY_JUMP))

{

TogglePlayerControllable(playerid, 1);

j++;

}

}

return 1;

}

 

Chcel by som dosiahnuť, aby cyklus trval, kým hráč nestlačí danú klávesu, ale neviem ako to spraviť, ako sa dostať do funkcie OnPlayerKeyStateChange.

Chcel som niečo takéto, neviem či mi rozumiete. Som začiatočník v pawne a bol by som rád ak by ste mi pomohol, poprípade aj vysvetlili, prečo to tak funguje.

Ďakujem za odpovede

Link to comment
Share on other sites

12 odpovědí na tuto otázku

Recommended Posts

  • 0

SendClientMessage(playerid,0xFFFFFFFF,"Stlač L.Shift (Jump)");

for (new j=0 ;j<1 ; )

{

GetPlayerKeys(playerid, newkeys, ud, lr);

if (ud==KEY_UP)

{

j=1;

SendClientMessage(playerid,0xFFFFFFFF,"Odpílil si strom");

}

}

 

Upravol som to takto, nejde to zatial na jump, ale zatial na UP key, ako si mi poradil. Keď som to testoval, tak mi robilo nasledové:

Keď som prebehol cez CP, všetko fungovalo. Ale keď som skočil do CP (hneď nato sa dostane do cyklu) tak po stačení W alebo UP ma už nevyhodilo z cyklu a podmienka sa nikdy nesplnila. Kde môže byť problém prosím ťa?

Link to comment
Share on other sites

  • 0

ale chová sa to aj ta rovnako, neviem to ukončiť, sa mi to nejako zacyklí, alebo... nerozumiem presne čo sa deje.

Spravil som si funkciu, ktorá mi vypíše správu vždy keď stlačím (držím) UP. Ale akonáhle sa dostanem do toho cyklu, tak to celé prestane bežať.

Link to comment
Share on other sites

  • 0

Jaky smysl tam ma ten cyklus ? Tam je problem ze pri vyvolani toho scriptu dojde k zacykleni. To muze mit ruzne nasledky, bud spadne server, vypadne mod, nebo se to cele zasekne. Takze rozhodne tam dat interval. Ale ja bych vubec nevidel problem, ten script udelat pres OnPlayerKeyStateChange

new bool:Drevorubac[MAX_PLAYERS];
public DrevorubacRez(playerid)
{
TogglePlayerControllable(playerid,0);
Drevorubac[playerid] = true;
SendClientMessage(playerid,0xFFFFFFFF,"Stlač L.Shift (Jump)");
return 1;
}
public OnPlayerKeyStateChange(playerid,newkeys,oldkeys)
{
if(newkeys == KEY_JUMP)
{
 if(Drevorubac[playerid] == true)
 {
  TogglePlayerControllable(playerid,1);
  Drevorubac[playerid] = false;
 }
}
return 1;
}

Link to comment
Share on other sites

  • 0

veľmi nerozumiem zatiaľ tomu chodu kódu, ja som programoval na škole len v C++ a tam to bolo pre mňa úplne jasné čo sa kedy vykoná, ale tu mám v tom chaos. Chcel som len dosiahnuť, aby cykus bežal, kým hráč nestlačí požadovaný KEY ale pre mňa z neznámych dôvodou to nefunguje, aj keď logicky sa mi to zdá byť správne. Skúsim to spraviť tak, ako si mi poradil,

ďakujem ti ATomas.

Link to comment
Share on other sites

  • 0

tak to mi nehovorí už vôbec nič :d Popravde, tým cyklom som chcel dosiahuť, aby hráč musel stpačiť striedavol SHIFT a SPACE a 5x by sa to striedalo

for (new j=0 ;j<5 ;j++)

{

SendClientMessage(playerid,0xFFFFFFFF,"Stlač Space (Sprint)");

nejaká funkcia na zistenie stlačenia

SendClientMessage(playerid,0xFFFFFFFF,"Stlač Shift (Jump)");

aj tu funkcia na zistenie

j++; a nakoniec by sa pripočítalo

}

Link to comment
Share on other sites

  • 0

Sice nevím co tady nacvičujete ale dobrý pokud sem rozuměl chtěl si vytvořit funkci

 

a navíc jestli si chtěl aby se musela držet klávesa tak to v keystatechange nezístíš ta se vyvolá jen při změně státu klávesy pokud si to tak myslel jako že asi jo s tím cyklem musíš používat timer respektive timerEx který při newstate vytvoříš a oldstatu zničíš v praxi by to mělo vypadat asi takhle

 

 

// toto dej třeba do onplayerpickuppickup nebo globálního timeru z kontrolou polohy
SendClientMessage(playerid,0xFFFFFFFF,"Stlač L.Shift (Jump)");
if (newkeys & KEY_JUMP))
{
KillTimer(TimerRubaca);
TimerRubaca=SetTimerEx(....DrevorubacRez i playerid
}
if (oldkeys & KEY_JUMP))
{
KillTimer(TimerRubaca); //samozrejme si vsechny akce kontroluj promenou treba ze ma misi nebo povolani nebo tak neco
}


public DrevorubacRez(playerid)
{

SendClientMessage(playerid,0xFFFFFFFF,"Dřevorubač řeže jak o život");
//progres proměnné ++
// dejme tomu nějakou kontrolu na automatické ukončení třeba že strom už spadl
KillTimer(TimerRubaca);
return 1;
}

Link to comment
Share on other sites

  • 0

veľmi nerozumiem zatiaľ tomu chodu kódu, ja som programoval na škole len v C++ a tam to bolo pre mňa úplne jasné čo sa kedy vykoná, ale tu mám v tom chaos. Chcel som len dosiahnuť, aby cykus bežal, kým hráč nestlačí požadovaný KEY ale pre mňa z neznámych dôvodou to nefunguje, aj keď logicky sa mi to zdá byť správne. Skúsim to spraviť tak, ako si mi poradil,

ďakujem ti ATomas.

Chapes ze tim ze spustis cyklus, kterej se porad opakuje dokud hrac nestiskne klavesu, tak ma server porad praci jenom s tim cyklem a nema na nic jineho cas. Proste to zalagujes.

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...