void Network::BoostClient::OnBulletHit( unsigned long ip, const PACKAGE& p ) { std::cout << "OnBulletHit\n"; // 获取炮弹类型 BulletHittedBag* bag = (BulletHittedBag*)p.GetData(); if ( bag->target_index == m_index ) { auto pEngine = MyIrrlichtEngine::GetEngine(); if ( pEngine->GetCurrentPlayer()->GetShip()->GetShield() <= 0 && pEngine->GetCurrentPlayer()->GetShip()->GetArmor() <= 0 ) { // 自己挂了 pEngine->GetCurrentPlayer()->SetState( IPlayer::PS_Dead ); // 通知别人自己挂了 ScoreArrivalBag score; score.ip = 0; score.KillCount = pEngine->GetCurrentPlayer()->GetKill(); score.DeathCount = pEngine->GetCurrentPlayer()->GetDeath(); PACKAGE pack; pack.SetCMD( SCORE_ARRIVAL ); pack.SetData( (char*)&score, sizeof( BulletCreateBag ) ); TcpSendTo( m_server_IP, m_target_port, pack ); //m_network->SendTo( m_server_IP, pack ); } } // 判断击中目标是否有效 if ( 0 <= bag->target_index && bag->target_index < 100 ) { ISceneManager* smgr = MyIrrlichtEngine::GetEngine()->GetSceneManager(); smgr->getSceneNodeFromId( bag->owner_index ); // 获取命中的节点 ISceneNode* target_node = smgr->getSceneNodeFromId( bag->target_index ); IShip* ship = dynamic_cast<IShip*>( target_node ); if ( ship ) { ship->SetArmor( (f32)bag->armor ); ship->SetShield( (f32)bag->shield ); } //int damage; //// 炮弹 //if ( bag->bullet_type == 0 ) //{ // damage = 10; //} //// 导弹 //else if ( bag->bullet_type == 1 ) //{ // damage = 100; //} } }
static bool loadScene(void) { IrrlichtDevice *device = createDevice(video::EDT_BURNINGSVIDEO, core::dimension2du(160,120), 32); if (!device) return false; IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); // load scene from example, with correct relative path device->getFileSystem()->changeWorkingDirectoryTo("results"); smgr->loadScene("../../media/example.irr"); smgr->addCameraSceneNode(0, core::vector3df(0,0,-50)); device->getFileSystem()->changeWorkingDirectoryTo(".."); bool result = false; device->run(); device->getTimer()->setTime(666); // scene has animations and current scene seems to be saved at that time ... really - best result with just that number :-) if (driver->beginScene(true, true, video::SColor(0, 80, 80, 80))) { smgr->drawAll(); driver->endScene(); // we need to be very sloppy, because the animators will produce a different // start depending on the actual loading time. 97% seems to be safe, as removing // an object produces values around 95% result = takeScreenshotAndCompareAgainstReference(driver, "-loadScene.png", 97.4f); if (!result) logTestString("Rendering the loaded scene failed.\n"); } ISceneNode* node = smgr->getSceneNodeFromId(128); if (!node) result=false; else if (result) // only check if scene was correctly loaded { result &= (node->getChildren().size()==0); if (!result) logTestString("Node has an illegal child node.\n"); device->getSceneManager()->loadScene("results/scene2.irr", 0, node); result &= (node->getChildren().size()!=0); if (!result) logTestString("Loading second scene as child failed.\n"); } device->closeDevice(); device->run(); device->drop(); return result; }
ActionManager::ActionManager(IrrlichtDevice* dev, ISceneNode* root, Craft* f, SETTINGS_STRUCT* set) : device(dev), rootNode(root), SETTINGS(set) { //if(!scene) log << "NULL cout" << endl; leftShotTime = 0; rightShotTime = 0; currentTime = 0; gameOverTime = 0; currentScore = 0; delay = 5; inGame = true; leftPressed = false; rightPressed = false; ISceneManager* scene = device->getSceneManager(); fighter = scene->getSceneNodeFromId(NEWGAME_ELEMENT::NEWGAME_FIGHTER); //fighter->setDebugDataVisible(scene::EDS_BBOX); craftPool.push_back(f); enemyRoot = scene->addEmptySceneNode(rootNode); //scene node that contains all enemy crafts //open sound effects rocketSound = OpenSoundEffect(audioDevice, "../res/sound/rocket.wav", MULTIPLE); rocketSound->setPan(0); // 0 Left, 1 Right rocketSound->setPitchShift(1.5); explosionSound = OpenSoundEffect(audioDevice, "../res/sound/explosion.wav", MULTIPLE); explosionSound->setPan(0); // 0 Left, 1 Right explosionSound->setPitchShift(2.0); IGUIFont* font = device->getGUIEnvironment()->getFont("button_font.xml"); score = scene->addTextSceneNode(font, L"", SColor(100,255,255, 255), rootNode, vector3df(0,SH_SF - 20,0)); updateScore(); /* ISceneNode* sphere_1 = scene->addSphereSceneNode(); sphere_1->setPosition(vector3df(0,0,0)); ISceneNode* sphere_2 = scene->addSphereSceneNode(); sphere_2->setPosition(vector3df(-10,-10,0)); */ enemyGenerator = new EnemyGenerator(SETTINGS->gameMode, device, enemyRoot, craftPool); }
// ---------------------------------------------------------------------------- void Track::quit() { if (m_terrain) m_terrain->remove(); m_terrain = 0; int i = 1; ISceneManager* sm = Editor::getEditor()->getSceneManager(); ISceneNode* node; while ((node = sm->getSceneNodeFromId(MAGIC_NUMBER + i))) { node->remove(); i++; } IRoad* r; for (u32 i = 0; i < m_roads.size(); i++) { r = m_roads[i]; r->getSpline()->remove(); r->remove(); } } // quit
// ---------------------------------------------------------------------------- void Track::exportElements(std::ofstream& stream, bool obj) { ISceneManager* sm = Editor::getEditor()->getSceneManager(); ISceneNode* node; stringc name; int i = 1; while ((node = sm->getSceneNodeFromId(MAGIC_NUMBER + i))) { name = node->getName(); vector3df pos, rot, sca; if (node->isVisible() && name != "banana" && name != "item" && name != "small-nitro" && name != "big-nitro" && (name.equalsn("obj/", 4) == obj)) { pos = node->getPosition(); rot = node->getRotation(); sca = node->getScale(); if (name.equalsn("obj/", 4)) { stream << " <static-object model=\"" << Editor::toRelative(name).c_str(); copyObj(name); ITexture* tex; for (int j = 0; (tex = node->getMaterial(0).getTexture(j)); j++) copyObj(stringc("obj/") + Editor::toRelative(tex->getName())); } // export as static-object else { stream << " <library name=\"" << Editor::getLib(node->getName()).c_str(); } // export as library stream << "\" xyz=\""; stream << pos.X << " " << pos.Y << " " << pos.Z << "\" hpr=\""; stream << rot.X << " " << rot.Y << " " << rot.Z << "\" scale=\""; stream << sca.X << " " << sca.Y << " " << sca.Z << "\"/>\n"; } i++; } } // exportElements
// ---------------------------------------------------------------------------- void Track::build() { IrrlichtDevice* device = Editor::getEditor()->getDevice(); PHYSFS_setWriteDir(Editor::getEditor()->getTrackDir().c_str()); PHYSFS_mkdir(m_file_name.c_str()); path p = Editor::getEditor()->getTrackDir() + m_file_name; CMeshBuffer<S3DVertex2TCoords>* mb = m_terrain->build(p); SMesh smesh; smesh.addMeshBuffer(mb); for (u32 i = 1; i < m_roads.size(); i++) { IRoad* r = m_roads[i]; if (r->getSpline()->getPointNum()>1) smesh.addMeshBuffer(((Road*)r)->getMeshBuffer()); } B3DMeshWriter* writer = new B3DMeshWriter(device->getFileSystem()); IWriteFile *file; file = device->getFileSystem()->createAndWriteFile((p + "/track.b3d").c_str()); writer->writeMesh(file, &smesh); file->drop(); delete writer; m_driveline->build(p); std::ofstream mat; mat.open((p + "/materials.xml").c_str()); mat << "<materials>\n"; mat << " <material name=\"splatt.png\" graphical-effect=\"splatting\""; SMaterial m = m_terrain->getMaterial(0); for (int i = 1; i < 5; i++) { mat << " splatting-texture-" << i << "=\""; mat << Editor::toRelative(m.getTexture(i+1)->getName()).c_str(); mat << "\""; } mat << "/>\n"; if (m_gravity_road) { for (u32 i = 1; i < m_roads.size(); i++) { stringc tex = m_roads[i]->getTexName(); if (tex.size()>0) { mat << " <material name=\""; mat << tex.c_str(); mat << "\" has-gravity=\"yes\" />\n"; } } // roads } // gravity road mode mat <<"</materials>\n"; mat.close(); stringw track; track += "<track name = \""; track += m_track_name + L"\"\n"; track += " version = \"5\"\n"; track += " groups = \"made-by-STK-TE\"\n"; track += " designer = \""; track += m_designer + "\"\n"; track += " music = \""; track += m_music.c_str(); track += "\"\n"; track += " screenshot = \"screenshot.jpg\"\n"; track += " smooth-normals = \"true\"\n"; track += " reverse = \"Y\"\n>\n"; track += "</track>\n"; PHYSFS_uint64 len = 4 * track.size(); char* dst = new char[len]; #ifdef _WIN32 PHYSFS_utf8FromUcs2((PHYSFS_uint16*)track.c_str(),dst,len); #else PHYSFS_utf8FromUcs4((PHYSFS_uint32*)track.c_str(), dst, len); #endif FILE* f; f = fopen((p + "/track.xml").c_str(), "wb"); fwrite(dst, sizeof(char), strlen(dst), f); fclose(f); delete[] dst; std::ofstream scene; scene.open((p + "/scene.xml").c_str()); scene << "<scene>\n"; scene << " <track model=\"track.b3d\" x=\"0\" y=\"0\" z=\"0\">\n"; exportElements(scene, true); scene << " </track>\n"; exportElements(scene, false); ISceneManager* sm = Editor::getEditor()->getSceneManager(); ISceneNode* node; int i = 1; stringc name; while ((node = sm->getSceneNodeFromId(MAGIC_NUMBER + i))) { name = node->getName(); vector3df pos; if (node->isVisible() && (name == "banana" || name == "item" || name == "small-nitro" || name == "big-nitro")) { pos = node->getPosition(); scene << " <" << name.c_str() << " x=\"" << pos.X << "\" y=\"" << pos.Y << "\" z=\"" << pos.Z << "\" />\n"; } i++; } scene << Viewport::get()->getSky()->getXmlString().c_str(); Viewport::get()->printCheckLine(&scene); scene << " <default-start karts-per-row = \"3\"\n"; scene << " forwards-distance =\"1.50\"\n"; scene << " sidewards-distance=\"3.00\"\n"; scene << " upwards-distance =\"0.10\"/>\n"; scene << "</scene>\n"; scene.close(); MsgWndw::get()->showMsg(_("Track exported!")); } // build
// ---------------------------------------------------------------------------- void Track::save() { FILE* pFile = 0; path p = Editor::getEditor()->getMapsPath() + "/" + m_file_name.c_str(); pFile = fopen(p.c_str(), "wb"); if (!pFile) { MsgWndw::get()->showMsg(_("Save failed: file could not be created!\n")); return; } // SIGN u64 sign = TOP_SECRET_SIGNATURE_NUMBER; fwrite(&sign, sizeof(u64), 1, pFile); // TRACK NAME u8 size = m_track_name.size() + 1; fwrite(&size, sizeof(u8), 1, pFile); fwrite(m_track_name.c_str(), sizeof(wchar_t), size, pFile); // DESIGNER NAME size = m_designer.size() + 1; fwrite(&size, sizeof(u8), 1, pFile); fwrite(m_designer.c_str(), sizeof(wchar_t), size, pFile); // FILE NAME size = m_file_name.size() + 1; fwrite(&size, sizeof(u8), 1, pFile); fwrite(m_file_name.c_str(), sizeof(c8), size, pFile); // MUSIC size = m_music.size() + 1; fwrite(&size, sizeof(u8), 1, pFile); fwrite(m_music.c_str(), sizeof(c8), size, pFile); // TERRAIN m_terrain->save(pFile); // SKY Viewport::get()->getSky()->save(pFile); // GRAVITY ROAD FLAG fwrite(&m_gravity_road, sizeof(bool), 1, pFile); // ROADS size = m_roads.size(); fwrite(&size, sizeof(u8), 1, pFile); IRoad* r; for (u8 i = 0; i < size; i++) { r = m_roads[i]; r->save(pFile); } //CHECKLINES Viewport::get()->saveCheckLines(pFile); // OBJECTS ISceneManager* sm = Editor::getEditor()->getSceneManager(); ISceneNode* node; u32 num = Viewport::getLastEntityID() - MAGIC_NUMBER; u32 vnum = 0; for (u32 i = 0; i < num; i++) { node = sm->getSceneNodeFromId(MAGIC_NUMBER + i + 1); if (node && node->isVisible()) vnum++; } fwrite(&vnum, sizeof(u32), 1, pFile); for (u32 i = 0; i < num; i++) { node = sm->getSceneNodeFromId(MAGIC_NUMBER + i + 1); assert(node); if (node->isVisible()) { fwrite(&node->getPosition(), sizeof(vector3df), 1, pFile); fwrite(&node->getRotation(), sizeof(vector3df), 1, pFile); fwrite(&node->getScale(), sizeof(vector3df), 1, pFile); u8 size = strlen(node->getName()) + 1; fwrite(&size, sizeof(u8), 1, pFile); fwrite(node->getName(), sizeof(c8), size, pFile); } } fclose(pFile); Editor::getEditor()->addToRecentlyOpenedList(m_file_name); MsgWndw::get()->showMsg(_("Track saved!\n")); } // save