Einfalls- = Ausfallswinkel am Kreis

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Mr Hopp

Betreff: Einfalls- = Ausfallswinkel am Kreis

BeitragFr, Apr 14, 2006 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Weiß jemand, wie man Einfalls- = Ausfallswinkel an einer Rundung machen kann? Ich habe ein Image, welches wie eine Schablone das Spielfeld begrenzt, stößt nun der Ball an eine Bande....wie berechne ich den neuen winkel? Confused

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Apr 15, 2006 3:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du anstelle des Images eine Vekorisierung der Kannten vornimmst, könnte man auch den Winkel ausrechnen. Aber so?!? Falls du B3D haben solltest, dann kann man es da auch ganz einfach machen...

x-pressive

BeitragSa, Apr 15, 2006 8:39
Antworten mit Zitat
Benutzer-Profile anzeigen
lol Smile hectic, deine Antwort ist irgendwie so vage wie "Wenn du fahren möchtest, kannst du dir ein Auto bauen". Das hilft ihm auch nicht weiter. Mich würde das Thema "Vektorisierung von Kanten" aber auch interessieren, da man damit wirklich nützliche Dinge anstellen kann. Wer weiss hier denn etwas mehr zu diesem Thema bzw. kennt eine gute Website zu diesem Thema?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Apr 15, 2006 9:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, nagut. Hier mal ein Ausschnitt meines aktuellen Projektes:

Code: [AUSKLAPPEN]
a) If CountCollisions(schiff)>0 Then
b)  nx#=CollisionNX(schiff,1)
c)  ny#=CollisionNY(schiff,1)
d)  w1=ATan2(yg,xg)
e)  w2=ATan2(ny,nx)
f)  w3=180+(w2*2)-w1
g)  speed#=Sqr(xg^2+yg^2)/2
h)  xg=Cos(w3)*speed
i)  yg=Sin(w3)*speed
j)  xp=xpa
k)  yp=ypa
l) End If

a) Wenn Kollision, dann soll neuer Ausstrittswinkel berechnet werden.
b) +c) Kollisionskoordinate relativ vom Bezugspunkt.
d) Rechnet aus der Schiffsgeschwinigkeit (xg, yg) den Flugwinkel aus =w1.
e) Rechnet aus der Relation Bezugspunkt/Kollisionskoordinate den Winkel aus =w2.
f) Hier wird aus w1 und w2 der neue Flugwinkel berechnet =w3.
g) Rechnet die vorherige Geschwindigkeit ala pythagoras aus und halbiert sie (Abprallwiederstand) =speed.
h) +i) Rechnet die neue Fluggeschwindigkeit (xg, yg) aus und setzt sie auch gleich zur 'Runtimeverarbeitung'.
j) +k) Setzt das Schiff an eine Position, bevor es eine Kollision gab.
l) Ende der Geschichte.

Dieses ist aber (wie man auch schon an den Befehlen sehen kann) nur für B3D als 2D Behandlung. Ob es einen kürzeren Weg zur Berechnung gibt, weiß ich nicht. Für 2D müsste eventuell unter 'f)' nicht 180+ sondern vielleicht 90+ stehen, je nachdem wie die Winkel der Vektorlinien ausgelesen werden. Das oben genannte Beispiel ist vergleichbar mit der Grafik des Spieles 'Soldat' (oder wie auch immer es heissen mag)...

x-pressive

BeitragSa, Apr 15, 2006 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessant -die Umsetzung in 3D ist eigentlich gar nicht so kompliziert. 2D wäre wohl schwieriger, da man hier kein Modell zur Hand hat und die Vektoren ja irgendwie "editieren" oder erstellen muss.

Was mich nämlich schon seit Worms interessiert: könnte man denn z.B. für ein 2D-Spiel anhand einer schwarz-weissen "Schablone" der Landschaft (Landschaft = weisse Flächen, Hintergrund = schwarz) eine automatische Vektorisierung vornehmen, um dann das "Vektorbild" auf Kollisionen zu prüfen, anstatt direkt auf Pixel zu checken? So könnte man z.B. auch ein nettes Pinball-Programm etc. schreiben.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

Mr Hopp

BeitragSa, Apr 15, 2006 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber "Vektoren" sagen mir leider gar nichts Laughing

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Apr 15, 2006 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Vektoren sind Bezugspunkte in einem Koordinatensystem. Man rechnet nur anhand eines Koordinatensystems zB in 2D oder auch 3D... Wenn man Vektorgrafiken zeichnen möchte, so muß jede Start- und Endposition einer Linie oder einer Kurve angegeben werden (zB x1=100, y1=10, x2=400, y2=340). Also so wie mit 'Line 100,10,400,340' <--- auch eine Vektordarstellung. Da man die Koordinaten der Start- und Endpositionen kennt, kann man anhand dieser den Winkel des Vektors ausrechnen. In 2D ist allerdings das Problem, daß man recht aufwändig eine Vektorkollision ausrechnen muß. In 3D dagegen, kann man sich die 3D-Engine zu nutze ziehen und mit 3D schöne 2D Grafiken zeichnen... Eine aufwändige Kollisionsabfrage entfällt, genauso wie das aufwendige berechnen des Kollisionswinkels...

Siehe dazu auch: http://de.wikipedia.org/wiki/Vektor
 

BIG BUG

BeitragSo, Apr 16, 2006 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
zum Thema Vektorisieren:
Habe hier mal was gebastelt, wo ein Ball von einem Pixelbild abprallt. Dazu werden bei einer Kollision einfach eine Reihe Pixel in Flugrichtung "abgeschossen" und bei einem Treffer mit der Wand deren Position gespeichert. Daraus wird dann der Winkel errechnet. Ist aber noch nicht ganz ausgereift:
www.mein-murks.de/quellcode/testkoll.zip
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Spikespine

BeitragDi, Apr 18, 2006 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
hab mal einen Code geschrieben ganz ohne Vektorisieren und Krams. Bin mir jezt aber gar nicht mehr sicher ob es völlig korrekt ist, sieht für mich auf jedenfall so aus!
Code: [AUSKLAPPEN]
Graphics 800,600,32,2

;Mittelpunkt des Spielfeldkreises
Const Kreis_MX = 400
Const Kreis_MY = 300
;Radius:
Const Kreis_r = 200

Kreis_Image = CreateImage(Kreis_r*2,Kreis_r*2)
SetBuffer ImageBuffer(Kreis_Image)
Oval 0,0,Kreis_r*2,Kreis_r*2,0
MidHandle Kreis_Image

Ball_Image = CreateImage(10,10)
SetBuffer ImageBuffer(Ball_Image)
Oval 0,0,10,10
MidHandle Ball_Image

ball_x# = 500
ball_y# = 300
ball_richtung# = 90;Grad
ball_v# = 3.0 ;Geschwindigkeit





SetBuffer BackBuffer()

Repeat
   Cls
   
   
   ball_x# = ball_x# + Cos(ball_richtung) * ball_v#
   ball_y# = ball_y# - Sin(ball_richtung) * ball_v#
   

   If ImagesCollide(Ball_Image,ball_x#,ball_y#,0,Kreis_Image,Kreis_MX,Kreis_MY,0) Then
      wa# = (ATan2(ball_x#-Kreis_MX,ball_y#-Kreis_MY)+360) Mod 360
      Local bnr# = 2*(wa#+180)-ball_richtung
      ball_richtung# = bnr
   EndIf

   
   DrawImage Ball_Image,ball_x#,ball_y#
   
   DrawImage Kreis_Image,Kreis_MX,Kreis_MY
   

   Flip
Until KeyHit(1)
End
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Apr 18, 2006 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@BIG BUG, dein Code ist, bis auf sehr selten auftrettenden Fehlberechnungen, sehr gut. Super Leistung. Daraus kann man schon ein sinnvolles Spiel mit aufbauen.

@Spikespine, dein Code funktioniert leider nur in einem Kreis. Schon die Änderung zu einem Oval wird es nicht mehr richtig berechnet.

Hätte noch eine mögliche Idee zur Problemlösung. Man könnte auch ein Image nehmen und für jeden 2er Grad-Schritt eine andere Farbe an der Kante legen. Dieses Bild müsste natürlich vorberechnet werden und separat behandelt werden. Wenn ein Objekt dann mit einem Bild kollidiert, wird dann die Farbe ermittelt und daraus der Winkel ausgelesen.

zB Farbe 0 = 0°, Farbe 128 = 180°, Farbe 255 = 358°... Die Lösung von BIG BUG ist aber sicherlich besser und professioneller.

Spikespine

BeitragDi, Apr 18, 2006 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
edit...
Doch, in der überschrift steht Kreis!!
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group