JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Frage zur Kollisionserkennung
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 20.10.2004, 16:23    Titel: Frage zur Kollisionserkennung Antworten mit Zitat

Hallo,
Ich hab´ mal eine Frage zur Kollisionserkennung (alles 2-D Sachen):

Ich hab so einen Tunnel gemacht.
In etwa so:
Code:
_____________

_____________

Und hab diesen mit einer Kollisionserkennung, durch if-Abfragen der Momentanen Position, die die Figur mit der Decke und dem Boden Kollidieren lassen kann.

Da das aber ein wenig langweilich ist, möchte ich gerne eine "Kiste" auf die Erde legen, also in etwa so:
Code:
__________________
          ___
_________|__|______


Was für eine weitere if-Abfrage der Position kann ich machen, damit die Figur mit der Decke ganz normal, mit dem Fußboden das Kistenstück ausgelassen und der Kiste einwandfrei kollidieren kann, ohne dass sich die Abfragen in die quere kommen??

Vielen Dank,
JkerryZ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
t10ottoo
Senior JLI'ler


Alter: 40
Anmeldedatum: 15.04.2004
Beiträge: 210
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 20.10.2004, 16:26    Titel: Antworten mit Zitat

Hi,

klingt jetzt vlt. ein wenig N00bie-Haft, aber du kannst doch den Kasten durch seine LINKE-OBERE Ecke und seine RECHTE-UNTERE Ecke abfragen. Die andere Abfrage mit dem Tunnel lässte dann einfach so.

So hab ich das auch immer gemacht. Klar ist das nicht grad zugunsten der Performance, aber was besseres ist mir bis jetzt auch nicht eingefallen Wink

Gruß
Thomas
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 20.10.2004, 18:58    Titel: Antworten mit Zitat

t10ottoo hat recht. normalerweise werden axis aligned boxes (sprich rechtecke die parallel zum koordinaten system sind) über 2 punkte angegeben. Links-oben und rechts-unten. ob ein punkt nun in dieser box liegt lässt sich schnell feststellen indem du einfach die x udn y koordinaten des punktes mit denen der box vergleichst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 21.10.2004, 18:15    Titel: Antworten mit Zitat

Aber einen "Raum" nur durch if-Abfragen, der bei "Betreten" etwas tut geht nicht?
Ich meine das so:
Zur Zeit hab ich ja nur oben und unten Begrenzt:
Code:
if (y<150)
    {
         dies und das
    }

if (y>550)
   {
       dies und das
   }


Und wenn ich dann zu dem hinzufüge (für eine Kiste im unteren Bereich):

Code:
if (y<150)
    {
         dies und das
    }

if (y>550)
   {
       dies und das
   }

if (y<450, y>350, x<250, x>150)
   {
        dies und jenes
    }



Also wenn ich das so mache, kollidiert er irgendwie immer und verwirft anscheinend die oberen beiden ifs. Was kann ich da tun, ausser die Sachen mit dem oberen linken und dem unteren rechten punkt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 21.10.2004, 20:34    Titel: Antworten mit Zitat

ich frage mich, warum der compiler deine schreibweise zugelassen hat, ein "und" in c++ schaut so aus. &&

Code:
if (y<450 && y>350 && x<250 && x>150)
   {
        dies und jenes
    }
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 21.10.2004, 21:27    Titel: Antworten mit Zitat

der compiler toleriert das, weil das AFAIK im C++-Standard aufgeführt wird (kann mich auch irren)
der kommaoperator wird hier berücksichtigt. in dem fall hier wird deshalb nur das letzte element in dieser kommastelle berücksichtigt.

mfg
#C
_________________
Schau mir in die Augen, Kleines.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 22.10.2004, 18:48    Titel: Antworten mit Zitat

hmmm, habs jetzt mal mit den && probiert, irgendwie kollidiert er jetzt überhaupt nicht... Surprised
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 22.10.2004, 21:37    Titel: Antworten mit Zitat

Zeig doch noch mal den Code, den du jetzt mit dem && gemacht hast Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 22.10.2004, 22:00    Titel: Antworten mit Zitat

So habe ich das jetzt gemacht:
Code:
if (y>300 && y<350 && x>50 && x<100)
   {
      y = 0;
      x = 0;
      o = 350;
      p = 250;
      a = 799;
      b = 599;
   }
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 22.10.2004, 22:23    Titel: Antworten mit Zitat

Von der if-Anweisung gibts keine Fehler.
Ich könnte mir höchstens vorstellen, dass du an die (jetzt) richtige Bedingung irgendwie eine falsche Folgerung geknüpft hast.

D.h. ich würde mal schauen, ob die if-Anweisung denn auch das ausführt, was sie soll Wink
Der Fehler kann natürlich auch außerhalb sein.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 23.10.2004, 21:36    Titel: Antworten mit Zitat

The Lord of Programming hat Folgendes geschrieben:
Von der if-Anweisung gibts keine Fehler.
Ich könnte mir höchstens vorstellen, dass du an die (jetzt) richtige Bedingung irgendwie eine falsche Folgerung geknüpft hast.

D.h. ich würde mal schauen, ob die if-Anweisung denn auch das ausführt, was sie soll Wink
Der Fehler kann natürlich auch außerhalb sein.


Theoretisch wär es ja möglich, aber ich habe insgesamt 3 if-Verzweigungen, die alle das gleiche bewirken aber unterschiedliche Auslöser besitzen.
Die beiden anderen funktionieren nämlich ohne Probleme.
Kann es sein, dass die sich dadurch in die Quere kommen, weil sie alle das gleiche bewirken?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.10.2004, 22:04    Titel: Antworten mit Zitat

Was genau bewirken sie denn?
Bzw. was genau bedeuten diese Variablen:
Code:
y = 0;
      x = 0;
      o = 350;
      p = 250;
      a = 799;
      b = 599;

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 23.10.2004, 23:24    Titel: Antworten mit Zitat

The Lord of Programming hat Folgendes geschrieben:
Was genau bewirken sie denn?
Bzw. was genau bedeuten diese Variablen:
Code:

      y = 0;
      x = 0;
      o = 350;
      p = 250;
      a = 799;
      b = 599;


Also x und y sind die Variablen für die Position der Spielfigur. Nachdem also game over ist, wird das Bild in die linke obere Ecke versetzt. o und p sind die Variablen für die position des Game Over Schriftzuges, der sich erst an einer Koordinate ausserhalb des Sichtbereiches befindet und dann bei Game over in die Mitte des Bildschirm geschoben wird.
a und b sind koordinaten für ein Bild, das während des Spiels über angezeigt wird und bei eintretendem Game Over von der bisherigen Position nach ausserhalb der Sichtfläche verschoben wir, damit es nicht mehr zu sehen ist. Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 24.10.2004, 15:51    Titel: Antworten mit Zitat

Hast du vielleicht irgendeinen Abschnitt im Code, der bewirken könnte, dass diese Variablen wieder auf den vorherigen Wert gesetzt werden?
Mit so wenig Code können wir nur wenig sagen...
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
JkerryZ
JLI Master Trainee



Anmeldedatum: 18.05.2004
Beiträge: 575
Wohnort: Wolfsburg
Medaillen: Keine

BeitragVerfasst am: 24.10.2004, 21:41    Titel: Antworten mit Zitat

Ok, wenn ihr die Volle Dröhnung Code wollt, sollt ihr sie haben Very Happy
Code:
int Game_Main(void *parms)
{
// this is the workhorse of your game it will be called
// continuously in real-time this is like main() in C
// all the calls for you game go here!


// check of user is trying to exit
if (KEY_DOWN(VK_ESCAPE))
    PostMessage(main_window_handle, WM_DESTROY,0,0);

// test if player is moving

    x+=15;


    y+=10;
   

    //} // end if

if (KEY_DOWN(VK_UP))
    {
    // move player to right
    y-=20;
   

    } // end if


///////////////////////////////////////////////////////////////////
// Die "Kollisionsabfrage" ////////////////////////////////////

if (y<150)
   {
      y = 0;
      x = 0;
      o = 350;
      p = 250;
      a = 799;
      b = 599;
      
   }

if (y>350)
   {
      y = 0;
      x = 0;
      o = 350;
      p = 250;
      a = 799;
      b = 599;
   }

if (y>300 && y<350 && x>50 && x<100)
   {
      y = 0;
      x = 0;
      o = 350;
      p = 250;
      a = 799;
      b = 599;
   }

////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////

    a+=va;
   


// start the timing clock
Start_Clock();

// clear the drawing surface
DD_Fill_Surface(lpddsback, 0);

// do all your drawing here to the back buffer

Draw_Text_GDI("Infotext: Wenn die Kiste den oberen oder unteren Balken berührt, hast du verloren", 128, 35, 255,lpddsback);

Draw_Text_GDI("_____________________________________________________________", 120, 145, 120, lpddsback);

Draw_Text_GDI("_______________________                         ___________________________", 120, 460, 120, lpddsback);

DD_Lock_Back_Surface();
Draw_Line(303,400,303,475,63,back_buffer,back_lpitch);
Draw_Line(403,400,403,475,63,back_buffer,back_lpitch);
Draw_Line(303,400,403,400,63,back_buffer,back_lpitch);
DD_Unlock_Back_Surface();

DD_Lock_Back_Surface();
BITMAP_IMAGE monster;
Load_Bitmap_File(&bitmap8bit, "Bild02.bmp");
Set_Palette(bitmap8bit.palette);
Create_Bitmap(&monster, x, y, 127,127);
Load_Image_Bitmap(&monster, &bitmap8bit,0,0, BITMAP_EXTRACT_MODE_CELL);
Unload_Bitmap_File(&bitmap8bit);
Draw_Bitmap(&monster,back_buffer, back_lpitch,0);
Destroy_Bitmap(&monster);
DD_Unlock_Back_Surface();

DD_Lock_Back_Surface();
BITMAP_IMAGE balken;
Load_Bitmap_File(&bitmap8bit, "Bild01.bmp");
Set_Palette(bitmap8bit.palette);
Create_Bitmap(&balken, a, b, 127, 64);
Load_Image_Bitmap(&balken, &bitmap8bit,0,0, BITMAP_EXTRACT_MODE_CELL);
Unload_Bitmap_File(&bitmap8bit);
Draw_Bitmap(&balken,back_buffer, back_lpitch,0);
Destroy_Bitmap(&balken);
DD_Unlock_Back_Surface();

DD_Lock_Back_Surface();
BITMAP_IMAGE balken2;
Load_Bitmap_File(&bitmap8bit, "Bild03.bmp");
Set_Palette(bitmap8bit.palette);
Create_Bitmap(&balken2, o, p, 127,127);
Load_Image_Bitmap(&balken2, &bitmap8bit,0,0, BITMAP_EXTRACT_MODE_CELL);
Unload_Bitmap_File(&bitmap8bit);
Draw_Bitmap(&balken2,back_buffer, back_lpitch,0);
Destroy_Bitmap(&balken2);
DD_Unlock_Back_Surface();





// flip the surfaces
DD_Flip();

// sync to 30ish fps
Wait_Clock(30);

// return success
return(1);

} // end Game_Main


Mehr habe ich nicht verändert. Ich nutze ja eine Grafikengine. Also da sind sonst nur Main funktionen und so etwas. Das ist wie gesagt alles was ich gemacht habe. Ganz am Anfang sind natürlich noch die deklarationen der Variablen mit Wert, die hier nochmal aufgelistet sind:


Code:
int index;
int x = 325;
int y = 149;
int a = 20;
int b = 535;
int va = 5;
int o = 799;
int p = 599;
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum