Mercurial > hg > Members > e085722 > Cerium
view Renderer/Test_/boss1_action.cc @ 5:8f445f1bfe66 default tip
3d camera
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 06 Dec 2010 17:20:56 +0900 |
parents | b5b462ac9b3b |
children |
line wrap: on
line source
#include "SceneGraphRoot.h" #include "MainLoop.h" #include "boss1_action.h" /* static void null_move(SceneGraphPtr node, int screen_w, int screen_h) { } */ static void null_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree) { } static void boss1_move_right(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { node->xyz[0] += node->stack_xyz[0]; if(node->xyz[0] > (screen_w - boss_radius_x)) { node->set_move_collision(boss1_move_left, null_collision); } } //ボスが左に移動する動作 static void boss1_move_left(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { node->xyz[0] -= node->stack_xyz[0]; if(node->xyz[0] < boss_radius_x) { node->set_move_collision(boss1_move_right, null_collision); } } //ボスが戦闘位置へ戻る時の動作 /* static void boss1_move_return(SceneGraphPtr node, int screen_w, int screen_h) { node->xyz[1] -= node->stack_xyz[1]; node->xyz[2] -= node->stack_xyz[2]; if((node->xyz[2] = 0)) { node->stack_xyz[0] = 1.0; node->set_move_collision(boss1_move_left, null_collision); } } */ //ボス登場時の動き /* static void boss1_first_move(SceneGraphPtr node, int screen_w, int screen_h) { node->xyz[1] += node->stack_xyz[1]; if(node->xyz[1] > screen_h) { float time = first_boss1_depth / node->stack_xyz[2]; node->stack_xyz[1] = (screen_h - boss_radius_y) / time; node->stack_xyz[2] = return_boss1_depth_speed; node->set_move_collision(boss1_move_return, null_collision); } } */ static void player_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; Pad *pad = sgroot->getController(); if (pad->left.isPush() || pad->left.isHold()) { #if 0 SceneGraphPtr player_left; player_left = sgroot->createSceneGraph(PLAYER_L); player_left->set_move_collision(player_move_left, null_collision); player_left->xyz[0] = node->xyz[0]; player_left->xyz[1] = node->xyz[1]; node->addChild(player_left); node->flag_drawable = 1; #endif node->xyz[0] -= player_speed; if (node->xyz[0] - player_radius< 0) { node->xyz[0] = player_radius; } } if (pad->right.isPush() || pad->right.isHold()) { node->xyz[0] += player_speed; if (node->xyz[0] + player_radius > screen_w) { node->xyz[0] = screen_w - player_radius; } } if (pad->up.isPush() || pad->up.isHold()) { node->xyz[1] -= player_speed; if (node->xyz[1] - player_radius < 0) { node->xyz[1] = player_radius; } } if (pad->down.isPush() || pad->down.isHold()) { node->xyz[1] += player_speed; if (node->xyz[1] + player_radius > screen_h) { node->xyz[1] = screen_h - player_radius; } } if (pad->circle.isPush()) { SceneGraphPtr shot = sgroot->createSceneGraph("P_SHOT1"); shot->set_move_collision(shot_move, shot_collision); shot->xyz[0] = node->xyz[0]; shot->xyz[1] = node->xyz[1] - player_radius; node->addBrother(shot); } } static int boss1sgid; static void player_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h, SceneGraphPtr tree) { SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; //自機とボスのx,y座標での距離と2点間の距離 static float x_distant, y_distant, distance; //ボスの四角形の四隅の座標 // static float boss_low_x, boss_low_y, boss_high_x, boss_high_y; SceneGraphIteratorPtr it = sgroot->getIterator(tree); for (; it->hasNext(boss1sgid);) { it->next(boss1sgid); SceneGraphPtr enemy = it->get(); //各変数の初期化 x_distant = node->xyz[0] - enemy->xyz[0]; y_distant = node->xyz[1] - enemy->xyz[1]; //hypotfで2点間の距離を求める distance = hypotf(x_distant, y_distant); /*四角形と円のcollision if( (fabs( node->xyz[1] - ( boss_low_y ))) */ //円同士のcollision if(distance < (player_radius + boss_radius_y)) { printf("!!!CAUTION!!!\n"); } } } static void shot_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { node->xyz[1] -= shot_speed; // 描画領域から抜けたら削除 if (node->xyz[1] < 0) { node->remove(); } } static void shot_collision(SceneGraphPtr node, void *sgroot_, int screen_2, int screen_h, SceneGraphPtr tree) { SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; //自機とボスのx,y座標での距離と2点間の距離 static float x_distant, y_distant, distance; //ボスの四角形の四隅の座標 // static float boss_low_x, boss_low_y, boss_high_x, boss_high_y; SceneGraphIteratorPtr it = sgroot->getIterator(tree); for (; it->hasNext(boss1sgid);) { it->next(boss1sgid); SceneGraphPtr enemy = it->get(); x_distant = node->xyz[0] - enemy->xyz[0]; y_distant = node->xyz[1] - enemy->xyz[1]; //hypotfで2点間の距離を求める distance = hypotf(x_distant, y_distant); //円同士のcollision if(distance < boss_radius_y) { SceneGraphPtr blast = sgroot->createSceneGraph("BLAST1"); blast->set_move_collision(blast_move, null_collision); blast->xyz[0] = node->xyz[0]; blast->xyz[1] = node->xyz[1]; node->addBrother(blast); node->remove(); } } } extern Application * application() { return new boss1_action(); } const char *usr_help_str = "Usage: ./test_nogl [OPTION]\n"; static int blast8; static void blast_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h) { SceneGraphRoot *sgroot = (SceneGraphRoot *)sgroot_; if(node->sgid > blast8) { SceneGraphPtr blast = sgroot->createSceneGraph(node->sgid - 1); blast->set_move_collision(blast_move, null_collision); blast->xyz[0] = node->xyz[0]; blast->xyz[1] = node->xyz[1]; node->addBrother(blast); } if (node->sgid == blast8) { node->flag_drawable = 1; } if((node->frame > 1)) { node->remove(); } node->frame += 1; } MainLoopPtr boss1_action::init(Viewer *sgroot, int screen_w, int screen_h) { sgroot->createFromXMLfile("xml_file/boss1.xml"); sgroot->createFromXMLfile("xml_file/player1.xml"); sgroot->createFromXMLfile("xml_file/p_shot.xml"); sgroot->createFromXMLfile("xml_file/blast.xml"); blast8 = sgroot->getSgid("BLAST8"); //rootとなるSceneGraphを生成 SceneGraphPtr root = sgroot->createSceneGraph(); //自機の初期化 SceneGraphPtr player = sgroot->createSceneGraph("PLAYER"); player->xyz[0] = screen_w/2; player->xyz[1] = screen_h - player_radius; root->addChild(player); //ボスの初期化 SceneGraphPtr boss1 = sgroot->createSceneGraph("BOSS1"); boss1sgid = boss1->sgid; boss1->xyz[0] = screen_w/2; boss1->xyz[1] = boss_radius_y; // boss1->xyz[2] = first_boss1_depth; boss1->stack_xyz[0] = first_boss1_speed; root->addChild(boss1); //ボスの左右パーツを追加 SceneGraphPtr left_parts = sgroot->createSceneGraph("BOSS1_L"); boss1->addChild(left_parts); SceneGraphPtr right_parts = sgroot->createSceneGraph("BOSS1_R"); boss1->addChild(right_parts); //各機体の動きと当たり判定をセット player->set_move_collision(player_move, player_collision); boss1->set_move_collision(boss1_move_left, null_collision); //仕上げ sgroot->setSceneData(root); return sgroot; } extern int init(TaskManager *manager, int argc, char *argv[]); extern void task_initialize(); static void TMend(TaskManager *manager); int TMmain(TaskManager *manager, int argc, char *argv[]) { task_initialize(); manager->set_TMend(TMend); return init(manager, argc, argv); } void TMend(TaskManager *manager) { printf("test_nogl end\n"); }