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

12

10.08.2022, 23:07

Nochmal auf den eigentlichen Fehler meines Codes einzugehen, die Rechts, Links Kollision klappt wenn diese beiden unter der Oben, Unten Kollision und genau anders herum, aber nicht alle vier zusammen, weiß jemand warum das so ist?

KahnSoft

Frischling

Beiträge: 59

Wohnort: Berlin

  • Private Nachricht senden

13

11.08.2022, 18:53

Wenn Du das so machen willst. musst Du den Pledge Algorithmus anwenden http://www.inf.fu-berlin.de/lehre/SS17/P…s/06_pledge.pdf

Der basiert auf einen Kompass mit 8 Richtungen, die Kollisionserkennung erfolgt jedoch meist über die Pixelfarbe, der Suchstrahl Kollidiert und man dreht seinen Kompass um eine Position nach links, hat sich der Kompass insgesamt 8 mal gedreht , dreht man nun immer recht herum, so kommt man aus jedem Labyrinth (fast...)

Zu deinem Code da oben, teile es auf in "hat fall" erreicht "hat fall" nicht erreicht, alle die zu Y passenden Fälle , und dann alle zu X passenden Fälle.
Da wirst Du wohl auch Merker halten, wozu also keine Intersektion Rechnung starten wie schon angeführt ? Kannst ja alle Z Werte auf null stellen. Oder alle Z aus der Rechnung entfernen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
loat CPlane::Intersect(const CVertex pos)
{
    v0 -= pos;
    v1 -= pos;
    v2 -= pos;
    v3 -= pos;

    float  mag0(v0.Magnitude()),
            mag1(v1.Magnitude()),
            mag2(v2.Magnitude()),
            mag3(v3.Magnitude());

    return  acosf(v0.Dot(v1) / (mag0 * mag3)) +
            acosf(v1.Dot(v2) / (mag1 * mag2)) +
            acosf(v2.Dot(v3) / (mag2 * mag1)) +
            acosf(v3.Dot(v0) / (mag3 * mag0));
}

14

12.08.2022, 18:31

Mal nachgehakt: Wie berechnest du die Bewegung des Spielers?

KahnSoft

Frischling

Beiträge: 59

Wohnort: Berlin

  • Private Nachricht senden

15

12.08.2022, 19:27

Rechnerisch ist es egal wie oder wohin er sich bewegt, die Kollision liefert den präzisen negativen oder positiven Offset, der geht aus der intersection hervor. ist er kleiner < 0 oder > 0 addierst du das zu deiner aktuellen Position und prallst 1:1 an der Plane oder dem Face oder dem Rect ab.

16

12.08.2022, 19:56

Die Bewegung des Spielers wird durch einen selbst erstellten Touch Joystick erstellt. Zwei Kreise ein kleiner den man in einem großen bewegen kann, ich poste hier mal meinen kompletten Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <math.h> 
#include <time.h>
#define PI 3.14159265

using namespace std;
using namespace sf;

int main(int argc, char *argv[])
{
    
    const int xScreen = 1200;
    const int yScreen = 2600;
    
    sf::RenderWindow window(sf::VideoMode(xScreen, yScreen), "Hello SFML");
    
Vector2f wallSize(Vector2f(400, 400));
Vector2f playerSize(Vector2f(90, 90));
    
//Joystick Kreis
CircleShape circle;
circle.setRadius(120);
circle.setFillColor(Color(210, 210, 240));
circle.setOrigin(circle.getRadius(), circle.getRadius());
circle.setPosition(Vector2f (325, 350));

// Joytsick Unterfläche
CircleShape backCircle;
backCircle.setRadius(180);
backCircle.setFillColor(Color( 180, 180, 180));backCircle.setOrigin(backCircle.getRadius(), backCircle.getRadius());
backCircle.setPosition(Vector2f (325, 350));

//Player 
RectangleShape player;
player.setSize(playerSize);
player.setFillColor(Color(160, 190, 190));
player.setPosition(Vector2f(xScreen/2, yScreen/2));
IntRect plrRect = player.getTextureRect();
player.setOrigin(plrRect.width/2, plrRect.height/2);


//walls
RectangleShape wall;
std::vector<RectangleShape> walls(10u);
walls.push_back(wall);

// verschiedenes
Vector2f positionCircle;
Vector2f positionbackCircle;
float speed;
float radiusCircle;
float radiusbackCircle;
float  distance, radii, angle;
Vector2f posVec;

    while (window.isOpen())
    {
        
        sf::Event event;
        while (window.pollEvent(event));
        
// joystick Sachen
positionCircle= circle.getPosition();
positionbackCircle = backCircle.getPosition();
radiusCircle = circle.getRadius();
radiusbackCircle = backCircle.getRadius();
            
FloatRect cRect = circle.getGlobalBounds();
FloatRect bcRect = backCircle.getGlobalBounds();

// Touch Screen World Einstellungen
Vector2i currPos =  Touch::getPosition(0, window);
Vector2f worldPos = window.mapPixelToCoords(currPos);

//Joystick Touch
if(cRect.contains(worldPos)){
    
circle.setPosition(circle.getPosition().x, worldPos.x);
        
circle.setPosition(circle.getPosition().y, worldPos.y);

player.move(posVec.x * 0.2, posVec.y * 0.2);

}
 // joystick bleibt im Unterkreis
posVec.x = positionCircle.x  - positionbackCircle.x;
posVec.y = positionCircle.y  - positionbackCircle.y;
      
      
distance = sqrt((posVec.x * posVec.x) + (posVec.y * posVec.y));
radii = radiusCircle + radiusbackCircle;

 if( distance <= radii){
             
 
 circle.setPosition(circle.getPosition().x  - posVec.x /   180 * 120  , circle.getPosition().y - posVec.y /  180 *  120);
 }
 
 
 window.clear(sf::Color(120, 100, 145));
 
  
 player.setFillColor(Color::Black);
 
 //Wall Einstellungen
 
 for(int i = 0; i < walls.size(); i++){
    
    
    FloatRect wallBounds = walls[i].getGlobalBounds();
    FloatRect playerBounds = player.getGlobalBounds();
    
    Vector2f plrVecPos = player.getPosition();
    Vector2f wallVecPos = walls[i].getPosition();
 
    
 // walls erstellen 
    walls[1].setPosition(Vector2f(100, 800));
    walls[1].setFillColor(Color::Blue);
    walls[1].setSize(wallSize);
    walls[2].setPosition(Vector2f(100, 1500));
    walls[2].setFillColor(Color::Yellow);
    walls[2].setSize(wallSize);
    walls[3].setPosition(Vector2f(700, 1500));
    walls[3].setFillColor(Color::Red);
    walls[3].setSize(wallSize);
    

//Wenn ded Spieler die Wand berührt
if(playerBounds.intersects(wallBounds)){

// hier komme ich nicht weiter, der Spieler soll nicht durch die Wand 



}
 
      
      
      for (auto& wall : walls){
    window.draw(walls[i]);
      }
      
       
}    
 
 

        window.draw(backCircle);
        window.draw(circle);
        window.draw(player);
        
        window.display();
    }
    
}

KahnSoft

Frischling

Beiträge: 59

Wohnort: Berlin

  • Private Nachricht senden

17

13.08.2022, 10:23

Barikade

Du ich zieh mir dein Listing jetzt nicht komplett rein, ich weiß auch nicht
warum du einen so steifen if then false akt mit vor und rück gang einbauen willst ?

Intersektion löst alle geometrischen Probleme.

Selbst die Funktion CRect enthält eine Funktion Intersect(Point) ist ein Punkt im Rechteck ? Erst dann kannst du deine Fragen ausweiten,
Bin ich unterhalb des Zentrums der intersection ? Du kannst direkt den neuen Steuerkurs aus dem Intersektionsereignis gewinnen.
If Then else Kaskaden kann am ende keiner mehr durchleuchten ohne Tests.

Hast Du Polygone statt Rechtecke dann gilt Intersectplane Plane's hat 4 Ecken , man kann aber auch Intersect Triangel (faces) anwenden.
Man muss sich damit auseinander setzen, sonnst bleibt das Ergebnis ugly .

Ich habe seiner Zeit den Pledgere Algorithmus verwendet, um durch ein Barikadenfeld zu kommen : https://youtu.be/xgBrp65D0Y8

Das ist die Kompass Version die ich schon erklärt habe.

Ich hoffe Du findest deine letzte if then Solution und du kommst ohne Tiefgang durch deine Aufgabe.

Viele Grüße aus Berlin
Karsten

18

14.08.2022, 23:09

Ich kriegs nicht hin das in meinen Code einzubauen, ich geb auf aber trotzdem danke

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

19

15.08.2022, 04:32

Dein Code ist, ehrlich gesagt, total vermurkst. Zum Beispiel hast du da zwei verschachtelte for-Schleifen, die keinen Sinn ergeben, denn du erzeugst und zeichnest jede Wand mehrfach. Und beim ersten Durchlauf deiner äußeren Schleife existieren die Wände noch gar nicht, aber du greifst schon auf sie zu. Am besten fängst du nochmal bei null an.

20

15.08.2022, 08:47

Ne versuche gerade die Kollision hinzukriegen, wieso soll ich dan nochmal bei Null anfangen?! Fang du doch bei Null an.

Werbeanzeige