game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
De activerings e-mail gemist?
+  Forums
|-+  Werken met Game Maker
| |-+  Tutorials en Uitbreidingen (Moderator: Maarten Baert)
| | |-+  [Scr] draw_line_sprite
Pagina's: [1]
« vorige volgende »
Print
Advertenties

Laloeka
Gebruiker


Offline Offline

Berichten: 2551


WWW
« Gepost op: 3 Juni 2008, 18:56:44 »

Gevorderden
Geregistreerd: Ja
Gamemaker:
  Game Maker 7 en Game Maker 6


Dit script drawt een lijn van een sprite met 3 subimages*
*=met 2 wordt de eerste subimage op het eind opnieuw gedrawt
*=met 1 blijft het steeds dezelfde


GML:
                  //////////////////////////
                  //       Made by        //
                  //       Laloeka        //
//////////////////////////////////////////////////////////////
//     draw_line_sprite(sprite,x1,y1,x2,y2,kleur,alpha)     //
//////////////////////////////////////////////////////////////
// argument0 is de sprite waarmee gedrawt word              //
// argument1 is de x1                                       //
// argument2 is de y1                                       //
// argument3 is de x2                                       //
// argument4 is de y2                                       //
// argument5 is de kleur (standaard c_white)                //
// argument6 is de alpha v.d. lijn                          //
//////////////////////////////////////////////////////////////
//                         LET OP!!!                        //
//////////////////////////////////////////////////////////////
// De origrin punten (offset punten) v.d. sprite kun je     //
// verandere maar dat heeft GEEN effect op dit script       //
// Dit script zorgt ervoor dat het (0,0) punt van de sprite //
// in de (x1,y1) en de (x2,y2) positie word gedrawt.        //
//////////////////////////////////////////////////////////////

i = 0
X = argument1;
Y = argument2;
DiR = point_direction(argument1,argument2,argument3,argument4);
DiS = point_distance(argument1,argument2,argument3,argument4);
W = sprite_get_width(argument0);
H = sprite_get_height(argument0);
XO = sprite_get_xoffset(argument0);
YO = sprite_get_yoffset(argument0);
sprite_set_offset(argument0,0,0);

draw_sprite_ext(argument0,0,X,Y,1,1,DiR,argument5,argument6);

X+=lengthdir_x(W,DiR)
Y+=lengthdir_y(W,DiR)

repeat (ceil(DiS))
{
  if i > W then i = 0;
  draw_sprite_general(argument0,1,i,0,1,H,X,Y,1,1,DiR,argument5,argument5,argument5,argument5,argument6);
  X+=lengthdir_x(1,DiR);
  Y+=lengthdir_y(1,DiR);
  i+=1;
  }

draw_sprite_ext(argument0,2,X,Y,1,1,DiR,argument5,argument6);

sprite_set_offset(argument0,XO,YO);

Uitleg van het script:

Eerst worden alle argumenten en varaibles ingestelt.
De offset punten worden opgeslagen met XO en YO, daarna worden de offset punten (0,0)
Dit is omdat anders de 2e subimage gaat verschuiven.

Dan word de 1e subimage gedrawt als begin.

Dan word uitgerekent hoeveel keer de 2e subimage gedrawt moet worden
Net als bij mijn draw_health_sprite script word dan de i gebruikt om 'rijen' te drawen van de sprite.
Als die i groter is dan de sprite breed is, word hij op 0 ingesteld (begint opnieuw)
Bij elke rij verschuiven de x en de y één plaats naar (x2,y2).

Als laatste word de 3e subimage gedrawt.

Dan worden de offset punten weer terug gezet van de opgeslagen waardes XO en YO zodat je die sprite misschien nog ergens anders voor kunt gebruiken.

Samengevat
drawt sprites op een lijn met de 1e subimage op punt (x1,y1) en de 3e op punt (x2,y2) en de 2e subimage ertussen

Laloeka Blij

« Laatste verandering: 4 Juni 2008, 19:34:36 door Laloeka »


-------
Naar boven Gelogd

TrevoriuS
Gebruiker

Offline Offline

Berichten: 1687


« Antwoord #1 Gepost op: 4 Juni 2008, 17:07:16 »

En waar gebruik je dit voor op practisch gebied?


Naar boven Gelogd

Erik Leppen
Forumbeheerder


Offline Offline

Berichten: 9655


WWW
« Antwoord #2 Gepost op: 4 Juni 2008, 17:20:36 »

Omdat ik uit je omschrijving niet begreep wat je script precies deed, heb ik even getest en een screenshotje gemaakt van het resultaat. Het ziet er (bijvoorbeeld) zo uit:
http://www.majhost.com/gallery/ErikLeppen/WindowsScreenshots/arrows.png

Het idee op zich is leuk, en handig voor bv. het tekenen van laserstralen, pijlen, gedraaide healthbalkjes, etc. etc. maar voor al die doeleinden lijkt het me nou juist niet praktisch dat je de origin van de sprite negeert. Waarom kies je voor de linkerbovenhoek in plaats van de gebruiker van het script dat te laten doen? Je voegt dus nu expres extra code in om de mogelijkheden in te perken, en dat is jammer. Het zomaar verwijderen van de sprite_set_offset helpt helaas niet, maar ik stel voor dat je er nog even naar kijkt zodat je gewoon de origins van de sprite gebruikt (tenslotte hebben alle subimages dezelfde afmeting en dezelfde origin, daardoor zou er weinig moeten veranderen).

Verder gebruik je de variabele ODiR volgens mij nergens. En wat is precies de functie van de buitenste { en }?

Tenslotte draw je als ik het goed begrijp rijen van één pixel breed van je sprite. Voor een sprite van 16 x 16 moet je dus 16 keer de lus doorlopen om een hele sprite te tekenen. Het lijkt me beter om dan gewoon de hele sprite in een keer te tekenen, dat lijkt me veel sneller. Als ik vier pijlen van lengte 400 teken dan kan ik al niet meer 60 fps halen, dat komt omdat je dan elke stap 1.600 keer de lus moet doorlopen.


Edit: hij werkt ook onder  Game Maker 6.


Naar boven Gelogd

Laloeka
Gebruiker


Offline Offline

Berichten: 2551


WWW
« Antwoord #3 Gepost op: 4 Juni 2008, 19:30:27 »

Ik gebruik geen origrins omdat de funtie:
draw_sprite_general() deze niet ondersteunt...

Die ODiR wilde ik als oplossing gebruiken om die origrin punten weg te werken maar dat werkte niet dus dat zal ik aanpassen

die buitenste { en } gebruik ik bijna in elk script om aan te geven wanneer ik begin met het script zelf maar ik wil deze ook wel weghalen hoor...

dat van 6 zal ik er ook bijzetten

Laloeka Blij

« Laatste verandering: 4 Juni 2008, 19:34:16 door Laloeka »


-------
Naar boven Gelogd

TrevoriuS
Gebruiker

Offline Offline

Berichten: 1687


« Antwoord #4 Gepost op: 4 Juni 2008, 23:17:58 »

@ Erik:
Dit is inderdaad een duidelijk voorbeeld, en nu snap ik ook beter het nut van dit script. Ik ga het zelf waarschijnlijk niet gebruiken, maar er zullen zeker mensen zijn die hier iets aan hebben.


Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1]
Print


Topic Informatie
0 geregistreerde leden en 1 gast bekijken dit topic.

Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
www.game-maker.nl © 2003-2019 Nederlandse Game Maker Community