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:
// --------------------------------- //
// 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
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 ;)
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
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)