psygate
Anmeldungsdatum: 05.04.2005 Beiträge: 304 Wohnort: Wien und der Computer
|
Verfasst am: 05.04.2010, 02:58 Titel: Minimale SDL Anwendung |
|
|
Ich hab mal eine Miniatur Particle Engine in SDL geschrieben. Einfach ausprobieren. Wollte sie nur kurz vorstellen. Achja, den Code säubern, ja ja, das muss ich noch machen
Steuerung: Maustasten (Links, Rechts, Mittelbutton) und Mausbewegung
Code: |
#include "SDL\SDL.bi"
#include "SDL\SDL_gfx_primitives.bi"
#include "SDL\SDL_mouse.bi"
dim shared video as SDL_Surface PTR
dim shared event as SDL_Event
#define xmax 640
#define ymax 480
#define numberOfParticles 500
#define pi atn(1)*4
#define lines 0
#define bounce_factor -0.3
#undef color
declare function sign(x as integer) as integer
function sign(x as integer) as integer
return abs(x)/x
end function
type pixel
dim as double x,y,ox,oy
dim as double vx,vy
dim as double dx,dy
dim as integer r,g,b
dim as double fade
dim as double dfade
end type
randomize timer
function rand(x as integer) as integer
return int(rnd*x)+1
end function
dim dot(numberOfParticles) as pixel
dim angle as double
dim as double tempvx,tempvy,sqrt
const fliptime = 1/30
dim as double stepper
dim as integer i,xp,yp,xm,ym,j,a,b,mousex,mousey,button,rbuffer,gbuffer,bbuffer,relativmousex,relativmousey
dim as uinteger round
dim as string key
const maxDistance = 255/sqr((xmax/2)^2+(ymax/2)^2)
dim as string Window_Name = "Little Sprinkler", Icon_Name = "Little Sprinkler"
xm = int(rnd*xmax+1)
ym = 0
for i=0 to numberOfParticles-1:
with dot(i)
.x = xm+(-1)^(rand(2))*100*rnd
.y = ym+(-1)^(rand(2))*100*rnd
angle = rnd * 2 * pi
.vx = cos(angle)
.vy = sin(angle)
.dx = rnd* (-1)^(rand(2))*0.01
.dy = 1'rnd* (-1)^(rand(2))*0.01
.r = rand(256)
.g = .r'rand(256)
.b = .g'rand(256)
.fade = 255
.dfade = rnd*2
.ox = .x
.oy = .y
end with
next
'screenres xmax,ymax,32,,&H40
video = SDL_SetVideoMode(xmax,ymax,32, SDL_HWSURFACE or SDL_DOUBLEBUF or SDL_HWACCEL or SDL_RLEACCEL)
SDL_WM_SetCaption(@Window_Name,@Icon_Name)
stepper = timer
while 1
boxRGBA(video,0,0,xmax-1,ymax-1,0,0,0,128)
round += 1
if round = 2^32-1 then round = 0
if (round mod 1 = 0) then ym += 1
if ym = ymax then ym = 0: xm = int(rnd*xmax+1)
for i = 0 to numberOfParticles-1:
with dot(i)
SDL_PollEvent(@event)
SDL_GetMouseState(@mousex,@mousey)
circleRGBA(video,mousex,mousey,10,255,0,0,2)
rbuffer = .r : gbuffer = .g : bbuffer = .b
if event.type = SDL_MOUSEBUTTONDOWN then
select case event.button.button
case SDL_BUTTON_LEFT:
.dx = (mousex-.x)*0.0001
.dy = (mousey-.y)*0.0001
.r = (mousex-.x)
.b = (mousey-.y)
case SDL_BUTTON_RIGHT:
.dx = (mousex-.x)*-0.0001
.dy = (mousey-.y)*-0.0001
.r = (mousex-.x)
.b = (mousey-.y)
case SDL_BUTTON_MIDDLE:
sqrt = sqr((mousex-.x)^2+(mousey-.y)^2)
if sqrt < 100 then
.r = int(2.55*sqrt)
.g = 0
.b = 255-int(2.55*sqrt)
if .vy > 0.5*sqrt/100 then .vx*=0.75*abs(.vx)/.vx
if .vy > 0.5*sqrt/100 then .vy*=0.75*abs(.vy)/.vy
end if
end select
elseif event.type = SDL_KEYDOWN then
if event.key.keysym.sym = SDLK_ESCAPE then
SDL_QUIT
end
end if
elseif event.type = SDL_EXIT then
SDL_QUIT
end
end if
select case lines
case 1:
lineRGBA(video,.x,.y,.ox,.oy,.r,.g,.b,.fade)
case 0:
pixelRGBA(video,.x,.y,.r,.g,.b,.fade)
circleRGBA(video,.x,.y,5,.r,.g,.b,.fade xor &hff)
end select
.r = rbuffer : .g = gbuffer : .b = bbuffer
.ox = .x: .oy = .y
.fade -= .dfade
if (.fade < 0) or (abs(.x) > 2*xmax) or (abs(.y) > 2*ymax) then
newer:
if (xm = -1) or (ym = -1) then
.x = xmax/2
.y = ymax/2
else
.x = xm
.y = ym
end if
angle = rnd * 2 * pi
.vx = cos(angle)
.vy = sin(angle)
.dx = rnd* (-1)^(rand(2))*0.01
.dy = rnd* (-1)^(rand(2))*0.01
.r = rand(256)
.g = .r 'rand(256)
.b = .g 'rand(256)
.fade = 255
.dfade = rnd
.ox = .x
.oy = .y
end if
'if i = 0 then print .fade
.x += .vx
.y += .vy
.vx += .dx
.vy += .dy
end with
next
'Blend with black:
if timer-stepper > fliptime then
SDL_Flip(video)
stepper = timer
end if
wend
SDL_QUIT()
|
Und jo, ich bin zurück nach vielen Jahren der Abwesenheit.  _________________ Danke an Volta für seine großartige MMX_fade function. *verneig*
Personal-DNA:
<script src="http://personaldna.com/h/?k=qtrCFboSuCOpFrX-OI-AADBA-f78d&t=Free-Wheeling+Leader">
</script>
Zitat: | Das Forum für den zum QBASIC kompatieblen open soure FreeBasic Kompiler. | by DJ. Peters |
|