Fliegende Kanonenkugeln (2D) von ???
[code:1:bab57b6e30]
AppTitle "Fliegende Kanonenkugeln"
; Richtung, Speed und Masse der Kugeln sind genauso einstellbar wie die Gravität.
; Der Wind dreht sich mit ebenfalls einstellbarer Windstärke.
;
; Ballphysikalisch angeregt durch einen Source Code von Jeppe Nielsen

Const bb=1024
Const hh= 768
Const bbb=bb/32
Const bbk=.5*bb;Standort der Kanone
Const hhk=.9*hh
Const bbr=.8*bb;Standort Windrose
Const hhr=.2*hh

windowsverzeichnis$= SystemProperty$("WINDOWSDIR")
doof = LoadSound(windowsverzeichnis$ +"mediair_begin.wav")
Global masse# = 1
Global speed# = 0
Global kraft# =10
Global gravitaet# = 0.05
Global windspeed# = 0.1
Global windrichtung#=90
Global winkel#
Global nK.Kugel
Global mx,my

Type Kugel
Field masse#
Field speed#
Field x#,y#
Field sx#,sy#
End Type


Graphics bb,hh,16,1

SetBuffer BackBuffer()

ClsColor 0,0,16

Repeat

Cls
mx=MouseX()
my=MouseY()
kraft#=Float(Sqr((bbk-mx)^2+(hhk-my)^2))/10
winkel#=ATan2(my-hhk,mx-bbk)
rtx=bbk+ bbb*Cos(winkel)
rty=hhk+ bbb*Sin(winkel)
ttx=bbk-2*bbb*Cos(winkel)
tty=hhk-2*bbb*Sin(winkel)
wkraft#=windspeed#*25
twx=bbr+ bbb*Cos(windrichtung)*wkraft#
twy=hhr+ bbb*Sin(windrichtung)*wkraft#

;die Kanone
KREIS(bbk,hhk,2,255, 0,0):LINIE(rtx,rty,ttx,tty,255, 0,0)

;die Windrose
Color 32, 32,0:Oval bbr-bbb*wkraft#,hhr-bbb*wkraft#,2*bbb*wkraft#,2*bbb*wkraft#
KREIS( mx, my,3,255,255,0):LINIE(bbr,hhr,twx,twy,255,255,0)

TEXTEMALEN()
TASTENDRUCK()
ALLESNEU()
ALLESMALEN()

If MouseDown(1) Then nK=KUGELNEU.Kugel(masse#,bbk,hhk,kraft#,winkel) : aua = PlaySound(doof)
; If Not ChannelPlaying(aua) Then aua = PlaySound(doof)

linksrechts=Int(Rnd(0,99))

If linksrechts<10 Then windrichtung#=windrichtung#+1 Else windrichtung#=windrichtung#-1
If windrichtung#< 0 Then windrichtung#=359
If windrichtung#>359 Then windrichtung#= 0

Flip

Until KeyDown(1)

End





Function KUGELNEU.Kugel(mm#,xx,yy,kk#,ww)

K.Kugel=New Kugel

Kmasse# =mm#
Kx =xx
Ky =yy
Kspeed# =kk#/mm#
Ksx# =Cos(ww)*Kspeed#
Ksy# =Sin(ww)*Kspeed#

Return K

End Function




Function ALLESNEU()

windx#=Cos(windrichtung#)*windspeed#
windy#=Sin(windrichtung#)*windspeed#

For K.Kugel=Each Kugel
Ksx# =Ksx#+(windx#/Kmasse#)
Ksy# =Ksy#+(windy#/Kmasse#)+gravitaet#
Kx# =Kx+Ksx#
Ky# =Ky+Ksy#

If Kx < -.5*bb Or Kx > 1.5*bb Or Ky < -.5*hh Or Ky > hh Then Delete K
; If Kx<0 Or Kx>bb Or Ky<0 Or Ky>hh Then Delete K
Next

End Function




Function ALLESMALEN()

For K.Kugel=Each Kugel
KREIS (Kx,Ky,Kmasse,255,255,0)
Next

End Function




Function TEXTEMALEN()

Color 255, 0,0: Text 10,10,"Kraft :"+Int(kraft#)
Text 10,25,"Winkel:"+Int(winkel#)
Text 10,40,"Masse :"+masse#
Color 0, 0,255: Text 10,110,"Kugeldicke:"
Text 10,125,"Cursor ho/ru"
Text bb-100,110,"Windstärke:"
Text bb-100,125,"Cursor li/re"
Text .45*bb,110,"Gravität"
Text .45*bb,125,"Bild ho/ru"
Text .4*bb,hh-50,"Dauerfeuer = Maus gedrückt halten"
Color 0,255, 0: Text .85*bb,10,"Windstärke :"+windspeed#
Text .85*bb,25,"Windrichting:"+Int(windrichtung#)
Color 255,255,0: Text .45*bb,25,"Gravität :"+gravitaet#

If nK<>Null Then Text 10,60,"Speed letzte Kugel: "+Sqr(nKsx#^2+nKsy#^2)

End Function




Function TASTENDRUCK()

If KeyDown(200) Then masse#=masse#+0.5
If KeyDown(208) Then masse#=masse#-0.5:If masse#<1 Then masse#=1
If KeyDown(201) Then gravitaet#=gravitaet#+0.01
If KeyDown(209) Then gravitaet#=gravitaet#-0.01
If KeyDown(203) Then windspeed#=windspeed#-0.001:If windspeed#<0 Then windspeed#=0
If KeyDown(205) Then windspeed#=windspeed#+0.001
If windspeed# > 0.192 Then windspeed# = 0.192

End Function




Function LINIE(x1,y1, x2,y2, r,g,b)

rgb = r*$10000 + g*$100 + b
dx = x2 - x1
dy = y2 - y1

If dx > 0 Then ddx = 1 Else ddx = -1
If dy > 0 Then ddy = 1 Else ddy = -1

LockBuffer BackBuffer()

If Abs(dy) < Abs(dx) Then
fehler = -Abs(dx)
delta = 2*Abs(dy)
schwelle = 2*fehler
While x1 <> x2
WritePixelFast x1, y1, rgb
fehler = fehler + delta : x1 = x1 + ddx
If fehler > 0 Then fehler = fehler + schwelle : y1 = y1 + ddy
Wend
Else
fehler = -Abs(dy)
delta = 2*Abs(dx)
schwelle = 2*fehler
While y1 <> y2
WritePixelFast x1, y1, rgb
fehler = fehler + delta : y1 = y1 + ddy
If fehler > 0 Then fehler = fehler + schwelle : x1 = x1 + ddx
Wend
EndIf
WritePixelFast x2, y2, rgb

UnlockBuffer BackBuffer()

End Function




Function KREIS(x,y,Radius,r,g,b)

rgb = r*$10000 + g*$100 + b

Local dx = 0
Local dy = Radius
Local dr = 3 - (Radius Shl 2)

While dx < dy
WritePixel x+dx,y+dy,rgb: WritePixel x+dx,y-dy,rgb: WritePixel x-dx,y+dy,rgb: WritePixel x-dx,y-dy,rgb
WritePixel x+dy,y+dx,rgb: WritePixel x+dy,y-dx,rgb: WritePixel x-dy,y+dx,rgb: WritePixel x-dy,y-dx,rgb

If dr < 0 Then dr = dr + (dx Shl 2) + 6 Else dr = dr + ((dx-dy) Shl 2) + 12: dy = dy - 1
dx = dx + 1
Wend

If dx = dy Then WritePixel x+dx,y+dy,rgb: WritePixel x+dx,y-dy,rgb: WritePixel x-dx,y+dy,rgb: WritePixel x-dx,y-dy,rgb

End Function
[/code:1:bab57b6e30]
===
..... von ???
Hmmm..Komisch. Konnte es nicht testen. Habe Code Kopiert und der Fügt es ziemlich falsch ein in BB.Scheint wohl probleme mit Variablen nach ":" zu geben. Aber so auf den ersten Blick auf den Code ist mir aufgefallen das du z.b. Plot benutzt. Das ist recht lahm, ziehe WritePixelFast in erwägung.
bye
===
von ???
problem ist hoffentlich behoben, da waren smileys drin
===
.... von ???
Ja, nun klappt es. Netter Source, gefällt mir.
bye
===
von ???
Wäre halt nicht schlecht wenn du den source zwischen code tags stellen würdest!
===
von ???
Code ist leicht überarbeitet (writepixel statt plot).
writepixelfast würde nur gehen, wenn man den Kugelschweif radikal abschneidet, sobald er an den Rand kommt. Und das sähe dann ziemlich doof aus...
===
von ???
Junge, wieso machst du die Code-Tags wieder weg?

*grummel* - ihr macht einem aber auch Arbeit...
===
von ???
sorry, den (code)-tag hatte ich übersehen; ich hab jetzt noch mal etwas mehr Struktur reingebracht, diesmal ohne den tag zu überschreiben.



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: