Objektposition verschieben

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jamagin

Betreff: Objektposition verschieben

BeitragMo, März 26, 2012 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe nun das mit den Waypoints verstanden und nun tut sich mal wieder ein Denkfehler auf.

Folgende Situation: Ich habe zB. 7 Waypoints gesetzt (alles DIM-Felder) und eine Typekollektion für die Objekte. Die Waypoints werden von 0 hochgezählt und die Typeliste auch, jedoch ist es nun so, daß ...

Obj5.Obj4..Obj3...Obj2...Obj1..Obj0
wp0...wp1...wp2...wp3...wp4...wp5...wp6...wp7

Wie ich bei Collision drauf reagiere hab ich auch schon, das Problem ist aber das bei Collision mit Obj1 dieses vor das Obj0 gesetzt wird, obwohl ich eine For-Schleife habe die mir die Objekte vom Kollidierten bis zum ersten Eintrag (Obj0) ausliest. Diese sollen dann jeweils um einen Waypoint weiter versetzt werden.

Code: [AUSKLAPPEN]

      Else
         ; check collision with enemy
         For enemy.TEnemy = Each TEnemy
            collisionDistance# = (enemy\radius + player\radius)
            vx# = (player\x - enemy\x)
            vy# = (player\y - enemy\y)
            actualDistance# = Sqr(vx * vx + vy * vy)
            If actualDistance < collisionDistance
               player\sy = 0
               collNormalAngle# = ATan2(vy, vx)
               nX# = Cos(collNormalAngle)
               nY# = Sin(collNormalAngle)
               moveDist# = (collisionDistance - actualDistance)
               player\x = player\x + moveDist * nX
               player\y = player\y + moveDist * nY
               For i = 1 To enemy\nummer
                  enemy\current_path = enemy\current_path+1
                  enemy\x = pathx(enemy\current_path)         
                  enemy\y = pathy(enemy\current_path)
               Next
            EndIf
         Next
      EndIf


Kann da wer weiterhelfen bitte?

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragMo, März 26, 2012 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist enemy\nummer? Was sollte pathx/y bewirken?
Kreiskollision ist klar, aber was du danach machst, verstehe ich nicht mehr.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Jamagin

BeitragDi, März 27, 2012 2:20
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres,

pathx(enemy\nummer) ist der waypoint sowie pathy(...)

Ich habe die waypoints mit DIM dimensioniert. enemy.TEnemy ist die Typekollektion.

Was mach ich in dieser Funktion: Ich prüfe die Kollision zwischen den emporgeschossenen Ball und der Typekollektion. Ist eine Kollision dann sollten sich die Objekte zum nächsten waypoint bewegen.

Beispiel:

X-----X----X----X----X
wp1.wp2.wp3.wp4.wp5

X-X-X-O-X-X

X ist die Typekollektion und O ist der emporgeschossene Ball. (siehe Grafik im Eintrag Waypoints von mir.

das letzte X (ganz rechts) ist der erste Eintrag in der Typekollektion und wp ist der waypoint, die nummer hinter wp ist das dimfeld praktisch.
In der For-Schleife setze ich die nächste Position des Enemywaypoints und da hab ich das Problem wie vorher definiert!

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragDi, März 27, 2012 2:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann an mir liegen, aber das erklärt nichts.
Warum sind die Waypoints keine Types? Warum setzt du die Kugeln direkt auf den nächsten Waypoint?
Warum änderst du was am Player-Objekt (Kugel?) nach der Kollision? Warum wird da stattdessen keine neue TEnemy-Kugel erzeugt oder eingetragen?
Bist du sicher, dass da kein Exit nach dem Kollisionszeug fehlt?

Was du tun willst ist mir ziemlich klar, die frage ist, was du tatsächlich tust. Wie du vor hast, die Bälle neu zu ordnen, verstehe ich jedenfalls nicht.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Jamagin

BeitragDi, März 27, 2012 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres,

danke für deine Antwort! Ich müßte den ganzen Code reinstellen damit du siehst was ich mache! Ich versuche es aber nochmals dies zu erklären. Ich ändere nichts am Player Objekt, das wird ja dann sowieso gelöscht und an der Kollisionsstelle ein neues TEnemy Objekt erzeugt. Aber das erst, wenn sich die TEnemy Objekte einen Waypoint weiter verschoben haben und da happert es leider! Es funktioniert soweit aber das zweite X wird in diesem Fall vor das erste versetzt. Das ist falsch, denn es sollte das 1. X (das rechteste) um eine Stelle weiter verschoben werden und dann das nächste. Eben bis dorthin welche Objektnummer aus der Kollisionsprüfung herauskommt. Wenn der Ball das vorletzte X trifft, sollten diese 2 eine Stelle nach rechts gehen. Sollte es echt nur am Exit liegen?

Warum sollte ich die Waypoints in ein Typefeld tun? Wäre das besser? Ist nicht DIM schneller? Auch habe ich gelesen, daß SQR ein langsamer Befehl ist und es besser wäre
Code: [AUSKLAPPEN]

acutalDistance = (vx * vx + vy * vy) oder ... = vx^2 + vy^2 (ist das schneller?)
IF acutalDistance > (Radius * Radius)
...

Vielleicht muß ich die Waypoints andersrum setzen, dann würde es klappen. Also von rechts nach links? Sodaß praktisch Waypoint 0 auch enemy\enemy_path = 0, waypoint 1 ... enemy\enemy_path = 1 etc. ist?

Sollte ich echt mal versuchen!

lg. Jamagin

NB: Habe ja auf den Thread hingewiesen wo ich die 2 Bilder drinnen habe bzgl. Waypoints und du hast dort ein Bild Spielfeld (Zuma) eingefügt!
Bevor du etwas neues beginnst, erledige das alte

BladeRunner

Moderator

BeitragDi, März 27, 2012 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Was die Frage nach der Geschwindigkeit angeht: Optimiere erst wenn Du wirklich performanceprobleme hast. Bei den paar Kugeln sollte es absolut egal sein ob Du sqr nimmst oder nicht. Wenn nein ist es eine Sache von Minuten den Code passend zu ändern.
Ebenso würde ich immer den zur Anwendung passenden Container nehmen. Die Liste ist hier deutlich sinnvoller als ein Array, weil man recht schmerzfrei Objekte einfügen und entfernen kann. Nur wenn die Performance massiv leiden sollte würde ich auf das inflexiblere (zumindest im Bezug aufs einfügen von Elementen) Dim-Modell zugreifen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xeres

Moderator

BeitragDi, März 27, 2012 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Jamagin hat Folgendes geschrieben:
Ich ändere nichts am Player Objekt

Dann ist dies alles...
Code: [AUSKLAPPEN]
player\sy = 0
collNormalAngle# = ATan2(vy, vx)
nX# = Cos(collNormalAngle)
nY# = Sin(collNormalAngle)
moveDist# = (collisionDistance - actualDistance)
player\x = player\x + moveDist * nX
player\y = player\y + moveDist * nY
unnötig oder zumindest am falschen Platz.
Die Kollision findet statt, d.h. du solltest einen neues TEnemy-Object erstellen, mit insert vor oder hinter das kollisions Objekt stopfen, die Abfrage machen, ob es genügend gleichfarbige Kugeln gibt um die Nachbarn zu vernichten und dann war es das.
Die Waypoints sollten gar nichts damit zu schaffen haben, die richtigen Abstände können die Kugeln selbst erreichen.
Zwischen zwei Waypoints sollte eine beliebig lange Strecke liegen, weshalb ich auch nicht einsehe, warum du die Kugeln ganze Waypoints weiter schickst. Types sind immer wenn möglich vor zu ziehen.
Code: [AUSKLAPPEN]
enemy\wp = enemy\wp\NextWP ;Nächsten Ziel Waypoint auswählen

Wenn du auf irgendwas Hinweisen möchtest, linke selbst zu deinen Topics und zu passenden Beispielbildern. Du willst die Hilfe, dass ist deine Aufgabe. Lass Niemanden für dich was suchen, wenn du das selbst tun könntest.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Jamagin

BeitragDi, März 27, 2012 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Xeres!

Ups, sorry! Ja ich werde mich in Zukunft bemühen, daß auch die Hilfehinweise verlinkt sind! Ich wußte nicht klingt blöde, ich hab einfach nicht daran gedacht!

Werde mir deine Zeilen genau ansehen um zu verstehen wie du das meintest! Danke mal vorweg! Smile

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group