Skocz do zawartości

Pierwsza gra - w GMOgre3d


Kazik1

Rekomendowane odpowiedzi

Robię swoją pierwszą grę w gmogre,mam już 2 lvl,modele z 3dsmaxa i nawet 1 obiekt z animacją.

 

Gra jest FPS'em mam kolizję ze ścianami i innymi obiektami ale mam problem.Ponieważ chcę zrobić tak aby obj_player po zetknięciu się z obj_przejscie przeniosło go do innego room'a.Proszę o pomoc!!!

Odnośnik do komentarza
Udostępnij na innych stronach

w evencie kolizji być nie może bo wywala,musiało by być to jakoś w step zrobione np.

GML
/*obj_Player

STEP:

*/

if(kolizja_z_obj_przejscie)

{

room_goto(castle2)

}

tam gdzie kolizja_z_obj_przejscie potrzebuje kodu (lub skryptu) z biblioteki 3DGmOgre.

Szukałem w helpie dołączonym do biblioteki ale znalazłem tylko jakieś funkcję których nie wiem jak użyć i czy w ogóle działają ;[

 

w tym szukałem:

 

NewtonContactFunction:

 

Overview

Newton contacts cannot be created manually. Instead they are generated automatically by GMOgre3D whenever a Newton material collision occurs. If a collision does occur, and you have a callback setup using the SetNewtonMaterialPairContactCallback function, then a Newton contact object will be passed to the callback script.

 

For more information on this process, see SetNewtonMaterialPairContactCallback.

 

 

GetNextNewtonContact(real newton_contact_id)

 

--------------------------------------------------------------------------------

Returns the ID of the next Newton contact object in a collision, if any.

 

Parameters

newton_contact_id - The ID of the Newton contact object.

 

są jeszcze inne funkcję to była jedna z nich ale nie działa.

Przypominam że chcę zrobić tak że obj_player po kolizji z obj_przejście przeniosło go do innego roomu.

Mogę jeszcze dodać dane obj_player & obj_przejście:

GML
//Obj Player

//Create

global.can_id=1;

can=0;

// Set initial position, yaw, and velocity

x = 0;

y = 0;

z = 1;

forward_speed = 0;

side_speed = 0;

dir = 0;

 

// Create ellipsoid entity to represent the player

ent_id = CreateEntity("ellipsoid.mesh");

 

node_id = CreateRootChildSceneNode();

AttachEntityToSceneNode(ent_id, node_id);

SetSceneNodeScale(node_id, 1, 1, 2.5);

SetEntityMaterial(ent_id, "Simple/dirt01");

 

// Hide ellipsoid so player doesn't look down and see it

HideEntity(ent_id);

 

// Create the collision mesh for the player

col_id = CreateNewtonEllipsoidCollision(global.world2, 0.5, 0.5, 1.0);

body_id = CreateNewtonBody(global.world2, col_id);

CalculateNewtonConvexCollisionInertia(col_id);

SetNewtonBodyMassMatrix(body_id, 50, 50*GetX(), 50*GetY(), 50*GetX());

CalculateNewtonConvexCollisionCenterOfMass(col_id);

SetNewtonBodyCenterOfMass(body_id, GetX(), GetY(), GetZ());

DestroyNewtonCollision(col_id);

 

// Attach Newton body to scene node for auto updates

AttachNewtonBodyToSceneNode(body_id, node_id);

 

// Attach scene node to this object for auto updates

AttachSceneNodeToGMInstance(node_id, id);

SetNewtonBodyPosition(body_id, x, y, z);

EnableNewtonBodyAutoSleep(body_id, false);

 

// The Newton PlayerController handles all interaction with

// the body and the environment (ie, hitting walls, walking

// up stairs, etc)!

controller_id = CreateNewtonPlayerController(body_id);

 

//Step

 

// Set new velocity for our player

SetNewtonPlayerControllerVelocity(controller_id, forward_speed, side_speed, dir);

 

//BeginStep

// Get new direction

dir = GetCameraYaw(obj_camera.camera_id);

 

// Reset velocity

forward_speed = 0;

side_speed = 0;

 

GML
//Obj_przejscie

//CREATE

 

/* Create floor entity

floor_id = CreateFloorEntity(75, 75, 50, 50, 10, 10);

SetEntityMaterial(floor_id, "Examples/Rockwall");

EnableEntityCastShadows(floor_id, false);

 

 

 

/Attach floor entity to scene node and position it

node_id = CreateRootChildSceneNode();

AttachEntityToSceneNode(floor_id, node_id);

*/

 

 

ent_id = CreateEntity("przejscie.mesh");

node_id = CreateRootChildSceneNode(17,-36,0.5);

AttachEntityToSceneNode(ent_id, node_id);

SetSceneNodeScale(node_id, 0.4.3, 0.4.3, 0.4.3);

EnableEntityCastShadows(ent_id, true);

 

 

col_id = CreateNewtonTreeCollisionFromEntity(global.world2, ent_id, true);

body_id = CreateNewtonBody(global.world2, col_id);

DestroyNewtonCollision(col_id);

 

AttachNewtonBodyToSceneNode(body_id, node_id);

 

YawSceneNode(node_id,90);

Odnośnik do komentarza
Udostępnij na innych stronach

XBlacKX - właśnie nie wiem jak zrobić "po której zetknięciu z obj_player przeniesie cię do innego rooma" ;[

gnysek - tylko w silniku

HuderLord - Mogę się dowiedzieć czegoś więcej na temat AttachSceneNodeToGMInstance podać nawiasy z zmiennymi?

Odnośnik do komentarza
Udostępnij na innych stronach

Już zapomniałem jak się używa GMOgre tutaj jest moja gra w nim zrobiona open sourcowa https://forum.gmclan.org/index.php?showtopic=27709 Poszperam w projekcie to może mi się przypomni co i jak :P

edit: :o newton ponga ściągnięto 88 razy nie spodziewałem się tego :D

 

Edit 2:

 

Ok z tego co widzę w newton pongu do rozpoznawania z czym się zderzyła piłka, by odtworzyć odpowiedni do danej powierzchni i prędkości piłki dźwięk, skorzystałem z funkcji SetNewtonMaterialPairContactCallback( id materiału , skrypt który się uruchamia);

 

SetNewtonMaterialPairContactCallback(real newton_material_pair_id, real func)

 

--------------------------------------------------------------------------------

Sets a GM script callback function to be called whenever the two materials in the material pair collide.

 

When this GM script function is called the first and second parameters will be the two Newton bodies that are involved in the collision. The third parameters will be the collision speed, and the forth through sixth parameters will be the collision point in world space.

Parameters

newton_material_pair_id - The ID of the Newton material pair.

func - The GM script function to call.

Ja akurat potrzebowałem tylko wiedzieć z jaką prędkością piłka uderzyła w powierzchnię więc w skrypcie użyłem tylko argumentu2.

argument0 i argument1 to body_id kolidujących ciał argument2 - prędkość uderzenia, argument3 4 i 5 to miejsce uderzenia X Y Z.

 

Po kolei co trzeba zrobić by takie rozpoznawanie kolizji działało.

1. Stworzyć 2 newton materiały. Najlepiej by id tych materiałów były w globalnych zmiennych

GML (create)
globalvar nMat, nMatPair;

nMat[0] = CreateNewtonMaterial( nWorld );

nMat[1] = CreateNewtonMaterial( nWorld );

2. Stworzyć Newton material pair i nadać mu callback

GML (create)
nMatPair[0] = CreateNewtonMaterialPair( nWorld, nMat[0] , nMat[1] );

// w 2 parametrze wpisujesz nazwe skryptu który ma się uruchomić po wykryciu kolizji

SetNewtonMaterialPairContactCallback( nMatPair[0], teleportacjaCallBack);

3. Teraz tworzysz ten skrypt który kolizja wywoła.

GML (teleportacjaCallBack)
// teleportacjaCallBack();

room_goto(castle2)

4. Nadaj newton materiały ciałom

GML (create)
// ciało pierwsze

SetNewtonBodyMaterial( id ciała gracza, nMat[0] );

// ciało drugie

SetNewtonBodyMaterial( id ciała portalu, nMat[1] );

 

Nie ma potrzeby wkładania żadnych warunków do stepu bo newton engine sam wywoła skrypt teleportacjaCallBack() gdy zajdzie kolizja

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...