 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 20.10.2004, 16:23 Titel: Frage zur Kollisionserkennung |
|
|
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 |
|
 |
t10ottoo Senior JLI'ler

Alter: 40 Anmeldedatum: 15.04.2004 Beiträge: 210 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 20.10.2004, 16:26 Titel: |
|
|
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
Gruß
Thomas |
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 20.10.2004, 18:58 Titel: |
|
|
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 |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 21.10.2004, 18:15 Titel: |
|
|
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 |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 21.10.2004, 20:34 Titel: |
|
|
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 |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 21.10.2004, 21:27 Titel: |
|
|
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 |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 22.10.2004, 18:48 Titel: |
|
|
hmmm, habs jetzt mal mit den && probiert, irgendwie kollidiert er jetzt überhaupt nicht...  |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.10.2004, 21:37 Titel: |
|
|
Zeig doch noch mal den Code, den du jetzt mit dem && gemacht hast  _________________ 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 |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 22.10.2004, 22:00 Titel: |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.10.2004, 22:23 Titel: |
|
|
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
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 |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 23.10.2004, 21:36 Titel: |
|
|
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
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.10.2004, 22:04 Titel: |
|
|
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 |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 23.10.2004, 23:24 Titel: |
|
|
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.  |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.10.2004, 15:51 Titel: |
|
|
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 |
|
 |
JkerryZ JLI Master Trainee

Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 24.10.2004, 21:41 Titel: |
|
|
Ok, wenn ihr die Volle Dröhnung Code wollt, sollt ihr sie haben
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 |
|
 |
|
|
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
|