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

Beiträge: 25

Beruf: Schüler

  • Private Nachricht senden

21

26.08.2013, 10:56

Wenn die Sprites kollidieren ,dann hängen sie sozusagen ein Stück in einander (siehe meine wunderschöne Zeichnung ).
D.h. wenn du eine Kollision hast und den Spieler dann wieder bewegen willst, dann "hängt" er noch in dem Block drinnen und hat dann logischerweise ne Kollision mit dem Block.
Prinzipiell musst du also den Spieler,WENN du eine Kollision hast, noch um einen bestimmten Wert zurücksetzen ,nämlich :
(A ist der Spieler ,B ist der Block mit dem er kollidiert )

von links : x_A = x_B - breite_A ( dann sollte A genau vor dem Block stehen )
von rechts : x_A = x_B + breite_B
von oben : y_A = y_B - höhe_A
von unten y_A = y_B + höhe_B


Würde ich jetzmal so pauschal sagen

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

22

26.08.2013, 12:17

Das ist Momentan ja grad nicht mein Problem (vielleicht ist es später mein Problem) ich muss bevor ich evtl. die Position korrigiere ja erstmal raus finden wo es kollidiert.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Beiträge: 25

Beruf: Schüler

  • Private Nachricht senden

23

26.08.2013, 12:41

Achso ,dann hab ich das jetz falsch verstanden ,sorry. Du hast also grade immer noch das Problem ,dass du nicht weißt von wos kollidiert ,oder ?

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

24

26.08.2013, 12:46

Ja. Mein Problem ist es sobald ein Kollision stattfand fest zu stellen an welcher Seite sie war.

Edit: Hat keiner mehr ne Idee?

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Swoerm« (26.08.2013, 23:20)


Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

25

27.08.2013, 19:48

Das Problem ist jetzt gelöst. Er erkennt nun Kollisionen. :)
(Nochmal danke :thumbsup: )
Hier der 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
void CStartGame::ProcessMoving ()
{

    m_bCollisionLeft = false;
    m_bCollisionRight = false;
    m_bCollisionTop = false;
    m_bCollisionBottom = false;


    m_bCheckCollision (Player);

    if( m_bCollisionLeft )
        Player.fXPos += static_cast<float> (0.1);
    if( m_bCollisionRight )
        Player.fXPos -= static_cast<float> (0.1);
    if( m_bCollisionTop )
        Player.fYPos += static_cast<float> (0.1);
    if( m_bCollisionBottom )
        Player.fYPos -= static_cast<float> (0.1);

    if( g_pFramework->KeyDown (SDLK_LEFT)  && Player.fXPos > 0 && !m_bCollisionLeft )
    {
    Player.fXPos -= PlayerSpeed;
    PlayerState = Left;

    }

    if( g_pFramework->KeyDown (SDLK_RIGHT) && Player.fXPos + Player.Sprite->w < g_pFramework->m_pScreen->w && !m_bCollisionRight )
    {
    Player.fXPos += PlayerSpeed;
    PlayerState = Right;
    }

    if( g_pFramework->KeyDown (SDLK_UP) && Player.fYPos > 0 && !m_bCollisionTop )
    {
        Player.fYPos -= PlayerSpeed;
        PlayerState = Up;
    }

    if( g_pFramework->KeyDown (SDLK_DOWN) && Player.fYPos + Player.Sprite->h < g_pFramework->m_pScreen->h && !m_bCollisionBottom )
    {
        Player.fYPos += PlayerSpeed;
        PlayerState = Down;
    }

}


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
void CStartGame::m_bCheckCollision (CSprite &Sprite)
{


    double dLeftA, dLeftB;
    double dRightA, dRightB;
    double dTopA, dTopB;
    double dBottomA, dBottomB;

    bool bCollision = false;
    
    dLeftA = Sprite.fXPos;
    dRightA = Sprite.fXPos + Sprite.GetWith();
    dTopA = Sprite.fYPos;
    dBottomA = Sprite.fYPos + Sprite.GetHeight();

    it = Fields.begin();
    
    while ( it != Fields.end() )
    {
        bCollision = false;
        
        dLeftB = it->XPos;
        dRightB = it->XPos + it->GetWith();
        dTopB = it->YPos;
        dBottomB = it->YPos + it->GetHeight();

        if( dLeftA < dRightB &&
            dRightA > dLeftB &&
            dTopA < dBottomB &&
            dBottomA > dTopB )
            bCollision = true;

        if(bCollision)
        {

        if( dRightA > dRightB )
        {
            m_bCollisionLeft = true;
        }

        if( dLeftA < dLeftB )
        {
            m_bCollisionRight = true;
        }

        if( dTopA > dTopB )
        {
            m_bCollisionTop = true;
        }

        if( dBottomA < dBottomB )
        {
            m_bCollisionBottom = true;
        }

        }

        it++;
    }
}


Jetzt liegt mein Problem darin das mein Player als 50x50px Großes Sprite durch ein 50x50px Breiten Gang soll. Ich habe (mal wieder) keine Ahnung wie ich das Hinbekommen soll.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

26

27.08.2013, 22:04

Ein Gitter machen, sodass jedes Feld nur 50*50px groß ist und dann den Spieler eben nur um einen Fixwert bewegen.
In Kombination mit der Kollisionserkennung frag ich mich zwar, was du dir dabei gedacht hast aber... naja, nicht mein Minesweeperspiel. :)
Sollte er sich jedoch frei bewegen können, also theoretisch "jeden" Pixel begehen können, so könntest du folgendes tun:
Wenn versucht wird den Gang zu betreten, schaust du, ob die Differenz aus der Y-Position des Spielers und der Y-Position eines wesentlichen Punktes im Gang kleiner als eine gewisse Toleranz ist.
Sollte diese Toleranz unterschritten sein, kannst du Y einfach auf die richtige Position setzen oder eben dich mithilfe einer Geschwindigkeit annähern, damit das smoother rüberkommt.
Nochmal zu besagtem Punkt: Der sollte ein selbes Verhältnis zur Fläche haben, als der "Schwerpunkt" (aka lokaler Ort des Ortsvektors, der die globale Position deines Sprites beschreibt) sonst müsstest du nochmal ein wenig addieren und subtrahieren.

MfG
Check

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

27

28.08.2013, 16:26

Also wenn mein Spieler den Gang begehen will soll ich schauen wie Weit er von dem Mittelpunkt des Ganges entfernt ist und das annähern.

Edit: Den letzten Satz habe ich nicht verstanden.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Werbeanzeige