bild von linie(bild)Abprallen
Übersicht

![]() |
mas93Betreff: bild von linie(bild)Abprallen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Leute,
Ich habe eine Frage, und zwar: Ich möchte, dass ich mit der maus irgendetwas zeichnen kann und dann ein Ball daran abprallt. Also so wie bei Ping pong. Nur das man eben irgendwelche linien zeichnen kann. Ich habe es so versucht, alerdings funktioniert es nicht richtig. DIe Kollisionen sind nicht gut und der Winkel usw auch nicht gerade schön. Wie kann ich das verbessern oder anders machen? Code: [AUSKLAPPEN] Graphics 500,600,32,2 SetBuffer BackBuffer() Global ink=LoadImage("ink.png") MaskImage ink,255,0,255 Global feldred=LoadImage("feldred.png") Global ball=LoadImage("ink.png") MaskImage ball,255,0,255 Type line Field x,y Field nummer End Type Global number Global winkel=10 Global x=100,y=100 Global x_speed=Cos(winkel)*1 Global y_speed=Sin(winkel)*1 timer=CreateTimer(60) Repeat WaitTimer(timer) Cls If MouseDown(1) Then createline() updateball() drawline() ;------------FPS------------- FPScount = FPScount + 1 If MilliSecs() > lastcheck+1000 fps = fpscount fpscount = 0 lastcheck = MilliSecs() End If If vorlast<fpscount Then vorlast=fpscount Text 20, 20,"FPS: "+ vorlast Flip 0 Until KeyHit(1) Function createline() l.Line=New line l\x=MouseX() l\y=MouseY() l\nummer=number End Function Function drawline() For l.Line=Each line DrawImage ink,l\x,l\y Next End Function Function updateball() If winkel<0 Then winkel=360 If winkel>360 Then winkel=0 x_speed=Cos(winkel)*1 y_speed=Sin(winkel)*1 x=x+x_speed y=y+y_speed For l.Line=Each line If ImagesCollide(ball,x,y,0,ink,l\x,l\y,0)Then winkel=winkel-90 Next DrawImage ball,x,y End Function wäre nett wenn ihr mir helfen könntet. mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
abstand punkt - linie...
wann lernt die welt endlich dass man grundschülern schon vektorgeometrie beibringen sollte :O also hier: Code: [AUSKLAPPEN] Eine Linie ist definiert durch Start und Endpunkt.
Daraus bildet sich ein Vektor, der wie folgt aussieht: vx=endx-startx vy=endy-starty vz=0 ;2d um davon die Normale zu erhalten, Kreuzmultipliziere man es mit dem Vektor: (0 / 0 / 1) das ergibt folgenden resultatsvektor: vx=endy-starty vy=startx-endx Abstand von Punkt und Gerade ergeben sich nun aus der HNF (Hessesche Normal Form): Da der Vektor noch verschoben sein kann muss ein D eingefügt werden: vd=-vx*startx-vy*starty d=(vx*punktx+vy*punkty+vd)/sqr(vx^2+vy^2) ist dieser Abstand nun kleiner als der Radius, dann muss der Ball reflektiert werden, weil er gegen die Gerade prallt. Wohin und wie - das ist eine andere Sache (und komplexer). hf... |
||
Diese Signatur ist leer. |
- Zuletzt bearbeitet von darth am So, Nov 11, 2007 15:27, insgesamt einmal bearbeitet
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich will doch garkeine gerade linie^^
Das ist Absicht! mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: ist dieser Abstand nun kleiner als der Radius, dann muss der Ball reflektiert werden, weil er gegen die Gerade prallt.
Zitat: Ich will doch garkeine gerade linie^^
hihi ich glaube du hast da was falsch verstanden ![]() oder Willst du aufeinmal ne kurve oder was? 0.o |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
wtf??
du schreibst du willst etwas von linien abprallen lassen... und genau das wird oben geschehen -.- selbst wenn du irgendwelche krumme linien hast, werden die wohl aus einzelnen geraden stücken bestehen, und dann kannst du das dort einsetzen. und falls nicht: STELL DEINE FRAGE KLARER! |
||
Diese Signatur ist leer. |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi, ja die frage war n bisschen blöd gestellt.
Ich meine, dass man einfach mit der maus IRGENDETWAS zeichnen kann und dass dann die kugel daran abprallt. z.B.: Sowas: Ich habe also in meinem code gemacht, dass immer wenn die maustaste gedrückt ist, ein kleines Bild an der mausposition gemalt wird. Dieses habe ich dann über images collide abgefragt. Gibt es da keine besserer Lösung? mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie ich sagte:
selbst sowas wird aus kurzen stücken von geraden linien dargestellt! speichere die einzelnen stücke in einem type und lass sie dann alle abfragen... Code: [AUSKLAPPEN] type linie
field startx field starty field endx field endy end type while not keyhit(1) if mousedown(1) then if millisecs()-timer>100 then l.linie=last linie tmpx=l\endx tmpy=l\endy l.linie=new linie l\startx=tmpx l\starty=tmpy l\endx=mousex() l\endy=mousey() timer=millisecs() endif endif for l.linie=each linie line l\startx,l\starty,l\endx,l\endy abprallalgo next flip 0 : cls wend : end ich hab dein code nicht angeschaut (werde ich auch nicht) ... aber die lösung die ich gesagt habe PASST, du muss sie nur richtig einbauen, und das ist nun wirklich nicht allzuschwer -.- |
||
Diese Signatur ist leer. |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Darthgamer: Das ist mir schon klar, nur wie soll ich jetzt die Kollision an der linie abfragen? | ||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
... was man hier so ein bisschen im hintergrund hört ist mein schrei. ein schrei der wut, jawoll! ich bin sauer. ziemlich sauer.
wieso das? nun, weil ich die antwort schon einmal gegeben habe. abstand punkt - linie (man lese den post vom november dem 11.). wenn dieser abstand (dessen berechnung ich schritt für schritt erklärt habe!) berechnet und auf einen wert kommt der kleiner als der radius des balles ist, wird der ball natürlich abprallen. ich werde NICHT die beiden codeteile zusammenbauen, es steht alles da LIES NACH und VERSTEHE dann PROGRAMMIER es und sei zufrieden. |
||
Diese Signatur ist leer. |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok danke, hat nun funktioniert.
Jetzt hab ich nur Probleme mit dem Abprallalgo. Ich wollte das eigentlich genausomachen wie bei den tiles im lvl auch, aber leider funktioniert das nicht. Der Ball bleibt dann immer stehen. Habt ihr eine Idee, wie ich das behen oder anders machen kann? Also ich will, dass mein ball an den Koordinaten x und y an der Linie abprall(x_spped +y_speed Umkehre) Wie mache ich das am besten? mfg mas93 Code: [AUSKLAPPEN] Function updateball()
altx=x alty=y x#=x#+x_speed# ;Links oder rechts kollidierr? For ax=0 To 20 For ay=0 To 20 If lvl1(ax,ay)>1 Then If ImageRectCollide(ball,x,y,0,ax*25,ay*25,25,25)Then x_speed#=x_speed*-1;+Rnd(0.0,0.3) x=altx EndIf Next Next For l.Line=Each line If l\d>-15 And l\d<15 Then x_speed#=x_speed*-1;+Rnd(0.0,0.3) x=altx EndIf Next y#=y#+y_speed# ;Oben oder unten kollidiert? For ax=0 To 20 For ay=0 To 20 If lvl1(ax,ay)>1 Then If ImageRectCollide(ball,x,y,0,ax*25,ay*25,25,25)Then y_speed#=y_speed*-1;+Rnd(0.0,0.3) y=alty EndIf Next Next For l.Line=Each line If l\d>-15 And l\d<15 Then y_speed#=y_speed*-1;+Rnd(0.0,0.3) y=alty EndIf Next |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Abprallwinkel eines bestehenden Vektors habe ich mal gemacht. Hier ein Codeausschnitt davon (Es sind zwar z.T. 3D-Befehle drin, aber das Ergebnis ist auf rein 2D ausgelegt):
Code: [AUSKLAPPEN] Local NX#,NY#,XG#,YG#,XP#,YP#
Local W1#,W2#,W3#,XPA#,YPA#,Speed# If CountCollisions(Objekt) Then NX=CollisionNX(Objekt,1) NY=CollisionNY(Objekt,1) W1=ATan2(YG,XG) W2=ATan2(NY,NX) W3=180+(W2*2)-W1 Speed=Sqr(XG^2+YG^2)/2 XG=Cos(W3)*Speed YG=Sin(W3)*Speed XP=XPA YP=YPA End If NX#,NY# - Kollisionsvektor ausgehend vom Objekt XG#,YG# - Geschwindigkeitsvektoren vom Objekt XP#,YP# - Positionskoordinatem vom Objekt W1#,W2#,W3# - Hilfsvariablen zur besseren Übersicht XPA#,YPA# - Alte Positionskoordinaten bevor eine Kollision statt gefunden hat Speed# - Neue unaufgelöste Geschwindigkeit vom Objekt |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen dank Hectic für deine Schnelle Antwort.
Leider verstehe ich sogut wie nicht was der code bezweckt, da ich mich mit Vektorzeugs überhaupt nicht auskenne. Es wäre sehr nett wenn du deinen code noch etwas genauer erklären könntest, z.B.: Wie berechne ich die vektoren usw(Oder sind das einfach nur die X und Y koordinaten??) mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
NX und NY ist bei mir der Kollisionsvektor, der bei dir resultierend des Winkel der kollidierenden Linie ist.
W1, W2 und W3 sind nur Hilfsvariablen zur besseren Übersichtlichkeit des ganzen. Ergibt sich also kein Unterschied. Speed sollte klar sein. Ist die allgemeine Geschwindigkeit des Balles der zukünftig bestehen soll, da kybernetische Energie bei einem Aufprall ja bekanntlich in z.T. Wärme umgewandelt wird. XG und YG ist die zukünftige aufgelöste Geschwindigkeit des Balles. Also bereits auf X und Y aufgelöst. XP und YP ist die Position deines Balles. Die muss vor der Weiterführung des Programmcodes nach jeder Kollision gemacht werden, da es sonst zu Rundungsfehlern kommen kann die dazu führen, dass der Ball (bei 2D-Berechnung) auf immer und ewig innerhalb einer Kollision stecken bleibt. - Was du also machen musst ist, nach einer Kollision mit der geschwungenen Linie das Einzelstück finden, mit welchen tatsächlich der Ball kollidiert. Dieses Teilstück hat ja nun auch einen Winkel denn du anhand des Start- und Endpunktes bestimmen kannst. Dieser Winkel wäre bei dir dann auf meinem Code auf die Variablen NX und NY anzuwenden. Es kann allerdings sein, dass der Winkel in deinem Fall +90° oder -90° noch umgerechnet werden muss. edit1: Zitat: Wie berechne ich die vektoren usw(Oder sind das einfach nur die X und Y koordinaten??)
Ja, ein Vektor ist die Koordination mithilfe mehrerer Variablen. So ist XSpeed#=2.4 und YSpeed#=1.0 ein Vektor der eine Steigung von 1.0 hat und dabei um 2.4 Einheiten nach rechts wandert. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm, ok.
Also ich habe jetzt beschlossen keine geschwungene Linie zu machen, sondern dass man nur eine gerade linie immer machen kann. Soo, jetzt habe ich ja start und endpunkt. Da muss ich jetzt den winkel berechnen(Das find ich bestimmt ne lösung wie ich das berechne) aber was meinst du mit: Dieser Winkel wäre dann auf die Variablen NX und NY anzuwenden? Tut mir leid, ich muss sovile fragenstellen, da ich komplett neu auf diesem Gebiet bin... btw.:Oder hast du ICQ oder MSN dann können wir das da schneller klären... Danke für deine Geduld mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
HyDr0x |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du komplett neu bist kann ich nur sagen lass es sein. Das ist Stoff von 11./12. Klasse Mathe. Dat lernst du schon noch ![]() |
||
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm, ok Ich hab mir auch gedacht, dass man das Spielprinzip so machen könnte:
also, dass man die grünen steine so platzieren muss, dass der ball ins ziel kommt. Das werde ich jetzt wahrscheinlich auch so umsetzen. Nur das alleine wäre langweilig. Hättet ihr ne idee wie ich dieses Grund Spielgerüst noch interessanter machen könnte? mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: ..., dass man die grünen steine so platzieren muss, dass der ball ins ziel kommt.
Falls es nur so Steine zu zeichnen geben soll, so kannst du dir auch den ganzen Vektorenkramm sparen und es durrch einfache Negation erledigen. Natürlich nur, wenn es keine Schrägen mehr gibt. Prallt zB der Ball oben oder unten gegen eine Wand so wird die Y-Achse negiert: YSpeed=-YSpeed usw... |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Hectic: Ich weiss, so habe ich es ja bisher gemacht.
Das ist auch die einfachste und beste Lösung. Aber hat noch jemand ne idee wie ich das noch interessanter machen könnte? Ich habe mir überlegt, dass man z.b: ->Begrenzte Steine hat ->Und der Ball z.b maximal 10 mal abprallen darf oder so Aber da fehlt noch etwas... mfg mas93 |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
HyDr0x |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mach sich bewegende Hindernisse rein. Du kannst das mit den 10 mal abprallen auch so lösen indem du dem Ball eine Bestimmte Geschwindigkeit gibst die er immer mehr verliert, das würde eventuell interresanter sein. | ||
![]() |
mas93 |
![]() Antworten mit Zitat ![]() |
---|---|---|
hey, sehr gute ideen!
Die hindernisse müssen dann halt auch rechteckkig sein, aber das macht ja nichts... mfg mas93 Es sind natürlich immer noch weitere ideen gesucht^^ |
||
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau] |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group