Seite 1 von 2

Logik Problem

Verfasst: 14.08.2009 18:38
von X360 Andy
Moin

Ich hänge gerade bei einer kleinen Animation fest....

Bild

Blauer Rahmen = Screen
Roter Punkt = Kugel
Pfeil = Bewegungs richtung
Zahlen = X / Y Achse


_________________________________
Ich möchte also das die Roten Punkte immer außerhalb meines Screen respwanen.

Das ist soweit auch kein Problem.

Code: Alles auswählen

Bullet()\z.l = Random(3)
  
  If Bullet()\z.l = 0
    Bullet()\x.l = Random(640)
    Bullet()\y.l = -100

  ElseIf Bullet()\z.l = 1
    Bullet()\x.l = Random(640)
    Bullet()\y.l = 740

  ElseIf Bullet()\z.l = 2
    Bullet()\x.l = -100
    Bullet()\y.l = -Random(640)
   
  ElseIf Bullet()\z.l = 3
    Bullet()\x.l = 740
    Bullet()\y.l = -Random(640)

  EndIf
Damit sind ja alle Kugeln überall außerhalb des Screen verteilt.

Nun kommt aber die Bewegung ins Spiel.

Das ganze soll aber Zufählig ablaufen, sie sollen sich nur über den Screen
bewegen (egal wie lange).

Und genau hier ist ist mein Problem.


Ich hab es über eine 2weitere X und Y Punkte versucht. (Diese hab ich
oben im Code wegelasen, diese beiden Punkte liegen in kompett gegengesetzter Richtung)

So überprüfe ich ob sich die Punkte noch bewegen sollen.

Code: Alles auswählen

  ForEach Bullet()
    
    DisplayTransparentSprite(1, Bullet()\x.l, Bullet()\y.l)
    If Not Bullet()\x.l = Bullet()\xx.l
      
      If Bullet()\z.l = 0 Or Bullet()\z.l = 2
        Bullet()\x.l + Bullet()\speed.l
      Else
        Bullet()\x.l-Bullet()\speed.l
      EndIf
    EndIf
    
    If Not Bullet()\y.l = Bullet()\yy.l
      If Bullet()\z.l = 0 Or Bullet()\z.l = 2
        Bullet()\y.l-Bullet()\speed.l
      Else
        Bullet()\y.l + Bullet()\speed.l
      EndIf
    EndIf
    
  Next
Kann mir jemand sagen wie ich sowas am besten machen könnte ?
Oder wo mein Fehler liegt.

Im Grunde sollen einfach nur Punkte über den Bildschrim wandern und das
eben in zufähliger Richtung.

Bestimmt kennt einer von euch Spiele wo man ein Raumschiff ist und Metorieden bewegen sich auf einen zu und man muss diese Zerballern.
Ich brauche sowas für die Berechnung für die Meteroiden wege.
Z.b Asteroids & Deluxe wäre so ein Spiel
http://www.goriya.com/flash/asteroids/asteroids.shtml


Würde mich rießig freuen!

P.s falls jemand ne gutte idee für die Überschrift hat nehme ich sie gerne an.

Verfasst: 14.08.2009 18:53
von KeyKon
Schlag bitte erst mal das Wort Zufählig im Duden nach...
Zu deinem Problem:

Ich weis nich was dein Problem is, du hast einen zufälligen Punkt außerhalb, dann mach doch einfach einen zufälligen Punkt innerhalb des Screens auf den sich der Punkt von außen dann zubewegt...

Verfasst: 14.08.2009 19:02
von X360 Andy
>>Schlag bitte erst mal das Wort Zufählig im Duden nach...

Kommt von Zufall und schreibt man ohne h :oops:

>>Ich weis nich was dein Problem is, du hast einen zufälligen Punkt außerhalb, dann mach doch einfach einen zufälligen Punkt innerhalb des Screens auf den sich der Punkt von außen dann zubewegt...

Ich weiß eben nicht wie ich das anstellen soll.
Der Endpunkt muss auch außerhalb des Screen sein, die Berechnung dazu hab auch geschrieben, das ich nicht mein Problem.
Aber ich weiß eben nicht wie ich die Bewegung zu dem Punkt machen soll.
Bzw die Überprüfung.

Verfasst: 14.08.2009 19:13
von jojo1541
ganz simpel:

Code: Alles auswählen

If punktx < zielx
  punktx + #geschwindigkeit
EndIf
If punktx > zielx
  punktx - #geschwindigkeit
EndIf
If punkty < ziely
  punkty + #geschwindigkeit
EndIf
If punktx > ziely
  punkty - #geschwindigkeit
endif

Verfasst: 14.08.2009 19:14
von KeyKon
lol, also ein massives Logikproblem *g*

Prinzipell so:

Code: Alles auswählen

ballx + Cos(balla*#PI/180)*ballv
bally + Sin(balla*#PI/180)*ballv
ballv is der Weg in Pixeln (sozusagen der Speed) und balla is der Winkel
Den Winkel erreichnest du so:

Code: Alles auswählen

Procedure.d ATan2(y.d,x.d)
  If x < 0
    ProcedureReturn ATan(y/x)+#PI
  ElseIf x > 0 And y >= 0
    ProcedureReturn ATan(y/x)
  ElseIf x > 0 And y < 0
    ProcedureReturn ATan(y/x)+2*#PI
  ElseIf x = 0 And y > 0
    ProcedureReturn #PI/2
  ElseIf x = 0 And y < 0
    ProcedureReturn 3*#PI/2
  Else ; x = 0 and y = 0
    ProcedureReturn 0
  EndIf
EndProcedure
ATan2(y2-y1,x2-x1)
x2 und y2 sind dabei die einen und x1 und y1 die anderen Koordinaten (Start und Ziel in deinem Fall, dabei ist es im Übrigen auch egal wo die liegen, es geht ja nur darum die Winkel auszurechnen)

EDIT: @jojo: So simpel wird das glaublich nich sehr ansehnlich xD

Verfasst: 14.08.2009 19:19
von jojo1541
Es ging auch nur darum, dass ein Objekt von einem Punkt zum anderen kommt. :mrgreen:

Verfasst: 14.08.2009 19:20
von KeyKon
jojo1541 hat geschrieben:Es ging auch nur darum, dass ein Objekt von einem Punkt zum anderen kommt. :mrgreen:
Joa, aber ich glaub das hätte er sogar selber hinbekommen, trotz diverser Logikprobleme xD

Verfasst: 14.08.2009 19:23
von jojo1541
KeyKon hat geschrieben:
jojo1541 hat geschrieben:Es ging auch nur darum, dass ein Objekt von einem Punkt zum anderen kommt. :mrgreen:
Joa, aber ich glaub das hätte er sogar selber hinbekommen, trotz diverser Logikprobleme xD
Ok, stimmt. :lol:

Verfasst: 14.08.2009 19:30
von X360 Andy
Ich mach den Computer für heute aus.... :bluescreen: und schau mir das ganze morgen in ruhe wieder an :coderselixir:

Verfasst: 14.08.2009 20:58
von kswb73
Ich mach das immer so, wenn ich ein Objekt (in diesem Fall Ball()) zu einem Ziel bewegen will:

Code: Alles auswählen

Macro distance(X1,Y1,X2,Y2) ;Errechnet den Abstand von zwei Punkten.
Sqr((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2))
EndMacro

move.d=distance(Ball()\X,Ball()\Y,ZielX,ZielY)/#Speed ;Errecned, wie viel Bewegungen man 
;braucht, um mit einer einer Geschwindigkeit von #Speed von Ball() nach Ziel zu kommen.

  If move>0; Falls der Ball das Ziel noch nicht erreicht hat.
  ;Bewegen wir ihn dahin, aber nur ein Stück. Genau so viel, wie er schnell ist.
  Ball()\X+(ZielX-Ball()\X)/move
  Ball()\Y+(ZielY-Ball()\Y)/move
  EndIf
  
;Wollt man Geschwindigkeit sparen, könnte man auch move speichern und bei den Bewegungen
;immer noch mal Frame dran hängen. Ist Frame dann größer als move, setzt man den Ball auf's
;Ziel und fertig.