Üzenetek megjelenítése

Ez a szekció lehetővé teszi a felhasználó által írt összes hozzászólás megtekintését. Vedd figyelembe, hogy csak azokba a fórumokba írt hozzászólásokat látod, amelyekhez hozzáférésed van.


Témák - Fade

Oldalak: [1] 2 3 4
1
Leírások/Útmutatók / [TUT] Moduláris programozás PAWN-ban
« Dátum: 2018. március 25. - 16:15:30 »
Moduláris Programozás
 
Mi is ez?
 
A moduláris programozás egy olyan folyamat, amely során a kódot felbontjuk különböző, ú.n modulokra, az alapján, hogy milyen feladatot lát el, milyen logikát tartalmaz. Itt, PAWN-ban ez annyiban nyilvánul meg, hogy ezeket a modulokat külön forrásfájlba tesszük. Ilyenkor lesz egy \"fő\" modul (itt main-nek fogom hívni) ami összekapcsolja az összes többit valamilyen beágyazó mechanizmus segítségével, amely nekünk az include direktíva.
 
 
 
Oké, de miért jó?
 
A kérdést nagyjából megválaszoltam az előző pontban az egy vagy több forrásfájlos problémával. Ennek ellenére a hasznosságát szeretném egy egyszerű példával szemléltetni.
Például, szeretnél megnézni egy-két dolgot egy gamemode-ban, hogy hogyan oldották meg. A mód egyetlen egy fájl, amely 30-40 ezer soros. Megnyitod, ránézel. Órákig tart, mire kisilabizálod, hogy egyáltalán melyik az a kódrészlet, amelyre neked szükséged van, aztán még lehet órák kérdése az is, hogy felfogd.
Felteszek egy őszinte és nagyon fontos kérdést: tetszik az ilyen? Ha igen, akkor (és most ez lehet, hogy egy kicsit durván hangzik) nem valószínű, hogy a fejlesztői pálya neked való.
Másik eset: egy nagyobb skáláju projektet tervezel, esetleg egy olyan módot szeretnél írni, ami sok színű, sok mindenre való. Ha felismered, hogy több, független feladatot lát el maga a mód, akkor egyből a rendszerezésen kell gondolkodni, valamint, hogy hogyan szeretnéd felépíteni. Viszont (és ez most egy nagyon nagy viszont), kisebb projektekre is javaslom, a következő pontban leírom, hogy miért.
 
 
 
Előnyök
 

  •    Könnyen bővíthető rendszer kiépítése


  •    Kód újrahasználhatósága (ez egy nagyon fontos pont)


  •    Egyszerűen testre lehet szabni, hogy mire van szükség, mire nem


  •    Rendszerezett, tisztázott kód


  •    Több ember kényelmesen tud rajta dolgozni


  •    Manapság az OOP nyelvek ugyan ezen az elven működnek, ezért is érdemes megismerkedni vele


Hátrányok
 

  •    Azonos azonosító nevek (változók, metódusok) nem szerepelhetnek a különböző modulokban (ez a PAWN és egyéb C alapú nyelvek sajátossága, később megbeszéljük, miért)


  •    Callback-ek többszöri szereplése. Ezt a jelenséget remélhetőleg a többség ismeri. Példa: az OnPlayerConnect callback használva van egy library-ben (include-ban) és a módodban is. Ilyenkor szól a fordító, hogy kétszer szerepel a callback és nem tudja eldönteni, hogy melyiknek kell előbb vagy utóbb futnia.
       Erre több megoldás létezik: ALS, YSI féle y_hooks (itt ezt fogjuk használni), egyéb include guard-ok.


  •    Sokat kell dokumentálni a modulok miatt.


Hogyan?
 
Először is beszéljük át, hogy egy moduláris projekt hogyan is néz ki élesben.
Az alábbi képen látható egy példa:
 
\"dir.jpg\"
Itt nyilvánvalóan a main.pwn lesz az, ami összeszedi az összeset egyben, valamint ez lesz az a fájl (ez most egy gamemode), amit a szervernek be kell hivatkozni.
A nagyobb modulokat egy mappába szervezzük, valamint minden olyan modult, amely feltétlenül szükséges ahhoz, hogy a script fusson egy core mappába egységbe zárjuk. A többi modul, amelyektől egyáltalán nem \"függ\" a script, mehet külön, ezeket \"stand-alone\" moduloknak szokás hívni.
A player core modulja tartalmazza a játékos enum-ját és egyéb definícióit, valamint azokat a metódusokat, amelyek hozzá kapcsolhatóak.
 

#include <YSI\\y_hooks> // ezt mindjárt tisztázzuk
enum playerData
{
bool:isLoggedin,
level,
...
};
new Player[MAX_PLAYERS][playerData];
...

 
 
 
Ez után, ezt fogjuk beágyazni a main-be:
 

/*==============================================================================
Libraries
==============================================================================*/
#include <a_samp> //SAMP Team
#include <YSI\\y_hooks>
/*==============================================================================
Modules
==============================================================================*/
// Player
#include \"core/player/core.pwn\"
 
...

 

...és így tovább.
Nyilván modul is behivatkozhat modult, sőt, sokkal szebb, ha nem az összes modult ágyazzuk be a main-be, hanem inkább azt mondjuk, hogy a modulok önmagukban is működnek. Ilyenkor, az adott modulba behivatkozzuk azt, amelyiktől függ.A #include jelentése
 
Mielőtt tovább mennék, beszéljük át, hogy mit is jelent az include direktíva.
Egyrészt a hashmark (#) jelzi a fordítónak, hogy ez egy preprocesszor direktíva <- olyan utasítás, amit a fordító fordítás előtt értelmez és végrehajt (magyarul: előfeldolgozó).
Az include-ot a PAWN a C-ből örökölte meg, röviden: \"ennek a fájlnak a tartalmát illeszd be ide\". Tehát, amit az include-dal behivatkozunk, annak a forrásfájlnak a tartalmát a fordító az include helyére szépen bedobja.
 
Mi ennek a jelentősége?
Sorrendiség. Nem mindegy, hogy bizonyos modulok milyen sorrendben vannak beágyazva. Ha egy modul hivatkozik valamire egy másikból, akkor az utóbbit nyilván előbb be kell ágyazni, mint az előbbit. Viszont pont ezért mondtam, hogy ha egy modul függ a másiktól, akkor a beágyazást az adott modul végezze inkább.y_hooks
 
Ez az include a YSI része.
Célja: megfelelően hook-olni a callback-eket, intuitív szintaxissal, minél kevesebb \"fejfájást\" okozva.
 
Mire jó?
Arra, amit korábban említettem: többször szerepelhet a kódban egy callback. Így a modulokban egyenként szerepelhet pl. az OnPlayerConnect, minden probléma nélkül. Nem kell ALS guard-okat definiálni (ezek amúgy is boiler plate kódot eredményeznek, erről esetleg később egy másik leírásban).
 
Használata:
Minden egyes modulba szépen beágyazzok a y_hooks-t, majd a callback-eket a public kulcsszó helyett a hook kulcsszóval látjuk el.
Példa:
 

/*==============================================================================
Model selection menu
==============================================================================*/
#include <YSI\\y_hooks>
static stock skinList;
/*==============================================================================
Hooks
==============================================================================*/
hook OnGameModeInit() {
skinList = LoadModelSelectionMenu(\"MidnightRPG/Menus/skins.txt\");
}
hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) {
if(dialogid == DIALOG_FIRST) {
   ShowModelSelectionMenu(playerid, skinList, \"Select Skin\");
}
return 1;
}

 

Ezek után, ezek a hook-ok a beágyazás sorrendjében fognak lefutni, mikor az eredeti meghívódik. Így, a projektben egyszer szerepelhet public kulcsszóval is egy adott callback és az azt fogja jelenteni, hogy az fusson le legelőször.static és a stock
 
Nem hiába szerepelnek a PAWN-ban ezek a kulcsszavak. A moduláris projektek különös hasznát veszik.
A static jelentése: csak a saját fájljában látható.
A stock jelentése: amíg nincs hivatkozva az ezzel ellátott metódus vagy változó, addig az interpreter szimplán \"hozzá sem köti\" a lefordított script-hez, egyszerűen csak lehagyja. Amint használjuk, be lesz kötve, viszont ha nincs többet használva, akkor megint csak kikerül a programból.
 
A static haszna: meggátolni másokat, hogy rosszul használják a kódodat. Az OOP egységbezárás alapelve működik itt: csak azokat a részleteket jelenítsük meg a külvilágnak, amelyek feltétlenül szükségesek. Magyarul: ha valamit más fájlban/modulban nem használsz, az legyen static. Ezzel már kevesebb lehetőséget biztosítasz másoknak arra, hogy hibákba fussanak bele, ha a kódodat használják.
A stock haszna: amíg valami nincs használva, addig ne foglalja feleslegesen a helyet a memóriában. Valamint, ha már nincs rá szükség, akkor szabaduljon föl. Érdemes minden modulban a metódusokat ezzel ellátni. Ha viszont biztosra tudod, hogy valami folyamatosan használva lesz, akkor ott el kell hagyni.
 
Kiegészítés
 
Mivel ez a módszer több fájlos projekteket eredményez, ezért nem ajánlom a pawno-t a szerkesztéshez.
Nem szeretnék most részletesen bele menni abba, hogy hogyan kell más környezeteket beállítani a PAWN-hoz, rengeteg leírás található neten róla, itt csak megemlítek két példát, amiket én is használok: Sublime Text 3 és Visual Studio Code.
Mindenkinek \"szája íze\", de én ezeket találtam erre a célra a legkényelmesebbnek.
Köszönet Naretev-nek, hogy szólt.Köszönöm a figyelmet.

2
Off Telep / A világ leggyorsabb ivója
« Dátum: 2012. november 24. - 21:15:06 »

Ezen behugyoztam... :O

3
Hangszerek és előadók / Screaming
« Dátum: 2012. október 12. - 17:51:45 »
Benne van valaki ebben a témában? Én nem rég kezdtem el, és nagyon bejön. Igaz, hónapokat kell gyakorolni ahhoz, hogy jó hangot kapjunk belõle...
Nagyjából tudom hogy kell, de nem vagyok biztos benne, hogy jól csinálom... aki esetleg ért hozzá, az leírhatná.
Torokfájdalmakat, ilyeneket nem kaptam még tõle, de elég kockázatos. Bemelegítéseket nagyjából vágom.
Kíváncsi vagyok a véleményetekre, aki esetleg tud, annak tapasztalataira... ^-^

4
Off Telep / Cristofel vs SP, Fluor
« Dátum: 2012. augusztus 30. - 23:57:07 »

Csak nézd. :D

5
Minecraft / Minecraft vs real life
« Dátum: 2012. augusztus 28. - 01:35:11 »

Nem minden 100%-osan igaz, de azért jó kis videó. :D
[gmod=Gentleman]Linket javítottam[/gmod]

6
Játékok / Symphony
« Dátum: 2012. augusztus 08. - 01:25:49 »
A játék alapvetõen egy Audiosurf-höz hasonlítható zenén alapuló ügyességi játék.
Ugye Audiosurfben a lényeg az volt, hogy ritmusra jönnek a blokkok, neked elkerülni/felszedni kellett õket. Ebben a játékban ritmusra jönnek az ELLENFELEK, és egyéb más dolgok is.
Elõnyök az Audiosurf-fel szemben:
- Bossokat generál le a számaidra néha.
- Rengeteg nehézség (nem csak 3)
- Unlockolható itemek.
- Szerkeszthetõ ûrhajó.
- Grafika jobb, gépigény hasonló, viszont kihasználja a többmagos processzorokat az Audiosurf-fel szemben.
Hátrányokról nem tudok.
A játék lényege, hogy az ellenségek (ûrhajók, turretek, egyéb dolgok) ritmusra bukkannak be oldalról, elõlrõl, akárhonnan, neked azokat ki kell iktatni. Ha az ellenfelek a zenesáv falán (videóban látható lesz majd) átmennek, akkor úgymond \"fertõzik\" a zenét (néhány hülye hangot kevernek bele). Ha megölöd az ellenfeleket, dobnak kis dallamhangokat, amiket fel lehet venni, ez olyan a játékban mint az MMO-kban az XP. Ezekkel lehet unlockolni az itemeket. A számok után, ha eleget összegyûjtöttél az adott szám alatt megtalálod az itemet, és rányomhatsz az unlock gombra, majd a hajód szerkesztésénél rárakod, ahogy tetszik.
Van még szerintem sok egyéb dolog a játékban, amire nem jöttem rá.
És igen, persze hogy lehet saját számokat használni (ez a lényege).
 

Steam-es játék (beszerezhetõ törten is, de ilyet nem fogok linkelni).

7
SA-MP: Szerverfejlesztés / Fade\'s damage behaviour V2.0
« Dátum: 2012. július 26. - 21:53:38 »
Üdv!
Eléggé régen publikáltam egy script-et Hurt Script néven (a neve rohadtul nem illett hozzá, ezért neveztem most át), és ez annak a frissítése lenne.
V2.0 változásai:
- Kocsiból kirepülés szebbítve, korrigálva.
- Gyalogosként egy új rendszer beiktatva.
- Bugjavítások.
- Enyhe optimalizáláson esett át a script.
- Felállás után is szédül a player egy kis ideig.
Features:
- Ha autóval nekimész egy falnak, vagy egyéb tárgynak, úgy hogy minimum 150-et sebez az autóba, akkor kirepülsz az autó haladási sebességével egyenlõ erõvel.
- Ha kirepülsz autóból, fekve landolsz, és 5 mp-ig nem tudsz felkelni, szédülsz.
- Ha gyalogosként 20, és 40 közötti sebzést kapsz, beszédülsz.
- Ha gyalogosként 40 fölött sebzõdsz kifekszel (fõleg esésre vonatkozik, de lövésre is, ez késõbb változik majd), 5mp-ig nem tudsz felkelni, szédülsz.
- Ha 10, vagy kevesebb életed van, véglegesen szédülsz, amig 10 fölé nem megy az életed.
Videó:
http://www.youtube.com/watch?v=u7Vtrpjd5u4
(a 10 életes dolog nem látható a videóban, de az eddig is benne volt a script-ben)
Letöltés [AMX + PWN]:
http://www.solidfiles.com/d/d333ff99a0/
Forráskód [PWN] (Optimized by Zsolesszka):
 
#include <a_samp>
 
new Float:vhealth[MAX_PLAYERS];
new Float:velX[MAX_PLAYERS], Float:velY[MAX_PLAYERS], Float:velZ[MAX_PLAYERS];
 
forward OnVehicleLoseHealth(playerid, vehid, health);
 
forward DrunkClean(playerid);
forward Refix(playerid);
forward FallSet(playerid);
forward Controllable(playerid);
 
public
        OnFilterScriptInit()
{
        print(\"\\n--------------------------------------\");
        print(\"     Damage behaviour v2.0 by Fade      \");
        print(\"--------------------------------------\\n\");
        return 1;
}
 
public
        OnPlayerStateChange(playerid, newstate, oldstate)
{
        if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
        {
                GetVehicleHealth(GetPlayerVehicleID(playerid), vhealth[playerid]);
        }
        return 1;
}
 
public
        OnVehicleRespray(playerid, vehicleid, color1, color2)
{
        GetVehicleHealth(vehicleid, vhealth[playerid]);
        return 1;
}
 
public
        OnVehicleLoseHealth(playerid, vehid, health)
{
        if(health >= 150)
        {
                new
                        Float:x,
                        Float:y,
                        Float:z,
                        Float:a;
                GetVehiclePos(vehid, x, y, z);
                GetVehicleZAngle(vehid, a);
                SetPlayerPos(playerid, x, y, z+2);
                GetVehicleVelocity(vehid, x, y, z);
                SetPlayerVelocity(playerid, velX[playerid], velY[playerid], z+1);
                SetPlayerDrunkLevel(playerid, 10000);
                SetTimerEx(\"FallSet\", 500, 0, \"i\", playerid);
        }
        if(health >= 500) SetPlayerHealth(playerid, 0);
        return 1;
}
 
public
        OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
        new
                Float:hp;
        GetPlayerHealth(playerid, hp);
        if(20 <= amount <= 40)
        {
                SetPlayerDrunkLevel(playerid, 25000);
                SetTimerEx(\"DrunkClean\", 5000, 0, \"i\", playerid);
        }
        else if(40 <= amount <= hp)
        {
                ClearAnimations(playerid);
                TogglePlayerControllable(playerid, 0);
                ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
                SetPlayerDrunkLevel(playerid, 10000);
                SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
        }
        return 1;
}
 
public
        Refix(playerid)
{
        ApplyAnimation(playerid, \"ped\", \"getup_front\",4,0,0,0,0,0);
        SetTimerEx(\"Controllable\",1800,0,\"i\",playerid);
        SetTimerEx(\"DrunkClean\",3000,0,\"i\",playerid);
        return 1;
}
 
public Controllable(playerid) return TogglePlayerControllable(playerid, 1);
public FallSet(playerid) return SetPVarInt(playerid, \"FallFromVeh\", 1);
 
public
        DrunkClean(playerid)
{
        SetPlayerDrunkLevel(playerid,0);
        return 1;
}
 
public
        OnPlayerUpdate(playerid)
{
        new
                Float:hp;
        GetPlayerHealth(playerid, hp);
        if(hp >= 99) SetPlayerDrunkLevel(playerid, 0);
        else if(hp <= 10) SetPlayerDrunkLevel(playerid, 1000);
 
        new
                vehicleid = GetPlayerVehicleID(playerid);
        if(vehicleid)
        {
                GetVehicleHealth(vehicleid, hp);
                if(hp != vhealth[playerid])
                {
                        if(hp < vhealth[playerid]) OnVehicleLoseHealth(playerid, vehicleid, floatround(vhealth[playerid] - hp));
                        vhealth[playerid] = hp;
                }
                GetVehicleVelocity(vehicleid, velX[playerid], velY[playerid], velZ[playerid]);
        }
        if(GetPVarInt(playerid, \"FallFromVeh\") == 1)
        {
                new
                        Float:vX,
                        Float:vY,
                        Float:vZ;
                GetPlayerVelocity(playerid ,vX, vY, vZ);
                if(vZ == 0)
                {
                        ClearAnimations(playerid);
                        GetPlayerHealth(playerid, hp);
                        hp -= 30.0;
                        SetPlayerHealth(playerid, hp);
                        if(hp <= 0.0)
                        {
                                SetPlayerDrunkLevel(playerid, 0);
                        } else {
                                SetPlayerDrunkLevel(playerid, 10000);
                                SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
                                TogglePlayerControllable(playerid, 0);
                                ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
                        }
                        SetPVarInt(playerid, \"FallFromVeh\", 0);
                }
        }
        return 1;
}

 
A GetXYInFrontOfPlayer függvény tesztnek volt berakva, nem kell vele foglalkozni, komiba raktam.

8
Általános / Az MTA-s RPG
« Dátum: 2012. július 25. - 18:28:12 »
Szerintem a SA:MP nem csak régebben, de még ma is és jópár ideig elbújhat az MTA mögött ilyen téren...
http://www.youtube.com/watch?v=omZDKgxG_qQ
Nem vagyok egy nagy RP fan, de egy ilyen szervert azért megnéznék...

9
Modok / [SKIN]Monster & DC NRG pack
« Dátum: 2012. július 25. - 17:12:12 »
Estétnapotreggelt.
Unalomból csináltam ezt a texture packet NRG-hez. DC-s, és Monster-es NRG-k találhatóak benne fekete, és fehér színben. (valamint színes is van a DC-nél)
1 óra munka volt kb. Photoshop-pot, és TXD Workshop-ot használtam.
Képek:
\"width=500http://noob.hu/2012/07/25/gta_sa_2012-07-25_14-56-50-44.bmp[/img]
\"width=500http://noob.hu/2012/07/25/gta_sa_2012-07-25_14-54-10-69.bmp[/img]
\"width=500http://noob.hu/2012/07/25/gta_sa_2012-07-25_15-29-32-31.bmp[/img]
\"width=500http://noob.hu/2012/07/25/gta_sa_2012-07-25_14-58-44-68.bmp[/img]
\"width=500http://noob.hu/2012/07/25/gta_sa_2012-07-25_15-01-41-64.bmp[/img]
A színes DC-t azt igaz eléggé összecsaptam, ott csak ráhúztam a képet a motorra... a többivel többet foglalkoztam (maszkolás, a motor alaplayerének átszínezései, stb...), meg az így néz ki jól, nem tudtam máshogy megoldani... :)
A telepítés le van írva a readme-ben, de szerintem ehhez mindenki ért. :)
Annyi a különbség a sima textúra telepítéstõl, hogy egy carcols.dat-ot is mellékeltem, azt a \"data\" mappába kell belehajítani, ezt azért, hogy ne legyenek a játék által legenerált színei a motornak, és az igazi színében legyen.
Letöltés:
http://www.solidfiles.com/d/26107e3c00/
http://www.sendspace.com/file/2xq7o3

10
Call of Duty 4 - Modern Warfare / Az komoly egy aimbot
« Dátum: 2012. július 07. - 22:35:29 »
Oszt. társam mutatta a videót, hát mit ne mondjak, elég érdekes egy aim... xD
 

11
Counter Strike 1.6 / 1.6 - ALIVE
« Dátum: 2012. július 04. - 00:44:33 »
A legjobban editelt videó a cs-k történelmében, amit láttam, szerintem. Érdemes megnézni, aki nem ismerné.
 

13
Off Telep / Lego gépház
« Dátum: 2012. július 02. - 01:42:02 »
Az konkrét! :D
 

14
Off Telep / Zsigmond
« Dátum: 2012. június 28. - 21:15:01 »
Aki még esetleg nem látta... xDDD
 

15
Off Telep / VGA
« Dátum: 2012. június 21. - 13:16:16 »
Az normális, ha az egyik videó karimnál a hûtõborda, és a memóriák + a gpu közé valami papírgalacsinok vannak odalapítva? Mert az nem normális, hogy MW2 közben 5 perc múlva full színes, lefagy, és 80 fokos a kártya...
Csak azért kérdezem, mert anno eleve így adták el nekem azt a VGA-t...

Oldalak: [1] 2 3 4
SimplePortal 2.3.7 © 2008-2024, SimplePortal