Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

27.03.2017, 18:03

In Libgdx habe ich zb. einen Wrapper gebaut um Box2D. Dieser hilft mir Box2D zu skalieren ohne dass es die Visualisierung beeinflusst oder die Kräfte die wirken neu eingestellt werden müssen.

Vielleicht ist das eine Option. Aber es gibt immernoch kleine unterschiede bei der Skalierung bezüglich der Kräfte. Aber da gibts viele Sachen die du mit einbeziehen must. Das Physic Material. Etc.

Am Besten du wirst dir da schnell einig wie groß deine Objekte sind. Versuche es umzurechnen. Den Maßstab. Sei dir zu Beginn klar wie groß deine Box2D Objekte sind. Box2D ist nicht in Pixeln sondern in Meter.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

27.03.2017, 18:05

Oder man nutzt einfach direkt SetLinearVelocity und spart sich viel Arbeit.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

13

27.03.2017, 18:07

Oder man nutzt einfach direkt SetLinearVelocity und spart sich viel Arbeit.


Oder das. Gibt auf jedenfall mehr Kontrolle.

14

29.03.2017, 15:17

Zitat


public void handleInput(float delta) {

if (Gdx.input.isKeyPressed(Input.Keys.W)) {
player.body.applyForce(new Vector2(0, 850f), player.body.getWorldCenter(), true);
}
if (Gdx.input.isKeyPressed(Input.Keys.D)) {
player.body.applyForce(new Vector2(850f, 0), player.body.getWorldCenter(), true);
}
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
player.body.applyForce(new Vector2(-850f, 0), player.body.getWorldCenter(), true);
}
if (Gdx.input.isKeyPressed(Input.Keys.S)) {
player.body.applyForce(new Vector2(0, -850f), player.body.getWorldCenter(), true);
}

player.body.setLinearVelocity(0, 0);

}


So sieht die Methode aus. Wenn ich jetzt in der If-Abfrage setLinearVelocity(x,y) x/y >=1 statt player.body.applyForce(...) benutze, dann bewegt sich meine Figur gar nicht mehr.
Also was mache ich falsch?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

29.03.2017, 16:22

Du machst unten "setLinearVelocity(0, 0)", da ist egal, was du in der If-Abfrage tust, du machst es damit ja wieder rückgängig. Bei ApplyForce ist das anders und egal, ob du die Geschwindigkeit auf 0 setzt, weil die Force *danach* wirkt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

16

29.03.2017, 23:42

Also ich kann dir gerne ein Video zeigen, aber die If Abfrage ist nicht egal. Der Spieler bewegt sich sobald einer der abgefragten Tasten gedrückt wurde danach wird die Geschwindigkeit wieder auf Null gesetzt. Dadurch habe ich ein sofortiges Abbremsen.

Ich verstehe jetzt immer noch nicht was ich falsch machen wenn es doch funktioniert?

Wenn ich es so löse wie du es sagst, z.B. nur velocity in der Abfrage behandeln, bewegt sich die Figur nicht mehr.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

17

30.03.2017, 00:10

Das scheint mir ein wenig komisch, was du da machst. Du überprüfst jeden Frame ob ein Bewegungskey gedrückt ist und wendest dann eine Kraft an, um direkt danach die Geschwindigkeit zu resetten. Du solltest darüber nachdenken das "setLinearVelocity" nur auszuführen, wenn keiner der Keys gedrückt wurde und nur mit setLinearVelocity zu arbeiten. Das kannst du zum Beispiel realisieren, indem du aus den if's ein if | else-if | else Konstrukt machst und eben dann im else-Teil die Geschwindigkeit auf 0 zu setzen. Durch das else if verhinderst du gegenseitiges Überschreiben der LinearVelocity wenn du mehrere Keys drückst.
Ich denke sowieso hier wäre es vielleicht sinnvoller den Input in einer Event bzw. Callback-Semantik abzufragen. Ich weiß nicht inwiefern das deine Bibliothek zusätzlich unterstützt, aber so könntest du das etwas einfacher programmieren und müsstest die Geschwindigkeiten nicht jeden Frame neu setzen.

Zu deiner bisherigen Funktionsweise: Würdest du das setLinearVelocity(0,0) entfernen, würdest du bis ins unendliche beschleunigen (sieht zumindest so aus, ich kenne die Lib nicht). Durch das setLinearVelocity(0,0) hat dein Code bisher anscheinend funktioniert, aber ob das dann wirklich sauber gelöst ist, bzw. du das alles so beabsichtigt hast, weiß ich nicht (Korrigiert mich ruhig wenn ich das Verhalten falsch interpretiere.)

18

30.03.2017, 00:35

Der beschleunigt bis ins unendliche wenn ich nicht setVelocity einsetze, das hast du richtig erkannt.

Else if möchte ich nicht einsetzen, weil dann Diagonales gehen nict mehr möglich wäre, weil nur eine Taste zugelassen wird.

Ich bin für Alternativen total offen, denn beabsichtig ist das nicht, habe etwas herum probiert und das war das Ergebnis. Und es funktionierte, das einzige was mich stutzig machte die hohen float-werte die ich eingeben muss.

EDIT: Leider kann ich nicht überprüfen ob überhaupt eine Taste gedrückt wird und dann erst in die If-Abfragen zu springen, das würde zumin ein wenig das ständige abfragen reduzieren.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

19

30.03.2017, 01:06

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void handleInput(float delta) {

Vector2 velocity = new Vector2(0,0);

if (Gdx.input.isKeyPressed(Input.Keys.W)) {
 velocity += (0, 10f);
}
if (Gdx.input.isKeyPressed(Input.Keys.D)) {
 velocity += (10f, 0);
}
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
 velocity += (-10f, 0);
}
if (Gdx.input.isKeyPressed(Input.Keys.S)) {
 velocity += (0, -10f);
}

player.body.setLinearVelocity(velocity);

}


Ich würde das hier vorschlagen. So ist auch eine diagonale Bewegung möglich. Du musst das natürlich anpassen. Ich weiß nicht ob 10 als Geschwindigkeit dir passt oder ob der Vector2 einen +=-Operator besitzt, oder setLinearVelocity einen solchen akzeptiert, aber es geht hier nur um die Logik.

20

30.03.2017, 01:26

Der Formhalber, sollten andere das auch suchen.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Vector2 velocity = new Vector2(0, 0);

        if (Gdx.input.isKeyPressed(Input.Keys.W)) {
            velocity.add(new Vector2(0, 10f));
        }
        if (Gdx.input.isKeyPressed(Input.Keys.D)) {
            velocity.add(new Vector2(10f, 0));
        }
        if (Gdx.input.isKeyPressed(Input.Keys.A)) {
            velocity.add(new Vector2(-10f, 0));
        }
        if (Gdx.input.isKeyPressed(Input.Keys.S)) {
            velocity.add(new Vector2(0, -10f));
        }

        player.body.setLinearVelocity(velocity);


Danke dir, das funktioniert auch. Nur jetzt bin ich verwirrt warum meine Abfrage funktioniert hat genau wie diese hier.

player.body.applyForce(new Vector2(0, 850f),

Wenn diese Zeile ausgeführt wird, wird wohl die Figur beschleunigt auf die Geschwindigkeit, sonst hätte sich die Figur nicht bewegen können oder?

Werbeanzeige