Type verständnis hängt noch etwas :(

Previous topic - Next topic

D2O

Hi, auf basis von Schanz0r's beispiel, habe ich jetzt mal einen SchussType/Function erstellt.

Ziel ist es Functionen zuerstellen die man als Templates benutzen kann, man muss ja nicht immer das Rad neu erfinden ;)
Auch sollen ansich sowenig bis garkeine Globalen Variablen darin auftauchen, so das ein Fremder die function einfach aufrufen kann
ohne gefahr zu laufen überschneidungen mit seinen eigenen Variablen zu haben.

Ok, mein Problem ist nun das die function nur einmal aufgerufen werden kann, da ich intern STATIC benutze und es eben hier
intern Variablen/Wert überschneidungen gibt.

Hier mal der Code:
Code (glbasic) Select
// --------------------------------- //
// Project: Particles
// Start: Friday, April 06, 2007
// IDE Version: 4.1da



FILLRECT 0,0,11,11, RGB(0xff, 0x00, 0x80)
DRAWLINE 0,5,10,5,RGB(0xff, 0x00, 0x00)
DRAWLINE 5,0,5,10,RGB(0xff, 0x00, 0x00)
GRABSPRITE 2,0,0,11,11


LOADSPRITE "Particles.png",1






WHILE TRUE
MOUSESTATE mx,my,b1,b2


// Auslöser, Bildindexnummer, anzahl der Particle, Delay in millisecunden
 p_particleshot(b1,1,3,100)

 

SPRITE 2,mx,my


PRINT getfps(),0,30
SHOWSCREEN
WEND
END


//--------------------------------------------------
//--------------------------------------------------
//--------------------------------------------------

FUNCTION p_particleshot:l_in,l_sprite,l_count,l_time

LOCAL l_shottime
STATIC s_time,s_temp

s_time = GETTIMERALL()

IF (s_time-s_temp) > l_time
s_temp = s_time
l_shottime = 1
ENDIF
STATIC s_counter = 0
STATIC   P AS Particle
STATIC  Particles[] AS Particle

IF l_in = 1   AND s_counter < l_count AND l_shottime = 1 // Partikel Array erzeugen
INC s_counter,1
P.x = mx
P.y = my//+RND(8)
DIMPUSH Particles[], P
ENDIF


IF l_in = 0 THEN  s_counter = 0

FOREACH Check IN Particles[]
DEC Check.y,3//RND(5)
// DEC Check.x, 3
SPRITE l_sprite, Check.x, Check.y
IF Check.x < 0 OR Check.y < 0 THEN DELETE Check
NEXT

PRINT s_counter,100,10
PRINT "Particles: "+BOUNDS(Particles[],0),100,30
PRINT l_in,100,50



ENDFUNCTION




TYPE Particle
x
y
ENDTYPE





FUNCTION getfps:

STATIC fps_time,fps_counter,fps,fps_temp
fps_time = GETTIMERALL()
fps_counter = fps_counter + 1
IF (fps_time-fps_temp)>1000
fps_temp = fps_time
fps = fps_counter
fps_counter = 0
ENDIF

RETURN fps
ENDFUNCTION
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

Ganz erhlich gesagt, finde ich es eh schrottig, types nach der hauptschleife aufzurufen.
Die gehören meiner meinung  nach am anfang vom Code hin . ;)

mach doch LOCAL s_time,s_temp

ich glaub eh  kaum das einer so seine Variablen handelt ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

D2O

Quote from: Schranz0rGanz erhlich gesagt, finde ich es eh schrottig, types nach der hauptschleife aufzurufen.
Die gehören meiner meinung  nach am anfang vom Code hin . ;)
Hi, ja das is so ne dumme angewohnheit die ich nicht mehr los werde :(
Als ich angefangen habe mit Programieren, hatte ich mich damals gleich an C/Cpp gewagt und da kamen dann halt immer
zuerst die,
Includes
Prototypen
Mainschleife
und erst dann die richtigen Functionen.

Quote from: Schranz0rmach doch LOCAL s_time,s_temp

ich glaub eh  kaum das einer so seine Variablen handelt ;)
Das geht nicht, wenn die Local sind, verlieren die nach den Functions aufruf
wieder ihren Status/wert.

Wenn Du dich auf das l_ und s_ beziehst, ja das ist auch sowas von mir.
l_ = Local
s_ = Static
T = Type
früher
f_ = functionen
m_ = methode
g_ global
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

s_time setzt Du ja nach jedem aufruf neu. Da reicht LOCAL.
s_temp ist (bevor Du es setzt ) = 0. Evtl:
STATIC s_temp = GETTIMERALL()
(das macht er nur bei 1. Aufruf)