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

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

1

10.11.2009, 18:10

Kollision findet zu früh statt....

hi,
ich lerne zur zeit reines Directx, dass ich nicht abhängig von irgendwelchen engines bin und mehr Erfahrung dadurch bekomme...nun gut, jetzt versuch ich mich grad an nem ganz einfachem pong dass ich noch ausbauen werde und hänge gerade an der Kollisionerkennung und zwar hab ich halt ein paddel und ein ball und vergleiche die position und dreh dann den winkel vom Ball wenn eine Kollision stattfindet, nur der ball kollidiert immer so 2 cm vom Paddel entfernt und ich suche jetzt schon 3 Tage nach dem Fehler:

hier erstmal ein Bild wo er schon abrallt


(Link)


an der roten linie prallt der Ball ab.

und hier ein bisschen 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
NewPlayer(-1.5f,0.0f,1,0.4f, false);

while(g_App.GetD3DStatus())
 {
  QueryPerformanceCounter((LARGE_INTEGER*)(&llStartTime));
  if(PeekMessage(&Message,NULL,0,0,PM_REMOVE))
  {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
  }

  if(g_App.CheckDevice())
  {
  // Die Sekunden seit dem letzten Frame speichern

  NumSecsPassed = dTime;
  g_App.GetDevice()->Clear(0,
                           NULL,
                           D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                           D3DCOLOR_XRGB(0,0,0),
                           1.0f,
                           0);
  //start drawing (NEW)

  g_App.GetDevice()->BeginScene();
  
  if(GetAsyncKeyState(VK_SPACE) && )
  {
      g_Ball[NewBall(1, 0)].m_dRotation = 30;
  }
  Move(dTime);
  MoveBall(dTime);
  Collision();
  Render(dTime);
  RenderBall(dTime);

// bla bla.... ->present();


das war die Schleife

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
int CPaddle::Init(float fPositionX, float fPositionY, float fHeight, float fWidth, unsigned uIndex, bool ai)
{
    m_fXPos = fPositionX;
    m_fYPos = fPositionY;
    m_fheight = fHeight;
    m_fwidth = fWidth;
    m_uIndex = uIndex;
    m_fSpeed = 0;
    m_bAlive = true;
    m_bKi = ai;
    
    Rect[0].init( m_fXPos , m_fYPos , 10.0f ,0xffffffff,1.0f,1.0f );
    Rect[1].init( m_fXPos + m_fwidth , m_fYPos , 10.0f,0xffffffff,0.5f,0.0f );
    Rect[2].init( m_fXPos , m_fYPos + m_fheight, 10.0f ,0xffffffff,0.0f,1.0f );
    Rect[3].init( m_fXPos + m_fwidth , m_fYPos + m_fheight , 10.0f, 0xffffffff,1.0f,1.0f);

    g_App->CreateVertexBuffer(sizeof(Rect),
                                      D3DUSAGE_WRITEONLY,
                                      D3DFVF_CUSTOMVERTEX,
                                      D3DPOOL_MANAGED,
                                      &m_VBf,
                                      NULL);

//lock buffer

m_VBf->Lock(0,sizeof(Rect),(void**)&pData,0);
//copy data to buffer

memcpy(pData,Rect,sizeof(Rect));
//unlock buffer

m_VBf->Unlock();

    return 0;
}


dort initialisere ich die Daten vom Paddel....ungefähr das Gleiche passiert auch beim Ball.....

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CPaddle::Render(float fTime)
{

    D3DXMATRIX matTranslation; //transformation matrices (NEW)

    D3DXMatrixTranslation(&matTranslation,m_fXPos,m_fYPos,0.0f);
    g_App.GetDevice()->SetTransform(D3DTS_WORLD, &matTranslation );
    g_App->SetStreamSource(0,m_VBf,0,sizeof(D3DVERTEX));
    g_App->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);

}


und hier render ich halt das ganze.....der ball hat genau die gleiche RenderMethode

ich hab keine Ahnung wie das zustande kommt...hat einer vllt. ne Lösung?


sagt wenn mehr code erwünscht ist....
New Project: Operation CityRacer

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

2

10.11.2009, 18:27

Hallo,
wie wäre es den mit der Collision() methode?
Diese scheint fehlerhaft zu sein... die render-methode bringt hier nicht viel^^

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

3

10.11.2009, 18:37

upps hab ich ja ganz vergessen nur da steht fast nichts drin:

da ich jetzt nur als Test nur die xposition abfrage

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Collision()
{
    for(int i = 0; i < 32; i++)
    {
        if(!g_Ball[i].alive())
            continue;
        for(int a = 0; a < 4; a++)
        {

            if(!g_Paddle[a].alive())
                continue; 
            if(g_Ball[i].GetPositionX() > g_Paddle[a].GetPositionX())// && g_Ball[i].m_BallRect.Rect[a].fX > g_Paddle[a].m_sPaddle.Rect[0].fX)

                g_Ball[i].m_fSpeed = 0;//.m_dRotation += g_Ball[i].m_dRotation - 180;

        }
    }

}


dieses Speed Null dient nur dazu um zu schauen wo die kollision stattfindet
New Project: Operation CityRacer

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

10.11.2009, 19:24

Ein Tipp: Freunde dich mit der stl an. Arrays sind zwar auch möglich aber meist nicht so komfortabel.
Eine Frage: Wie ist bei dir die X-Achse definiert? An welcher Pos ist der Schläger under der Ball? (Werte angeben)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

5

10.11.2009, 19:51

Zitat

Wie ist bei dir die X-Achse definiert?


ka...wie kann ich des herausfinden

Zitat

An welcher Pos ist der Schläger under der Ball?


Der Schläger ist an x = -1.5f und der Ball ist unterschiedlich er wird ja bewegt....
wo er kollidiert weiss ich nich sind halt immer ungefähr 2 cm
New Project: Operation CityRacer

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

10.11.2009, 22:10

Zitat

g_Ball.GetPositionX() > g_Paddle[a].GetPositionX()


wenn der ball sich rechts vom paddel befindet...?
bei mir ist der paddel links vom ball oO
bleibt er sofort stehen?

du hast 32 bälle und 4 paddel? warum versuchst du es nicht erstmal mit jeweils einem?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

7

10.11.2009, 22:21

ja sorry sollte andersrum sein, also < statt > hab ich ausversehn mit beim hin und her testen verändert.....ja er bleibt sofort stehen

ich hab aber eh nur ein Paddel und ein Ball aktiv...die anderen werden ja gar nicht durchgegangen....
liegts vllt. daran dass ich mir das directx august 09 sdk gedownloadet habe?
New Project: Operation CityRacer

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

10.11.2009, 22:32

nein <.<

ich würd dir empfehlen erstmal etwas erfahrung mit der sfml oder sdl zu sammeln. das ist weniger kompliziert und du kannst dich aufs wesentliche konzentrieren.

was sind das für vierecke?

C-/C++-Quelltext

1
2
3
4
    Rect[0].init( m_fXPos , m_fYPos , 10.0f ,0xffffffff,1.0f,1.0f );
    Rect[1].init( m_fXPos + m_fwidth , m_fYPos , 10.0f,0xffffffff,0.5f,0.0f );
    Rect[2].init( m_fXPos , m_fYPos + m_fheight, 10.0f ,0xffffffff,0.0f,1.0f );
    Rect[3].init( m_fXPos + m_fwidth , m_fYPos + m_fheight , 10.0f, 0xffffffff,1.0f,1.0f); 


ich hab sowas auch mal geschrieben und mein paddel brauchte nur 4 float werte+farbe oO
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

9

11.11.2009, 10:49

ich hab schon sehr viel mit sfml und sdl gemacht und hab auch schon mit 3d angefangen, nur hab ich diesen beschissenen Fehler den ich nich wegbekomm und ich such den fehler schon über 4 Tage....und für mich is das nich kompliziert...bin ja kein anfänger mehr ;)
jedes Rect ist ein Vertex mit position xyz, Farbe und den Texture Koordinaten...
New Project: Operation CityRacer

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

10

11.11.2009, 11:47

benutzt du einen logfile? dann lass dir mal die x-werte des balles oder so ausgeben... schafft oft sehr viel klarheit^^

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Werbeanzeige