bild von linie(bild)Abprallen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mas93

Betreff: bild von linie(bild)Abprallen

BeitragSo, Nov 11, 2007 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 11, 2007 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 11, 2007 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will doch garkeine gerade linie^^
Das ist Absicht!

mfg
mas93
www.lpbase.de
Meine Linkin Park Fanseite[Noch im Aufbau]

Tankbuster

BeitragSo, Nov 11, 2007 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
oder Willst du aufeinmal ne kurve oder was? 0.o
Twitter
Download Jewel Snake!
Windows|Android

darth

BeitragSo, Nov 11, 2007 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 11, 2007 17:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
user posted image


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

BeitragSo, Nov 11, 2007 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 17, 2007 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSa, Nov 17, 2007 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
... 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

BeitragSo, Nov 18, 2007 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 18, 2007 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 18, 2007 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 18, 2007 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 18, 2007 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 18, 2007 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

mas93

BeitragSo, Nov 18, 2007 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm, ok Ich hab mir auch gedacht, dass man das Spielprinzip so machen könnte:

user posted image
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]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 18, 2007 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 18, 2007 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSo, Nov 18, 2007 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 18, 2007 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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]

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group