2d Tile-Spiele - Kollision/ Denkfehler? - Borland 5



  • Hey Leute,
    ich hab ein kleines Problem und zwar habe ich eine Map, die 8x8 felder groß ist.
    Auf dem Feld 2/2 (Links oben ist 0/0) ist eine Stein Textur, das sieht so aus:

    map[2][2]=0 -> Null ist der Wert für die Textur (32x32 groß).

    Letztendlich möchte ich, dass immer wenn mein Spieler auf ein Feld mit diesem Wert treten würde, er stehen bleibt -> Kollision.
    Der Spieler ist ebenfalls 32x32 groß.

    Hier mein code, den ich bis jetz habe:

    // Hier wird auf die Position der jeweiligen richtung entweder 5 hinzu addiert, //oder 5 abgezogen. 
    
    if(Steuerung.gibMap(Steuerung.gibPX()/32, Steuerung.gibPY()/32)==0)
    {
      // falls der Spieler nicht gehen kann, wird die rechnung von oben rückgängig
      // gemacht.
    }
    //hier wird alles gezeichnet.
    

    Steuerung.gibPX() ist die X-Koordinate des Spielers, sagen wir mal 65, wird dies durch 32 geteilt kommt 2 raus, da diese Variablen Integer sind.
    Wenn dies jetz mit Y genau si wäre, sollte der Spieler nicht gehen könne.

    Das komische bei mir ist aber, dass das Quadrat irgentwie weiter nach unten verschoben ist (auf dem man nicht laufen kann) oder irgentwie garnicht da ist.

    Wisst ihr wie ich es doch noch hinbekommen könnte, dass ich eine anständige Kollision bekomme?

    Ess ist auf jedenfall wichtig dass ich zwischen den Tiles unterscheiden kann, da ich alles auf einer Ebene habe.

    Ich wäre seeeeehr dankbar für Vorschläge.

    Mfg,
    Mick

    EDIT:
    Eigentlich sollte dieser Post in Spieleprogrammierung



  • Ich hab hier einen Link der dir helfen kann:
    http://www.back-side.net/codingrects.html
    Da ist alles genau erklärt, wie man welche Art von Kollision bei Rechtecken effizient errechnen kann.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für den Link. Soetwas in der Art hatte ich nach der Codezeile oben auch, hat aber nicht Funktioniert.
    Aber meints du meine Überprüfung für die Art von Tile (begehbar/ nicht begehbar) ist korrekt? würde es dan Funktioniern wenn ich dei Überprüfung von der Kollision aus dem Tutorial verwende?

    EDIT:

    Ich hab bemerkt, dass meine Kollisionserkennung eigentlich stimmen sollte, doch es erkennt die Felder meines Arrays nicht richtig, woran könnte das liegen?
    Meine Kollisionsblöcke liegen meist im umkreis des 0-Feldes - meistens nach rechts und unten verückt (aber nie ein ganzes Tile, also 32pixel, sondern immer irgentwie).

    Also irgentwie Passen Grafik und Tile/Array nicht genau zusammen und ich habe das Gefühl, dass der Kollisionsblock nicht genau 32x32 pixel groß ist

    ------------------------------------------------------------------
    Ich Post euch jetzt einfach mal einen ziemlich großen Teil meines Codes.
    Ich werde langsam verrückt, wenn das nicht bald funktioniert.

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "gui.h"
    #include "inventar_.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    #include <fstream.h>
    TFGui *FGui;
    //---------------------------------------------------------------------------
    
    __fastcall TFGui::TFGui(TComponent* Owner)
            : TForm(Owner)
    {
    FGui->DoubleBuffered=true;
    srand(time(NULL));
    Steuerung.setPX(0);
    Steuerung.setPY(0);
    PlayerFrame=0;
    }
    //---------------------------------------------------------------------------
    void __fastcall TFGui::Beenden1Click(TObject *Sender)
    {
     Application->Terminate();
    }
    //---------------------------------------------------------------------------
    void TFGui::laufen(){
    }
    //---------------------------------------------------------------------------
    void TFGui::drawMap(){
    //Spielfeld laden
    fstream datei;
    datei.open("test2.txt",ios::in);
    int X,Y,k;
    int map[8][8];
    
            for(X=0;X<8;X++)
            for(Y=0;Y<8;Y++){
             //datei>>map[X][Y];
             datei>>k;
             Steuerung.setMap(k, X, Y);
            }
    //Spielfeld zeichen
    int x=0, y=0;
    for(int j=0; j < 8; j++)
    {
     int i=0;
        for(i=0; i < 8; i++)
        {
         //FGui->ImageList1->Draw(FGui->Image1->Canvas,x,y,map[j][i],true);
         FGui->ImageList1->Draw(FGui->Image1->Canvas,x,y,Steuerung.gibMap(j,i),true);
         x=x+32;
        }
     y=y+32;
     x=0;
    }
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TFGui::N3Click(TObject *Sender)
    {
     ShowMessage("Programmiert von Mick");        
    }
    //---------------------------------------------------------------------------
    void __fastcall TFGui::Inventar1Click(TObject *Sender)
    {
     Inventar->Show();
     //Animation
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TFGui::NeuesSpiel1Click(TObject *Sender)
    {
     drawMap();            
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TFGui::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
     if(Key == 'W'){//oben
            Steuerung.setPR(1);
            speed=5;
     }
    
     if(Key == 'A'){//links
            Steuerung.setPR(2);
            speed=5;
     }
    
     if(Key == 'S'){//rechts
            Steuerung.setPR(3);
            speed=5;
     }
    
     if(Key == 'D'){//runter
            Steuerung.setPR(4);
            speed=5;
     }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TFGui::playerAnimTimer(TObject *Sender)
    {
    Image1->Picture = NULL;
    
    if(Steuerung.gibPR()==1){ //W
     Steuerung.setPY(Steuerung.gibPY()-speed);
    }
    if(Steuerung.gibPR()==2){ //A
     Steuerung.setPX(Steuerung.gibPX()-speed);
    }
    if(Steuerung.gibPR()==3){ //S
     Steuerung.setPY(Steuerung.gibPY()+speed);
    }
    if(Steuerung.gibPR()==4){ //D
     Steuerung.setPX(Steuerung.gibPX()+speed);
    }
    
    //kollision
    if(Steuerung.gibMap(Steuerung.gibPY()/32, Steuerung.gibPX()/32)==0){
           if(Steuerung.gibPR()==1){ //W
            Steuerung.setPY(Steuerung.gibPY()+speed);
           }
           if(Steuerung.gibPR()==2){ //A
            Steuerung.setPX(Steuerung.gibPX()+speed);
           }
           if(Steuerung.gibPR()==3){ //S
            Steuerung.setPY(Steuerung.gibPY()-speed);
           }
           if(Steuerung.gibPR()==4){ //D
            Steuerung.setPX(Steuerung.gibPX()-speed);
           }
    }else//Player Animation
      if(speed>0){
       PlayerFrame++;
       if(PlayerFrame>3){PlayerFrame=0;}
      }
    //Zeichnen
      FGui->drawMap();
      FGui->playerA->Draw(FGui->Image1->Canvas,Steuerung.gibPX(),Steuerung.gibPY(),PlayerFrame,true);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TFGui::FormKeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    
            speed=0;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TFGui::Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     FGui->Label12->Caption=X;
     FGui->Label13->Caption=Y;        
    }
    //---------------------------------------------------------------------------
    


  • ich hab jetz gerade mal die geschwindigkeit vom Laufen von 5 auf 32 Pixelschritte gestellt, jetzt passt die Kollision, aber wenn ich es herunterstelle dann nicht mehr. Hat jemand eine Idee? Ich glaube meine Gleichung zum erkennen, welchen wert das nächste feld hat stimmt nicht, oder so.


Anmelden zum Antworten