Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 14.01.2004, 20:11 Titel: Auch Kollision :) |
|
|
Jo,
ich hab auch ein Kollisionsproblem und zwar wollt ich das folgendermaßen machen:
Code: |
int map[99][99];
if (bKeyboard[DIK_LEFT]) { if (x > 0 && collision(4) == false) { x -= 1; } }
if (bKeyboard[DIK_RIGHT]) { if (collision(2) == false) { x += 1; } }
bool collision(int moving)
{
//<---4 2--->//
switch (moving)
{
case 2:
if (map[(y/50)][(x/50)+2] == 1 || map[(y/50)-1][(x/50)+2] == 1) { return true; }
break;
case 4:
if (map[(y/50)][(x/50)-2 || map[(y/50)-1][(x/50)-2] == 1] == 1) { return true; }
break;
}
return false;
}
|
das funzoniert auch noch alles.
Nun hab ich noch ne ganz einfache Schwerkraft:
Code: |
void falling()
{
if (map[(y/50)+2][(x/50)] == 0) { y += 1; }
}
|
damit fählt der auch wunderbar andauernt auf seine Füße (+2 deswegen
weil die Playerfigur 2 Felder groß ist)
was nun mein Problem ist, ist eine gescheite Sprung Function.
Ich habe versucht eine zu Coden, allerdings springt der Spieler
entweder duch die Steine dann durch oder
man kann öfters die UP taste drücken so das er ins unendliche springt..
vieleicht kann mir jemand helfen..
Ich weiss Kollision mit BoundingBox ist sinvoller aber ich wollts
mal damit versuchen ..
kann mir vieleicht jemand helfen ? _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 14.01.2004, 20:34 Titel: |
|
|
Wenn die Sprungtaste gedrückt wird tust du am besten 2 Dinge: a) Du stellst die Geschwindigkeit dementsprechend um und b) du setzt dir ein Flag, z.B. bool jumping auf true. Solange jumping gleich true ist darf die Sprungfunktion nicht aufgerufen werden. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 14.01.2004, 20:35 Titel: |
|
|
Beim springen sollte überprüft werden ob sich die Figur auf gfestem Boden befindet und ob sie sich den Schädel an der decke eindellen kann:
Code: | #define SPRUNGHOEHE 2
int Gesprungen=SPRUNGHOEHE;
if (bKeyboard[DIK_UP])
{
if (y > 0 && collision(1) == false && collision(3) == true)
{
y -= 1;
Gesprungen=0;
}
}
void falling()
{
if (map[(y/50)+2][(x/50)] == 0) //runter
{
y += Gesprungen >= SPRUNGHOEHE ? 1 : -1;
}
if (map[(y/50)-2][(x/50)] == 0) //hoch
{
y += Gesprungen >= SPRUNGHOEHE ? 1 : -1;
Gesprungen += Gesprungen>=SPRUNGHOEHE ? 0 : 1;
}
} |
Den fallen algo kannst du ja mit dem Bewegungsalgo kombinieren und gleichzeitig prüfen ob sie etwas treffen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
kapuzineralex Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 8 Wohnort: München Medaillen: Keine
|
Verfasst am: 15.01.2004, 06:41 Titel: |
|
|
Hi,
um das ganze übersichtlicher und *realistischer* zu gestalten, würde ich der Spielfigur einfach Geschwindigkeiten/Beschleunigungen zuordnen.
Dadurch wirken die Bewegungen auch nicht so abgehackt und das ganze ist relativ simpel zu programmieren.
Zum Beispiel gibst Du folgende Variablen vor:
int iXPos, iYPos;
int iXAccel, iYAccel;
const int iMaxXAccel = 5; // Nur Beispielwerte
const int iMaxYAccel = 7;
// Initialisierung, z.B. am Anfang des Levels
void InitPlayer(int iStartX, int iStartY)
{
iXPos = iStartX,
iYPos = iStartY;
iXAccel = iYAccel = 0;
}
// Input
void KeyPressed(int iKeyCode)
{
switch (iKeyCode)
{
case KEY_RIGHT:
iXAccel += 1;
iXAccel = (iXAccel > iMaxXAccel) ? iMaxXAccel : iXAccel;
break;
case KEY_UP:
iYAccel += 1;
iYAccel = (iYAccel > iMaxYAccel) ? iMaxYAccel : iYAccel;
break;
// usw.
}
}
// Hauptschleife
void Hauptschleife(void)
{
BOOL bSpielZuEnde = FALSE;
while (!bSpielZuEnde)
{
iXPos += iXAccel;
iYPos += iYAccel;
if (iXAccel > 0)
iXAccel--;
else if (iXAccel < 0)
iXAccel++;
if (abs(iYAccel) > iMaxYAccel)
iYAccel--;
Kollisionserkennung(iXPos, iYPos); // z.B. mit dem Kopf gegen die Decke gedoppst
MaleSpielfigur(iXPos, iYPos);
}
}
So kannst Du meiner Meinung nach Springen/Fallen/Bewegen/Kollisionserkennung sauber und *einfach* verpacken.
Gruesse,
Alex |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 15.01.2004, 22:19 Titel: |
|
|
irgendwie kann ich troz allem noch beim Springen durch die Steine springen
aaaaaa ich bin zu doof dazu :/
kann mir das nicht jemand im icq erklären :
72316804 _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 15.01.2004, 22:24 Titel: |
|
|
Du kannst auch testen ob im nächsten Frame eine Kollision stattfinden wird und dementsprechend die Geschwindigkeit verringern... um ehrlich zu sein würde ich es aber mit RECTs machen, ist viel einfacher. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.01.2004, 22:38 Titel: |
|
|
Der ansatz von kapuzineralex ist wirklich besser als deiner es sei denn du arbeitest wirklich nur mit einelnen Blöcken und daher ohne Zwischenstufen.
Doch würde ich kein absf nehmen zum überprüfen ob man den Höchstpunkt erreicht hat sondern ne sinus Funktion das macht das ne ganze Ecke realistischer.
Am besten noch ne AirControl Variable hinzufügen damit man gar nicht oder nur bedingt die Richtung in der Luft ändern kann. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
kapuzineralex Mini JLI'ler
Anmeldedatum: 07.01.2004 Beiträge: 8 Wohnort: München Medaillen: Keine
|
Verfasst am: 16.01.2004, 08:31 Titel: |
|
|
Bei der Abs() Funktion habe ich auch einen Fehler gemacht. Beschleunigung nach oben findet ja eh nur statt, wenn der Spieler die entsprechende Sprung-Taste drückt und auch dann nur bis zum Wert iMaxYAccel.
Durch die Abs-Funktion weiter unten wollte ich erreichen, daß der Wert von iYAccel vor allem beim Herunterfallen immer schneller wird.
Allerdings muß noch eine weitere boolesche Variable eingeführt werden, denn die Y-Beschleunigung soll ja nur beim Springen/Fallen stattfinden.
Also:
if (bJumpingOrFalling)
{
if (abs(iYAccel) < iMaxYAccel)
iYAccel--;
}
Und natürlich muß es < und nicht ">" heißen bei abs()...
Grüße
Alex |
|
Nach oben |
|
|
|