fb:porticula NoPaste
Murmeltest
Uploader: | Muttonhead |
Datum/Zeit: | 05.04.2009 21:21:44 |
'mein erster Versuch einem Programm eine gewisse "Objektorientiertheit" beizubiegen
screen 19,32
const as integer ctrlx=400
const as integer ctrly=300
const as double pi=3.1415926535897932
const as integer maxspeed=10
const as integer maxradius=300
const as integer inertia=256
'Klassendefinition ************************************************************
type ballclass
'die Klasseneigenschaften
xpos as single
ypos as single
vx as single
vy as single
xold as integer
yold as integer
vxold as single
vyold as single
img as integer ptr
'Kon-/Destruktoren deklarieren
declare constructor
declare constructor(filename as string)
declare destructor
'Methoden deklarieren
declare sub initvalues
declare sub calcposition (mx as integer,my as integer)
declare sub drawball
declare sub outputvalues
end type
'Kon-/Destrukor
constructor ballclass
xpos=0
ypos=0
vx=0
vy=0
xold=int(xpos)
yold=int(ypos)
img=imagecreate(41,41)
end constructor
constructor ballclass(filename as string)
xpos=0
ypos=0
vx=0
vy=0
xold=int(xpos)
yold=int(ypos)
img=imagecreate(41,41)
bload filename,img
end constructor
destructor ballclass
xpos=0
ypos=0
vx=0
vy=0
xold=int(xpos)
yold=int(ypos)
imagedestroy img
end destructor
'Methoden
sub ballclass.initvalues
xpos=ctrlx
ypos=ctrly
vx=0
vy=0
xold=int(xpos)
yold=int(ypos)
end sub
sub ballclass.calcposition (mx as integer,my as integer)
dim as integer xcoord,ycoord
dim as single radius,angle
xcoord=mx-ctrlx
ycoord=(my-ctrly)*-1
radius=sqr(xcoord*xcoord + ycoord*ycoord)'Pythagoras
angle=asin(ycoord/radius)/(2*pi)*360 'I.Quadrant
if sgn(xcoord)<1 then
angle=180-angle 'II. und III.Quadrant
else
if sgn(ycoord)<0 then angle=360+angle ' IV. Quadrant
end if
if radius>maxradius then radius=maxradius
'Jetzt kommt der Teil mit Pseudophysik
'das Ganze hat nun so überhaupt nichts mit Bewegungen
'von Körpern auf schiefen Ebenen zu tun
'aber in irgend einem Paralleluniversum... vielleicht
'Geschwindigkeit/Versatz berechnen
if xcoord<>0 then vx = cos(2*pi/360*angle) * radius/maxradius*maxspeed else vx=0 ' Koordinate(0,ycord) muss abgefangen werden
if ycoord<>0 then vy = sin(2*pi/360*angle) * radius/maxradius*maxspeed else vy=0 ' Koordinate(xcord,0) muss abgefangen werden
'Pseudoträgheit ;)
vx=(vx+inertia*vxold)/(inertia+1)
vy=(vy+inertia*vyold)/(inertia+1)
'auf alte Position Versatz addieren
xpos +=vx
ypos -=vy 'Umkehrung wegen Screenkoordinatensystem
'alte Geschwindigkeit merken, wird für Trägheit benötigt
vxold=vx
vyold=vy
end sub
sub ballclass.drawball
circle (xold,yold),10,&H000000
xold=int(xpos)
yold=int(ypos)
circle (int(xpos),int(ypos)),10,&HFFFFFF
end sub
'Klassendefinition Ende *******************************************************
dim ball as ballclass ptr
ball=new ballclass
dim as integer mousex,mousey
if ball then
ball->initvalues
do
getmouse (mousex,mousey)
ball->calcposition mousex,mousey
screenlock
pset (ctrlx,ctrly),&HFFFFFF
ball->drawball
screenunlock
sleep 1
loop until inkey<>""
delete ball
end if
end