Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Murmeltest

Uploader:MitgliedMuttonhead
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