# HG changeset patch # User Takao YONAMINE # Date 1311236759 -32400 # Node ID d84ee8b2cfd9fc004a3aeba4a05fd0528553f98c # Parent 586d68c42c5d767887bf5d6697bc40c64398d8bb camera position update diff -r 586d68c42c5d -r d84ee8b2cfd9 Magoroku.o Binary file Magoroku.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 Makefile --- a/Makefile Wed Jul 13 16:59:04 2011 +0900 +++ b/Makefile Thu Jul 21 17:25:59 2011 +0900 @@ -8,8 +8,8 @@ #CFLAGS += -DINVISIBLE_MODE -g $(ABI) -Wall `sdl-config --cflags` `xml2-config --cflags` $(INCLUDE) -CFLAGS += -DINVISIBLE_MODE -g -O0 $(ABI) -Wall `sdl-config --cflags` `xml2-config --cflags` $(INCLUDE) -LIBS += `sdl-config --libs`,-framework,OpenGL -lSDL_mixer -lSDL_image `xml2-config --libs` +CFLAGS += -DINVISIBLE_MODE -g -O0 $(ABI) -Wall `sdl-config --cflags` `xml2-config --cflags` `freetype-config --cflags` $(INCLUDE) +LIBS += `sdl-config --libs`,-framework,OpenGL -lSDL_mixer -lSDL_image `xml2-config --libs` `freetype-config --libs` LIBS += -lCerium -lFifoManager TARGET = magoroku #dandy test1 diff -r 586d68c42c5d -r d84ee8b2cfd9 Makefile~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,42 @@ +# Makefile to build the SDL tests +include ./Makefile.def + +srcdir = . +ABI = -m$(ABIBIT) + +SRCS = game.cc car.cc col.cc quotanion.cc controler.cc field.cc camera.cc gSprite.cc schedule.cc mytype.cc gFont.cc carNode.cc light.cc title_scene.cc game_time.cc ps2util.cc sjoy.cc name_dictionary.cc sound.cc Ss.cc getStrFromFile.cc + + +#CFLAGS += -DINVISIBLE_MODE -g $(ABI) -Wall `sdl-config --cflags` `xml2-config --cflags` $(INCLUDE) +CFLAGS += -DINVISIBLE_MODE -g -O0 $(ABI) -Wall `sdl-config --cflags` `xml2-config --cflags` `freetype-config --cflags` $(INCLUDE) +LIBS += `sdl-config --libs`,-framework,OpenGL -lSDL_mixer -lSDL_image `xml2-config --libs` `freetype-config --libs` +LIBS += -lCerium -lFifoManager + +TARGET = magoroku #dandy test1 + +#TEST = test_vector + +OBJS = ${SRCS:.cc=.o} + + +all: $(TARGET) #${TEST} + +magoroku: $(OBJS) Magoroku.o + $(CC) $(ABI) -o $@ $(OBJS) Magoroku.o $(LIBS) + +#${TEST}: ps2util.o test_vector.o +# ${CC} $(ABI) -o test_vector.o ps2util.o $(LIBS) +# $(CC) -o test_vector.o +# ${CC} -o ${TEST} $^ + + +clean: + rm -f $(TARGET) $(OBJS) main.o sgoex.o Magoroku.o Test.o + +.c.o: + $(CC) $(CFLAGS) $(INCLUDES) -c $< + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDES) -c $< + +debug.o:debug.h diff -r 586d68c42c5d -r d84ee8b2cfd9 Ss.o Binary file Ss.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 TAGS --- a/TAGS Wed Jul 13 16:59:04 2011 +0900 +++ b/TAGS Thu Jul 21 17:25:59 2011 +0900 @@ -1,3 +1,377 @@ + +Magoroku.cc,507 +int runmode;48,1073 +SDL_Joystick *joy;joy50,1087 +const char *usr_help_str usr_help_str52,1107 +Viewer *droot;droot56,1293 +static int screen_w;58,1309 +static int screen_h;59,1333 +Magoroku::init(63,1418 +Application *application(application71,1536 +Magoroku::app_loop(95,2076 +Magoroku::application_task(105,2268 +task_init(115,2398 +FILE *main_fp;main_fp120,2441 +TMmain(123,2461 +TMend(150,2920 +static int light_sysswitch 160,3042 +static int light_num 161,3074 +LightSysSwitch_2(165,3189 + +Ss.cc,403 +int SsUtKeyOn(11,255 +int SsUtKeyOff(17,360 +void SsSetSerialAttr(23,447 +void SsSetSerialVol(28,508 +int SsUtSetReverbType(33,556 +void SsSetMVol(40,612 +void SsUtReverbOn(48,656 +int VSync(55,693 +int SsVabTransfer(63,742 +int SsSeqOpen(71,860 +void SsSeqPlay(78,927 +void SsSeqStop(84,996 +void SsSeqClose(90,1038 +void SsSetTempo(113,1286 +void GetPadBuf(118,1329 +void SsUtSetReverbDepth(123,1406 + +camera.cc,174 +static CAMERA camera,13,234 +static CAMERA camera, def_camera;13,234 +camera_init(17,275 +void set_camera(51,1158 +camera_update(63,1501 +CAMERA get_MagorokuCamera(106,2598 + +car.cc,416 +#define DEFAULT_SET 18,283 +#define BUFSIZE 19,372 +static FVECTOR location 22,427 +static FVECTOR direction 23,468 +car_create(28,547 +car_new_readCSV(107,2883 +CarPtr car_init(153,3875 +car_swerve(176,4298 +car_accelerate(198,4944 +car_field_check(220,5631 +car_move(262,6696 +void car_update(354,9356 +car_destroy(369,9635 +void car_id_update(389,9942 +void setCarTransfer(395,10021 +void setCarMatrix(400,10125 + +carNode.cc,100 +static CarPtr car_list;15,266 +carNode_append(18,296 +carNode_draw(38,597 +carNode_destroy(74,1479 + +col.cc,90 +col_detect_approx(17,406 +col_orthocenter(43,1137 +col_detect(66,1790 +col_init(104,2790 + +controler.cc,72 +struct SGO_PAD pad;18,294 +bool padCheck(24,429 +bool keybord(115,2735 + +field.cc,421 +#define BUFSIZE 17,273 +static int field_num_max 23,374 +static int field_num 27,537 +static FieldPtr field_list;30,625 +static FieldPtr field_actual;33,681 +PolygonInfo* xml_read_file(37,737 +field_create(93,2023 +field_new_readCSV(171,4572 +field_init(253,6176 +field_draw(269,6492 +void field_update(306,7475 +field_destroy(350,8376 +field_rap_increment(386,8899 +field_set_actual(398,9051 +field_get_actual(404,9114 + +gFont.cc,625 +#define DEFOBJ 15,332 +#define SPRITE_COL 16,351 +#define SCREEN_HALF_W 17,375 +#define SCREEN_HALF_H 18,401 +#define CHAR_W_SIZE 19,427 +#define CHAR_H_SIZE 20,450 +static SpriteTable sptable[sptable22,474 +static ps2utilSprite sp[sp23,512 +static unsigned int sp_counter;24,587 +static bool flag_spriteInited 25,620 +gFont_Init_Png(30,747 +gFont_Create(50,1136 +gFont_DefSprite(70,1476 +DefSprite(79,1644 +gFont_Init(93,1952 +gFont_PutSprite(110,2219 +gFont_Clear(131,2698 +gFont_Draw_Reset(142,2823 +get_number_char(150,2916 +gFont_SetString(159,3009 +gFont_SetStringInt(178,3348 +gFont_SetFont_OP(187,3484 + +gSprite.cc,911 +#define DEFOBJ 17,287 +#define SPRITE_COL 18,307 +#define SCREEN_HALF_W 19,331 +#define SCREEN_HALF_H 20,357 +static SpriteTable sptable[sptable22,384 +static ps2utilSprite sp[sp23,420 +static unsigned int sp_counter;24,493 +static bool flag_spriteInited 25,525 +/*static*/SceneGraphPtr root;31,657 +static float my_scale 33,688 +static FVECTOR cameraMan_pos 36,717 +static FVECTOR cameraMan_angle 37,764 +FVECTOR def_cameraMan 39,814 +CameraPtr camera;42,883 +void flip(46,1022 +SceneGraphPtr getRootPtr(90,2455 +float get_cameraPos(101,2572 +void set_cameraMan(112,2748 +void set_cameraPos(127,3151 +gSprite_DefSprite(136,3365 +void gSprite_PutSprite(149,3758 +void gSprite_PutObject(220,5808 +gSprite_PutSpriteEx(288,7757 +gSprite_Init(368,9815 +gSprite_Clear(412,11790 +gSprite_Draw_Reset(425,11919 +gSprite_PutSprite_Pause(435,12012 +void call_createFromXMLfile(440,12080 +void cameraControl(472,12702 + +game.cc,50 +#define linda_init(25,359 +void game_main(28,390 + +game_time.cc,169 +int game_time_get_msec(6,67 +int game_time_conv_ms2cs 29,516 +int game_time_conv_ms2sec 34,603 +int game_time_conv_ms2minute 39,672 +void game_time_set_raptime 56,1044 + +getStrFromFile.cc,27 +int getStrFromFile(18,580 + +light.cc,187 +FMATRIX normal_light;9,124 +FMATRIX light_color;10,146 +void init_light(13,169 +void ps2_vu0_normal_light_matrix(60,1060 +void ps2_vu0_light_color_matrix(66,1213 +void set_light(71,1361 + +linda.cc,967 +static int my_id;18,343 +static CarPtr linda_carlist[linda_carlist19,361 +static int linda_seq[linda_seq20,404 +set_header(25,485 +get_header(35,658 +make_packet(49,879 +send_packet(71,1369 +get_packet(99,2012 +linda_set_schedule(119,2580 +static bool linda_sche_wait0(128,2777 +linda_sche_wait1(153,3304 +linda_sche_wait_ready0(168,3581 +linda_sche_wait_ready1(197,4119 +linda_sche_opening0(212,4392 +linda_sche_opening1(236,4874 +linda_sche_select_car0(251,5155 +linda_sche_select_car1(275,5649 +linda_sche_select_course0(290,5941 +linda_sche_select_course1(324,6648 +linda_sche_ready0(343,7031 +linda_sche_ready1(367,7506 +linda_sche_main_init(382,7780 +linda_sche_main_ready0(417,8526 +linda_sche_main_ready1(441,9001 +linda_sche_main(456,9265 +linda_update(502,10408 +linda_jiki_compareLocation(514,10583 +linda_jiki_compare(541,11108 +linda_jiki_update(555,11399 +linda_update(580,11965 +get_id(677,14415 +void linda_env_init(694,14743 +linda_init(706,14862 + +main.cc,39 +FILE *main_fp;main_fp6,79 +main(9,99 + +mytype.cc,139 +static clock_t start;10,137 +static clock_t race_start;11,159 +wait_init(14,192 +wait(24,315 +time_RaceStart(39,480 +time_RaceTime(45,533 + +name_dictionary.cc,307 +#define NAME_HASH_SIZE 6,80 +#define REHASH_NUM 7,131 +typedef struct name_dic 9,173 +} NAME_DIC;12,238 +static NAME_DIC *name_hash=name_hash14,251 +int hash_func(16,285 +const char *refer_name_dictionary(refer_name_dictionary32,541 +void delete_name_dictionary(62,1356 +int init_name_dictionary(87,1914 + +ps2util.cc,1202 +OBJECT *ps2util_obj_Create_fromXML(ps2util_obj_Create_fromXML20,414 +void ps2util_obj_Set_effect(38,768 +void ps2_vu0_copy_vector(44,891 +void ps2util_obj_Renew_transMatrix(50,1013 +int ps2util_tex_Set(71,1299 +int ps2util_sprite_Create(76,1350 +void ps2util_obj_Set_texture(82,1434 +void ps2_vu0_unit_matrix(89,1564 +void ps2_vu0_rot_matrix_y(103,2160 +void ps2_vu0_apply_matrix(126,2784 +void ps2_vu0_scale_vector(134,3177 +void ps2_vu0_add_vector(144,3525 +void ps2_vu0_outer_product(154,3745 +float ps2_vu0_inner_product(163,3982 +void ps2_vu0_mul_matrix(169,4096 +void ps2_vu0_copy_matrix(193,5833 +void ps2util_obj_Free(198,5938 +void ps2_vu0_sub_vector(205,5993 +void ps2_vu0_normalize(215,6183 +void xml_free(226,6430 +void ps2util_obj_Draw(238,6666 +void ps2util_sprite_Destroy(265,7466 +void ps2util_sprite_Set_basicAttribute(272,7571 +void ps2util_sprite_Request(282,7877 +void ps2util_sprite_Unuse_alpha(288,7938 +void ps2util_graphic_Init(293,8003 +#define SPRITE_HAS_4VERTEXIS 302,8099 +#define PS2_GS_XYZ3 304,8131 +sprite_disappear(307,8223 +int malloc_align16(339,8888 +void ps2util_sprite_Draw(368,9489 +void ps2util_graphic_Finish(373,9558 +void ps2util_sprite_Use_alpha(380,9660 + +quotanion.cc,69 +quotanion(11,226 +quotanion_rotmatrix(25,509 +degree2radian(47,1115 + +schedule.cc,1016 +#define linda_update(33,539 +#define MAXCAR 36,593 +#define MAXFIELD 37,634 +#define MAXRAP 38,678 +#define SP_SEL_CAR 39,713 +#define SP_SEL_COURSE 40,738 +static int start_time,64,1524 +static int start_time,time_count;64,1524 +static int RUNNIG=65,1558 +char raptime[raptime66,1579 +static int ranking 68,1598 +static LIGHT l;69,1622 +static int i=70,1638 +static int change_state 74,1750 +set_schedule_assumption(81,1856 +unset_schedule(96,2371 +set_schedule(102,2425 +graphic_init(109,2523 +play_init(120,2714 +void linda_env_init(135,3003 +static void game_env_init 140,3066 +sche_game_init(156,3300 +sche_game_opening(218,4549 +sche_game_select_car(260,5559 +sche_game_select_course(295,6307 +sche_game_ready(326,7096 +sche_game_main_init(354,7912 +sche_game_main_ready(376,8358 +sche_game_main(384,8496 +sche_game_main_pause(499,11448 +sche_game_main_goal(534,12226 +sche_game_main_finish(565,12963 +sche_game_main_finish2(575,13122 +void wait_sync(586,13313 +void swap_dbuff(592,13383 +schedule(598,13439 + +sjoy.cc,437 +#define N_JOY 14,195 +static const char *g_devName[g_devName16,214 +static int g_fd[g_fd21,286 +int sjoy_open(29,527 +int sjoy_close(52,1101 +struct js_event68,1349 +int g_button[g_button75,1410 +int g_axis[g_axis76,1428 +#define JS_EVENT_INIT 78,1449 +#define JS_EVENT_BUTTON 79,1473 +#define JS_EVENT_AXIS 80,1499 +void sjoy_poll(85,1637 +int sjoy_get_button(119,2314 +int sjoy_get_axis(125,2445 +int sjoy_get_ps2_button(131,2588 + +sound.cc,578 +Mix_Chunk *chunk[chunk14,355 +int channel[channel15,419 +static char buf0[buf019,502 +long vh_addr[vh_addr21,532 +int vb_addr[vb_addr26,643 +int vab[vab31,788 +unsigned char *buf;buf32,820 +int cnt;33,840 +int seqno 34,849 +int seq[seq36,866 +int sdvab;37,898 +int SQ[SQ41,959 +void Soundss(45,1093 +void SoundPlay(108,3399 +void SoundStop(120,3682 +int no_useSDLMixer 133,3965 +InitSdlMixer(136,3995 +void LoadSdlMixer(146,4219 +PlaySdlMixer(175,5174 +PauseSdlMixer(186,5392 +ResumeSdlMixer(197,5565 +TimeSdlMixer(208,5740 +FreeSdlMixer(221,6002 +InitVolume(236,6223 + +test_vector.cc,157 +int main(16,358 +void init_FVECTOR(134,2887 +void init_FMATRIX(144,3081 +void output_FVECTOR(159,3395 +void output_FMATRIX(169,3558 +void all_init(184,3789 + +title_scene.cc,316 + TITLE_INIT,::TITLE_INIT10,123 + TITLE_MAIN,::TITLE_MAIN11,139 + TITLE_FINISH::TITLE_FINISH12,155 +} TITLE_STATE;13,172 +static ps2utilSprite title_sprite;15,188 +#define TITLE_IMG_FILE 19,254 +title_init(23,307 +title_init_call(46,755 +title_finish(52,806 +title_finish_call(60,943 +title_scene(66,990 Magoroku.h,121 #define INCLUDE_MAGOROKU_H2,27 @@ -8,7 +382,7 @@ camera.h,74 #define CAMERA_H2,17 typedef struct camera{camera7,74 -} CAMERA;12,158 +} CAMERA;12,205 car.h,74 #define CAR_H4,27 @@ -58,44 +432,44 @@ gSprite.h,849 #define GSPRITE_H2,18 #define TEST_Z_GRID 7,74 -enum eSpName 11,226 - TITLE 12,241 - SELECT 13,262 - SP_METER 14,283 - R_ARROW 15,304 - L_ARROW 16,325 - KM 17,346 - RAP 18,372 - PLAYER_1 19,391 - PLAYER_2 20,412 - SELECT_CAR_1 22,436 - SELECT_CAR_2 23,457 - SELECT_CAR_3 24,478 - SELECT_CORSE_1 26,502 - SELECT_CORSE_2 27,525 - CHOICE_CAR,35,619 - COURSE1_1,37,674 - COURSE1_2,38,687 - COURSE1_3,39,700 - COURSE2_1,41,716 - COURSE2_2,42,729 - COURSE2_3,43,742 - COURSE3_1,45,756 - COURSE3_2,46,769 - COURSE3_3,47,782 - COURSE4_1,49,796 - COURSE4_2,50,809 - COURSE4_3,51,822 - COURSE5_1,53,838 - COURSE5_2,54,851 - COURSE5_3,55,864 - COURSE6_1,57,878 - COURSE6_2,58,891 - COURSE6_3,59,904 - SP_TABLE_MAX_NUM 61,918 -#define SPRITE_PRIO_FOREGROUND 67,1025 -typedef struct SpriteTable 69,1059 -} SpriteTable;83,1262 +enum eSpName 12,227 + TITLE 13,242 + SELECT 14,263 + SP_METER 15,284 + R_ARROW 16,305 + L_ARROW 17,326 + KM 18,347 + RAP 19,373 + PLAYER_1 20,392 + PLAYER_2 21,413 + SELECT_CAR_1 23,437 + SELECT_CAR_2 24,458 + SELECT_CAR_3 25,479 + SELECT_CORSE_1 27,503 + SELECT_CORSE_2 28,526 + CHOICE_CAR,36,620 + COURSE1_1,38,675 + COURSE1_2,39,688 + COURSE1_3,40,701 + COURSE2_1,42,717 + COURSE2_2,43,730 + COURSE2_3,44,743 + COURSE3_1,46,757 + COURSE3_2,47,770 + COURSE3_3,48,783 + COURSE4_1,50,797 + COURSE4_2,51,810 + COURSE4_3,52,823 + COURSE5_1,54,839 + COURSE5_2,55,852 + COURSE5_3,56,865 + COURSE6_1,58,879 + COURSE6_2,59,892 + COURSE6_3,60,905 + SP_TABLE_MAX_NUM 62,919 +#define SPRITE_PRIO_FOREGROUND 68,1026 +typedef struct SpriteTable 70,1060 +} SpriteTable;84,1263 game.h,81 #define GAME_H4,29 @@ -107,12 +481,12 @@ typedef float FVECTOR[FVECTOR9,75 typedef float FMATRIX[FMATRIX10,131 typedef struct object 44,1398 -} OBJECT;62,1975 -} GsPrim;97,2489 -} GsSpritePacket;107,2610 -} SPRITE;122,2915 -typedef struct popygon 129,3009 -} PolygonInfo;132,3061 +} OBJECT;63,2041 +} GsPrim;98,2555 +} GsSpritePacket;108,2676 +} SPRITE;123,2981 +typedef struct popygon 130,3075 +} PolygonInfo;133,3146 light.h,16 } LIGHT;11,159 @@ -230,378 +604,6 @@ } GsSpritePacket;87,2043 } SpritePacketHeader;102,2557 -Magoroku.cc,507 -int runmode;48,1073 -SDL_Joystick *joy;joy50,1087 -const char *usr_help_str usr_help_str52,1107 -Viewer *droot;droot56,1293 -static int screen_w;58,1309 -static int screen_h;59,1333 -Magoroku::init(63,1418 -Application *application(application71,1536 -Magoroku::app_loop(95,2076 -Magoroku::application_task(105,2268 -task_init(115,2398 -FILE *main_fp;main_fp120,2441 -TMmain(123,2461 -TMend(150,2920 -static int light_sysswitch 160,3042 -static int light_num 161,3074 -LightSysSwitch_2(165,3189 - -Ss.cc,403 -int SsUtKeyOn(11,255 -int SsUtKeyOff(17,360 -void SsSetSerialAttr(23,447 -void SsSetSerialVol(28,508 -int SsUtSetReverbType(33,556 -void SsSetMVol(40,612 -void SsUtReverbOn(48,656 -int VSync(55,693 -int SsVabTransfer(63,742 -int SsSeqOpen(71,860 -void SsSeqPlay(78,927 -void SsSeqStop(84,996 -void SsSeqClose(90,1038 -void SsSetTempo(113,1286 -void GetPadBuf(118,1329 -void SsUtSetReverbDepth(123,1406 - -camera.cc,174 -static CAMERA camera,13,214 -static CAMERA camera, def_camera;13,214 -camera_init(17,255 -void set_camera(51,1136 -camera_update(63,1479 -CAMERA get_MagorokuCamera(106,2576 - -car.cc,442 -#define DEFAULT_SET 18,283 -#define BUFSIZE 19,372 -static FVECTOR location 22,427 -static FVECTOR direction 23,468 -car_create(28,547 -car_new_readCSV(103,2820 -CarPtr car_init(149,3812 -car_swerve(172,4235 -car_accelerate(203,5051 -car_field_check(225,5738 -car_move(267,6803 -car_axis_rotation(294,7495 -void car_update(332,8506 -car_destroy(347,8785 -void car_id_update(367,9092 -void setCarTransfer(373,9171 -void setCarMatrix(378,9275 - -carNode.cc,100 -static CarPtr car_list;15,266 -carNode_append(18,296 -carNode_draw(38,597 -carNode_destroy(73,1645 - -col.cc,90 -col_detect_approx(17,406 -col_orthocenter(43,1137 -col_detect(66,1790 -col_init(104,2790 - -controler.cc,72 -struct SGO_PAD pad;18,294 -bool padCheck(24,429 -bool keybord(115,2735 - -field.cc,421 -#define BUFSIZE 17,295 -static int field_num_max 23,396 -static int field_num 27,559 -static FieldPtr field_list;30,647 -static FieldPtr field_actual;33,703 -PolygonInfo* xml_read_file(37,759 -field_create(93,2045 -field_new_readCSV(163,4154 -field_init(245,5758 -field_draw(261,6074 -void field_update(298,7057 -field_destroy(333,7730 -field_rap_increment(369,8253 -field_set_actual(381,8405 -field_get_actual(387,8468 - -gFont.cc,625 -#define DEFOBJ 15,332 -#define SPRITE_COL 16,351 -#define SCREEN_HALF_W 17,375 -#define SCREEN_HALF_H 18,401 -#define CHAR_W_SIZE 19,427 -#define CHAR_H_SIZE 20,450 -static SpriteTable sptable[sptable22,474 -static ps2utilSprite sp[sp23,512 -static unsigned int sp_counter;24,587 -static bool flag_spriteInited 25,620 -gFont_Init_Png(30,747 -gFont_Create(50,1136 -gFont_DefSprite(70,1476 -DefSprite(79,1644 -gFont_Init(93,1952 -gFont_PutSprite(111,2220 -gFont_Clear(132,2699 -gFont_Draw_Reset(143,2824 -get_number_char(151,2917 -gFont_SetString(160,3010 -gFont_SetStringInt(176,3283 -gFont_SetFont_OP(185,3419 - -gSprite.cc,807 -#define DEFOBJ 17,287 -#define SPRITE_COL 18,307 -#define SCREEN_HALF_W 19,331 -#define SCREEN_HALF_H 20,357 -static SpriteTable sptable[sptable22,384 -static ps2utilSprite sp[sp23,420 -static unsigned int sp_counter;24,493 -static bool flag_spriteInited 25,525 -/*static*/ SceneGraphPtr root;31,657 -static float my_scale 33,689 -static FVECTOR cameraMan 35,717 -FVECTOR def_cameraMan 37,761 -flip(43,860 -SceneGraphPtr getRootPtr(85,2236 -float get_cameraPos(96,2353 -void set_cameraMan(107,2510 -void set_cameraPos(128,3110 -gSprite_DefSprite(136,3236 -void gSprite_PutSprite(149,3629 -void gSprite_PutObject(221,5680 -gSprite_PutSpriteEx(288,7555 -gSprite_Init(368,9613 -gSprite_Clear(413,11591 -gSprite_Draw_Reset(426,11720 -gSprite_PutSprite_Pause(436,11813 -void call_createFromXMLfile(441,11881 - -game.cc,50 -#define linda_init(25,359 -void game_main(28,390 - -game_time.cc,169 -int game_time_get_msec(6,67 -int game_time_conv_ms2cs 29,516 -int game_time_conv_ms2sec 34,603 -int game_time_conv_ms2minute 39,672 -void game_time_set_raptime 56,1044 - -getStrFromFile.cc,27 -int getStrFromFile(17,560 - -light.cc,187 -FMATRIX normal_light;9,124 -FMATRIX light_color;10,146 -void init_light(13,169 -void ps2_vu0_normal_light_matrix(60,1060 -void ps2_vu0_light_color_matrix(66,1213 -void set_light(71,1361 - -linda.cc,967 -static int my_id;18,343 -static CarPtr linda_carlist[linda_carlist19,361 -static int linda_seq[linda_seq20,404 -set_header(25,485 -get_header(35,658 -make_packet(49,879 -send_packet(71,1369 -get_packet(99,2012 -linda_set_schedule(119,2580 -static bool linda_sche_wait0(128,2777 -linda_sche_wait1(153,3304 -linda_sche_wait_ready0(168,3581 -linda_sche_wait_ready1(197,4119 -linda_sche_opening0(212,4392 -linda_sche_opening1(236,4874 -linda_sche_select_car0(251,5155 -linda_sche_select_car1(275,5649 -linda_sche_select_course0(290,5941 -linda_sche_select_course1(324,6648 -linda_sche_ready0(343,7031 -linda_sche_ready1(367,7506 -linda_sche_main_init(382,7780 -linda_sche_main_ready0(417,8526 -linda_sche_main_ready1(441,9001 -linda_sche_main(456,9265 -linda_update(502,10408 -linda_jiki_compareLocation(514,10583 -linda_jiki_compare(541,11108 -linda_jiki_update(555,11399 -linda_update(580,11965 -get_id(677,14415 -void linda_env_init(694,14743 -linda_init(706,14862 - -main.cc,39 -FILE *main_fp;main_fp6,79 -main(9,99 - -mytype.cc,139 -static clock_t start;10,137 -static clock_t race_start;11,159 -wait_init(14,192 -wait(24,315 -time_RaceStart(39,480 -time_RaceTime(45,533 - -name_dictionary.cc,307 -#define NAME_HASH_SIZE 6,80 -#define REHASH_NUM 7,131 -typedef struct name_dic 9,173 -} NAME_DIC;12,238 -static NAME_DIC *name_hash=name_hash14,251 -int hash_func(16,285 -const char *refer_name_dictionary(refer_name_dictionary32,541 -void delete_name_dictionary(62,1356 -int init_name_dictionary(87,1914 - -ps2util.cc,1202 -OBJECT *ps2util_obj_Create_fromXML(ps2util_obj_Create_fromXML20,414 -void ps2util_obj_Set_effect(38,768 -void ps2_vu0_copy_vector(44,891 -void ps2util_obj_Renew_transMatrix(50,1013 -int ps2util_tex_Set(71,1299 -int ps2util_sprite_Create(76,1350 -void ps2util_obj_Set_texture(82,1434 -void ps2_vu0_unit_matrix(89,1564 -void ps2_vu0_rot_matrix_y(103,2160 -void ps2_vu0_apply_matrix(126,2784 -void ps2_vu0_scale_vector(134,3177 -void ps2_vu0_add_vector(144,3525 -void ps2_vu0_outer_product(154,3745 -float ps2_vu0_inner_product(163,3982 -void ps2_vu0_mul_matrix(169,4096 -void ps2_vu0_copy_matrix(193,5833 -void ps2util_obj_Free(198,5938 -void ps2_vu0_sub_vector(205,5993 -void ps2_vu0_normalize(215,6183 -void xml_free(226,6430 -void ps2util_obj_Draw(238,6666 -void ps2util_sprite_Destroy(265,7466 -void ps2util_sprite_Set_basicAttribute(272,7571 -void ps2util_sprite_Request(282,7877 -void ps2util_sprite_Unuse_alpha(288,7938 -void ps2util_graphic_Init(293,8003 -#define SPRITE_HAS_4VERTEXIS 302,8099 -#define PS2_GS_XYZ3 304,8131 -sprite_disappear(307,8223 -int malloc_align16(339,8888 -void ps2util_sprite_Draw(368,9489 -void ps2util_graphic_Finish(373,9558 -void ps2util_sprite_Use_alpha(380,9660 - -quotanion.cc,69 -quotanion(11,226 -quotanion_rotmatrix(25,509 -degree2radian(47,1115 - -schedule.cc,1015 -#define linda_update(33,539 -#define MAXCAR 36,593 -#define MAXFIELD 37,634 -#define MAXRAP 38,678 -#define SP_SEL_CAR 39,713 -#define SP_SEL_COURSE 40,738 -static int start_time,64,1524 -static int start_time,time_count;64,1524 -static int RUNNIG=65,1558 -char raptime[raptime66,1579 -static int ranking 68,1598 -static LIGHT l;69,1622 -static int i=70,1638 -static int change_state 74,1750 -set_schedule_assumption(81,1856 -unset_schedule(88,1972 -set_schedule(94,2026 -graphic_init(101,2124 -play_init(112,2315 -void linda_env_init(128,2652 -static void game_env_init 133,2715 -sche_game_init(149,2949 -sche_game_opening(209,4113 -sche_game_select_car(253,5125 -sche_game_select_course(289,5874 -sche_game_ready(320,6663 -sche_game_main_init(348,7482 -sche_game_main_ready(361,7676 -sche_game_main(369,7814 -sche_game_main_pause(461,10270 -sche_game_main_goal(496,11048 -sche_game_main_finish(527,11775 -sche_game_main_finish2(537,11934 -void wait_sync(548,12125 -void swap_dbuff(554,12195 -schedule(560,12251 - -sjoy.cc,437 -#define N_JOY 14,195 -static const char *g_devName[g_devName16,214 -static int g_fd[g_fd21,286 -int sjoy_open(29,527 -int sjoy_close(52,1101 -struct js_event68,1349 -int g_button[g_button75,1410 -int g_axis[g_axis76,1428 -#define JS_EVENT_INIT 78,1449 -#define JS_EVENT_BUTTON 79,1473 -#define JS_EVENT_AXIS 80,1499 -void sjoy_poll(85,1637 -int sjoy_get_button(119,2314 -int sjoy_get_axis(125,2445 -int sjoy_get_ps2_button(131,2588 - -sound.cc,578 -Mix_Chunk *chunk[chunk14,355 -int channel[channel15,419 -static char buf0[buf019,502 -long vh_addr[vh_addr21,532 -int vb_addr[vb_addr26,643 -int vab[vab31,788 -unsigned char *buf;buf32,820 -int cnt;33,840 -int seqno 34,849 -int seq[seq36,866 -int sdvab;37,898 -int SQ[SQ41,959 -void Soundss(45,1093 -void SoundPlay(108,3399 -void SoundStop(120,3682 -int no_useSDLMixer 133,3965 -InitSdlMixer(136,3995 -void LoadSdlMixer(146,4219 -PlaySdlMixer(175,5174 -PauseSdlMixer(186,5392 -ResumeSdlMixer(197,5565 -TimeSdlMixer(208,5740 -FreeSdlMixer(221,6002 -InitVolume(236,6223 - -test_vector.cc,157 -int main(16,358 -void init_FVECTOR(134,2887 -void init_FMATRIX(144,3081 -void output_FVECTOR(159,3395 -void output_FMATRIX(169,3558 -void all_init(184,3789 - -title_scene.cc,316 - TITLE_INIT,::TITLE_INIT10,123 - TITLE_MAIN,::TITLE_MAIN11,139 - TITLE_FINISH::TITLE_FINISH12,155 -} TITLE_STATE;13,172 -static ps2utilSprite title_sprite;15,188 -#define TITLE_IMG_FILE 19,254 -title_init(23,307 -title_init_call(46,755 -title_finish(52,806 -title_finish_call(60,943 -title_scene(66,990 - title_scene.h,0 getStrFromFile.h,0 diff -r 586d68c42c5d -r d84ee8b2cfd9 camera.cc --- a/camera.cc Wed Jul 13 16:59:04 2011 +0900 +++ b/camera.cc Thu Jul 21 17:25:59 2011 +0900 @@ -6,7 +6,7 @@ #include "game.h" #include "controler.h" #include "camera.h" - +#include "gsprite.h" //大域変数、各部で共有 extern SGO_PAD pad; @@ -39,7 +39,7 @@ //def_cameraをcameraにコピー memcpy( &camera, &def_camera, sizeof(CAMERA)); - set_camera(&def_camera); + //set_camera(&def_camera); } /* diff -r 586d68c42c5d -r d84ee8b2cfd9 camera.cc~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camera.cc~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,109 @@ +#include +#include +#include "libps2.h" +#include "ps2util.h" +#include "car.h" +#include "game.h" +#include "controler.h" +#include "camera.h" + +//大域変数、各部で共有 +extern SGO_PAD pad; + +static CAMERA camera, def_camera; + + +void +camera_init() +{ + //カメラの初期位置設定 + def_camera.xyz[0] = 0; + def_camera.xyz[1] =-7;// -3; + def_camera.xyz[2] =-14; //0; + def_camera.xyz[3] = 1; + + def_camera.zd[0] = 0; + def_camera.zd[1] = 2; + def_camera.zd[2] = 7; + def_camera.zd[3] = 1; + + def_camera.yd[0] = 0; + def_camera.yd[1] = 1; + def_camera.yd[2] = 0; + def_camera.yd[3] = 1; + + def_camera.angle[0]=-0.2;//0; //pich + def_camera.angle[1]=0; //yoh + def_camera.angle[2]=0; //roll + def_camera.angle[3]=0; + + //def_cameraをcameraにコピー + memcpy( &camera, &def_camera, sizeof(CAMERA)); + set_camera(&def_camera); +} + +/* + ps2依存関係から拝借。 + 自分が消したのか、元々無いのかは覚えていないけど + 呼ばれているのでとりあえず(空っぽにしておく)。 +*/ +// set_camera must be called if camera's parameters were moved +void set_camera(CAMERA *camera) +{ + //vu0_rot_camera_matrix(world_view, camera->xyz, camera->zd, camera->yd,camera->angle); +} + + +/** + * pose: カメラの対象物(obj)の座標行列 + * カメラがobjについていくように(そのような動きに見せるため) + * カメラの位置ベクトル、視点ベクトルを更新 + */ +void +camera_update(Game *game, FMATRIX pose) +{ + FVECTOR location, eyes, vertical, angle; + + //int type = game->camera_type; + + ps2_vu0_apply_matrix(location, pose, def_camera.xyz); + ps2_vu0_apply_matrix(eyes, pose, def_camera.zd); + ps2_vu0_apply_matrix(vertical, pose, def_camera.yd); + + /**When the car bends, the angle of the camera is changed**/ + if(pad.left>0 && game->jiki->speed !=0){ + if(game->jiki->speed !=0){ + if(def_camera.angle[1]<=0.2){ + def_camera.angle[1]+=0.02; + } + } + } + else if(pad.right>0 && game->jiki->speed !=0){ + if(game->jiki->speed !=0){ + if(def_camera.angle[1]>=-0.2){ + def_camera.angle[1]-=0.02; + } + } + } + else { + if(def_camera.angle[1]<-0.01){ + def_camera.angle[1]+=0.02; + } + else if(def_camera.angle[1]>0.01){ + def_camera.angle[1]-=0.02; + } + } + + ps2_vu0_apply_matrix(angle, pose, def_camera.angle); + ps2_vu0_copy_vector(camera.xyz, location); + ps2_vu0_copy_vector(camera.zd, eyes); + ps2_vu0_copy_vector(camera.yd, vertical); + ps2_vu0_copy_vector(camera.angle, angle); + set_camera(&camera); +} + + +CAMERA get_MagorokuCamera( void ) +{ + return camera; +} diff -r 586d68c42c5d -r d84ee8b2cfd9 camera.h --- a/camera.h Wed Jul 13 16:59:04 2011 +0900 +++ b/camera.h Thu Jul 21 17:25:59 2011 +0900 @@ -15,6 +15,7 @@ void camera_init(); void set_camera(CAMERA *camera); + CAMERA get_MagorokuCamera( void ); #endif diff -r 586d68c42c5d -r d84ee8b2cfd9 camera.h~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camera.h~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,20 @@ +#ifndef CAMERA_H +#define CAMERA_H + +#include "game.h" +#include "libps2.h" + +typedef struct camera{ + FVECTOR xyz; + FVECTOR zd; + FVECTOR yd; + float angle[4]; // これだけFVECTORじゃない理由は? +} CAMERA; + +void camera_update(Game *game, FMATRIX pose); +void camera_init(); +void set_camera(CAMERA *camera); + +CAMERA get_MagorokuCamera( void ); + +#endif diff -r 586d68c42c5d -r d84ee8b2cfd9 camera.o Binary file camera.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 car.cc --- a/car.cc Wed Jul 13 16:59:04 2011 +0900 +++ b/car.cc Thu Jul 21 17:25:59 2011 +0900 @@ -300,14 +300,14 @@ ps2_vu0_add_vector(car->location, car->location, mov); // いまちょっとコメントアウト:miya - /* + // 壁にぶつかった時の処理 if (car_field_check(game,car) == false) { // 壁にぶつかったら計算前の前フレームの座標にしてsppedは半分 - ps2_vu0_copy_vector(car->location, prev_location); - car->speed = car->speed*0.5; + //ps2_vu0_copy_vector(car->location, prev_location); + //car->speed = car->speed*0.5; } - */ + } diff -r 586d68c42c5d -r d84ee8b2cfd9 car.cc~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/car.cc~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,403 @@ +/* Car.c */ + +#include +#include +#include +#include "libps2.h" +#include "ps2util.h" +#include "field.h" +#include "car.h" +#include "mytype.h" +#include "quotanion.h" +#include "game.h" +#include "stdbool.h" + +#include "gSprite.h" +#include "getStrFromFile.h" + +#define DEFAULT_SET (EFFECT_TEXTURE_USE | EFFECT_ALPHABLEND_UNUSE | EFFECT_SHADING_FLAT) +#define BUFSIZE 256 + +/* 初期位置と初期方向 */ +static FVECTOR location = {0, 0, 0, 1}; +static FVECTOR direction = {0, 0, 0, 1}; + +extern FILE* main_fp; + +static CarPtr +car_create(int car_id, char *filename, char *texname, float speed_accel, + float speed_max, float rot, float brake) +{ + CarPtr car; + OBJECT *body; + //TEXTURE* tex; + void *free_addr; + + // 今はなにもしてない. + body = ps2util_obj_Create_fromXML(filename); + ps2util_obj_Set_effect(body, DEFAULT_SET); + + // xmlファイルから読み込み + call_createFromXMLfile(filename); + + body = (OBJECT*)malloc(sizeof(OBJECT)); + + const char *sStr = "surface name=\""; // この文字列の直後の文字列を取得する + const char *eStr = "\" size="; // この文字列の直前までの文字列を抜き取る + + // xmlファイルから surface name と 数を取得する + body->partNum = getStrFromFile( body->partName, filename, sStr, eStr ); + + /* + for( int i = 0; i < body->partNum; i ++ ){ + gSprite_DefSprite( 100, body->partName[i], 919, 666, 1); + } + */ + + // 初期化 // createScenGraph関数の引数アリと無しの違いは? + //body = droot->createSceneGraph("car"); + + // car = (CarPtr)malloc(sizeof(CarPtr)); + + if (malloc_align16(&free_addr, &car, sizeof(Car)) == -1) { + fprintf(main_fp, "car.c: malloc_align16 error\n"); + exit(EXIT_FAILURE); + } + + car->body = body; + + car->next = NULL; + + car->speed = 0.0; + car->speed_accel = speed_accel; + car->speed_max = speed_max; + car->brake = brake; + car->rotation_angle = rot; + car->y_angle = 0.0; + car->free_addr = free_addr; + + + ps2_vu0_copy_vector(car->direction, direction); + ps2_vu0_copy_vector(car->location, location); + INIT_VECTOR(car->vertical, 0, -1, 0, 1); + INIT_VECTOR(car->body->xyz, 600, 100, 500, 1); + INIT_VECTOR(car->body->angle, 0, 0, 0, 1); + + ps2util_obj_Renew_transMatrix(car->body); + ps2util_obj_Set_effect(car->body, DEFAULT_SET); + + /* + if (*texname != 'n') { + tex = read_png_file(texname); + ps2util_tex_Set(tex); + ps2util_obj_Set_texture(car->body, tex); + } + */ + +#ifdef DEBUG + fprintf(main_fp, "malloc car addr = %x\n", (int)free_addr); +#endif + + return car; +} + +// idは 1 か 2 か 3 で引数取ってこないと落ちるよ +// car/car.dat ファイル内に3つしか車のデータ無から +static CarPtr +car_new_readCSV(FILE *fp, int id) +{ + CarPtr newCar; + int car_id; + float speed_accel, speed_max, brake, rot; + char buff[BUFSIZE], *bufp; + char carImg[BUFSIZE], texImg[BUFSIZE]; + + bool flag; // 探したい車が見つかったらture + + flag = false; + + while ((bufp = fgets(buff, BUFSIZE, fp)) != NULL) { + + bufp++; + + switch (buff[0]) { + case 'n': + if (flag == false) { + + // car_id = car/car.datファイルのnの後ろの数字一文字 + sscanf(bufp, " %d\n", &car_id); + if (id == car_id) { + flag = true; + } + } + break; + case 't': + if (flag == true) { + sscanf(bufp, " %s %s %f %f %f %f\n", + carImg, texImg, &speed_accel, &speed_max, &rot, &brake); + newCar = car_create(id, carImg, texImg, + speed_accel, speed_max, rot, brake); + return newCar; + } + break; + default: + break; + } + } + + /* ここまで辿り着いたら読み込み失敗 */ + fprintf(main_fp, "error - car_new_readCSV\n"); + exit(EXIT_FAILURE); +} + +CarPtr car_init(int id) +{ + CarPtr newCar; + FILE *fp; + const char *filename = "car/car.dat"; + + if (!(fp = fopen(filename, "r"))) { + fprintf(main_fp, "error read file %s\n", filename); + exit(EXIT_FAILURE); + } + + newCar = car_new_readCSV(fp, id); + + fclose(fp); + + return newCar; +} + +/*--------------------------- + carをY軸で回転させる + flg: 回転方向 1:右, -1:左 + ---------------------------*/ +void +car_swerve(CarPtr car, int flg) +{ + FMATRIX rot; + + car->y_angle += (float)flg*car->rotation_angle; + car->y_angle += (car->y_angle < 0) ? 360.0 : 0; + car->y_angle += (car->y_angle > 360.0) ? -360.0 : 0; + + // 下2行目でなんか2重に処理してる気がするけど別に良いのか + ps2_vu0_unit_matrix(rot); + ps2_vu0_rot_matrix_y( rot, rot, degree2radian((float)flg*car->rotation_angle) ); + + FVECTOR v; + ps2_vu0_copy_vector(v, car->direction); + ps2_vu0_apply_matrix(car->direction, rot, v); +} + +/*---------------------------- + carを加速・減速する + (flg == 1) ? 加速 : 減速 + ---------------------------*/ +void +car_accelerate(CarPtr car, int flg) +{ + car->speed += (flg == 1) ? car->speed_accel : -car->brake; + + // speedが0以下にならんように + car->speed = (car->speed < 0) ? 0 : car->speed; + + // speedがMax超えないように + car->speed = (car->speed > car->speed_max) ? car->speed_max : car->speed; +} + + +/*--------------------------------- + 進行後のcarに対してコース面の内外判定を行い、 + : 現在のコース + : 現在のコースの次のコース + : 現在のコースの前のコース + に存在すればTRUEを返す + どのコースにも居ない(壁に衝突した)場合は + FALSEを返す。 + ---------------------------------*/ +static bool +car_field_check(Game *game ,CarPtr car) +{ + FieldPtr p; + FieldPtr f = field_get_actual(); + + // 現在のコースで衝突・内外判定 + p = f; + if (col_detect(&p->colface, car->vertical, car->location) == true) { + goto FIELD_CHECK_OK; + } + + // 現在のコースの次に隣接するコースで衝突・内外判定 + p = f->next; + if (col_detect(&p->colface, car->vertical, car->location) == true) { + if (field_rap_increment(1)) { + game->rap++; + } + goto FIELD_CHECK_OK; + } + + // 現在のコースの前に隣接するコースで衝突・内外判定 + p = f->prev; + if (col_detect(&p->colface, car->vertical, car->location) == true) { + field_rap_increment(-1); + goto FIELD_CHECK_OK; + } + + // どのコース上にも居ない(壁に衝突) + return false; + + FIELD_CHECK_OK: + field_set_actual(p); + return true; +} + + +/*------------------------------ + 速度speedと向きdirectionから + 進行後の位置locationを求める。 + また、進行後の衝突判定も行う。 + ------------------------------*/ +static void +car_move(Game *game,CarPtr car) +{ + FVECTOR mov, prev_location; + + printf("car->speed = %f ", car->speed); + printf("\n"); + + printf("car->body->xyz[y] = %f ", car->body->xyz[1]); + printf("car->body->xyz[z] = %f ", car->body->xyz[2]); + printf("car->body->xyz[3] = %f ", car->body->xyz[3]); + printf("\n"); + + printf("car->direction[x] = %f ", car->direction[0]); + printf("car->direction[y] = %f ", car->direction[1]); + printf("car->direction[z] = %f ", car->direction[2]); + printf("car->direction[3] = %f ", car->direction[3]); + printf("\n"); + + printf("car->location[x] = %f ", car->location[0]); + printf("car->location[y] = %f ", car->location[1]); + printf("car->location[z] = %f ", car->location[2]); + printf("car->location[3] = %f ", car->location[3]); + + printf("\n"); + + // movは車の移動量を計算して入れるのかな。たぶん + ps2_vu0_scale_vector(mov, car->direction, car->speed); + + printf("mov[x] = %f ", mov[0]); + printf("mov[y] = %f ", mov[1]); + printf("mov[z] = %f ", mov[2]); + printf("mov[3] = %f ", mov[3]); + printf("\n"); + + // 前フレームのcar->locationをprev_locationに保存 + ps2_vu0_copy_vector(prev_location, car->location); + + // 車の現在地 = 車の位置 + 移動量 だと思う多分 + ps2_vu0_add_vector(car->location, car->location, mov); + + // いまちょっとコメントアウト:miya + /* + // 壁にぶつかった時の処理 + if (car_field_check(game,car) == false) { + // 壁にぶつかったら計算前の前フレームの座標にしてsppedは半分 + ps2_vu0_copy_vector(car->location, prev_location); + car->speed = car->speed*0.5; + } + */ + +} + + +static void +car_axis_rotation(CarPtr car) +{ + FMATRIX pose, // 最後にcar->transferにコピーしてる + yrot, + yrotinv; + + ps2_vu0_unit_matrix(yrot); + ps2_vu0_rot_matrix_y(yrot, yrot, -degree2radian(car->y_angle)); + + ps2_vu0_unit_matrix(yrotinv); + ps2_vu0_rot_matrix_y(yrotinv, yrotinv, degree2radian(car->y_angle)); + + { + FVECTOR yd = {0, -1, 0, 1}; + FVECTOR rotaxis; + FVECTOR q; + + ps2_vu0_outer_product(rotaxis, car->vertical, yd); + { + float scale=1/NORM(rotaxis); + rotaxis[0] *= scale; + rotaxis[1] *= scale; + rotaxis[2] *= scale; + } + + quotanion(q, rotaxis, acos(ps2_vu0_inner_product(yd, car->vertical)/(NORM(yd)*NORM(car->vertical)))); + quotanion_rotmatrix(pose, q); + } + + ps2_vu0_mul_matrix(pose, yrot, pose); + ps2_vu0_mul_matrix(pose, pose, yrotinv); + ps2_vu0_copy_matrix(car->body->transfer, pose); + //ps2_vu0_copy_matrix( &(car->body->matrix), pose); + ps2_vu0_rot_matrix_y(car->body->transfer, car->body->transfer, degree2radian(car->y_angle)); +} + + + +void car_update( Game *game, CarPtr car ) +{ + // 移動 ここで壁との当たり判定もしとる + car_move(game,car); + + // 摩擦による速度減少 + car->speed -= 0.005; + car->speed = (car->speed < 0) ? 0 : car->speed; + + // 傾き + car_axis_rotation(car); +} + + +void +car_destroy(CarPtr p) +{ + /* + TEXTURE *t; + + if ((t = p->body->surfaces->texture)) { + //ps2util_tex_Exclude(t); + free_texture(t); + } + */ + + ps2util_obj_Free(p->body); + free(p->free_addr); + +#ifdef DEBUG + fprintf(main_fp, "free car addr = %x\n", (int)p->free_addr); +#endif +} + +// 適当に自作 +void car_id_update(Game *game, CarPtr jiki) +{ + printf("car_id_update\n"); +} + + +void setCarTransfer(CarPtr car) +{ + // memcpy(car->transfer, car->body->matrix, sizeof(FMATRIX) ); +} + +void setCarMatrix(CarPtr car) +{ + // memcpy(car->body->matrix, car->transfer, sizeof(FMATRIX) ); +} diff -r 586d68c42c5d -r d84ee8b2cfd9 car.o Binary file car.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 carNode.cc --- a/carNode.cc Wed Jul 13 16:59:04 2011 +0900 +++ b/carNode.cc Thu Jul 21 17:25:59 2011 +0900 @@ -35,12 +35,13 @@ void -carNode_draw() +carNode_draw(CarPtr car) { CarPtr p = car_list; - - memcpy(p->body->xyz, p->location, sizeof(FVECTOR)); - memcpy(p->body->angle, p->direction, sizeof(FVECTOR)); + + + memcpy(p->body->xyz, car->location, sizeof(FVECTOR)); + memcpy(p->body->angle, car->direction, sizeof(FVECTOR)); /* printf("car->speed = %f ", p->speed); @@ -62,11 +63,11 @@ // 登録した車の数だけ繰り返す? // けど、どうぜ1台しかいないんじゃないの? - while (p) { + //while (p) { gSprite_PutObject( CHOICE_CAR, p->body ); //ps2util_obj_Draw(p->body); - p = p->next; - } + //p = p->next; + //} } void diff -r 586d68c42c5d -r d84ee8b2cfd9 carNode.cc~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/carNode.cc~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,82 @@ +#include +#include +#include "libps2.h" +#include "ps2util.h" +#include "car.h" +#include "game.h" +#include "carNode.h" + +#include "gSprite.h" + +/* --- car.c --- */ +void car_destroy(CarPtr car); + +// Carポインターの最初。Rootって言うの? +static CarPtr car_list; + +void +carNode_append(CarPtr newCar) +{ + printf("carNode_append()\n"); + CarPtr p = car_list; + + if (!p) { + // ここでCar構造体のルート部分設定 + car_list = newCar; + + } else { + + // car_listの最後に追加 + while (p->next) p = p->next; + p->next = newCar; + + } +} + + +void +carNode_draw() +{ + CarPtr p = car_list; + + memcpy(p->body->xyz, p->location, sizeof(FVECTOR)); + memcpy(p->body->angle, p->direction, sizeof(FVECTOR)); + + /* + printf("car->speed = %f ", p->speed); + printf("\n"); + + printf("p->body->xyz[y] = %f ", p->body->xyz[1]); + printf("p->body->xyz[z] = %f ", p->body->xyz[2]); + printf("p->body->xyz[3] = %f ", p->body->xyz[3]); + printf("\n"); + + printf("p->location[x] = %f ", p->location[0]); + printf("p->location[y] = %f ", p->location[1]); + printf("p->location[z] = %f ", p->location[2]); + printf("p->location[3] = %f ", p->location[3]); + + printf("\n"); + */ + + + // 登録した車の数だけ繰り返す? + // けど、どうぜ1台しかいないんじゃないの? + while (p) { + gSprite_PutObject( CHOICE_CAR, p->body ); + //ps2util_obj_Draw(p->body); + p = p->next; + } +} + +void +carNode_destroy() +{ + CarPtr p = car_list; + + while (p) { + car_destroy(p); + p = p->next; + } + car_list = NULL; +} diff -r 586d68c42c5d -r d84ee8b2cfd9 carNode.h --- a/carNode.h Wed Jul 13 16:59:04 2011 +0900 +++ b/carNode.h Thu Jul 21 17:25:59 2011 +0900 @@ -7,7 +7,7 @@ void car_destroy(CarPtr car); void carNode_append(CarPtr newCar) ; -void carNode_draw(); +void carNode_draw(CarPtr car); void carNode_destroy(); #endif diff -r 586d68c42c5d -r d84ee8b2cfd9 carNode.h~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/carNode.h~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,13 @@ +#ifndef CARNODE_H +#define CARNODE_H + +#include "car.h" + +/* --- car.c --- */ +void car_destroy(CarPtr car); + +void carNode_append(CarPtr newCar) ; +void carNode_draw(); +void carNode_destroy(); + +#endif diff -r 586d68c42c5d -r d84ee8b2cfd9 carNode.o Binary file carNode.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 col.o Binary file col.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 controler.o Binary file controler.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 field.cc --- a/field.cc Wed Jul 13 16:59:04 2011 +0900 +++ b/field.cc Thu Jul 21 17:25:59 2011 +0900 @@ -313,6 +313,9 @@ p->location[0] = -car->location[0]; p->location[1] = -car->location[1]; p->location[2] = -car->location[2]; + //p->location[0] = 0; + //p->location[1] = 0; + //p->location[2] = 0; p->location[3] = 1; field_draw(p); @@ -322,6 +325,9 @@ p->location[0] = -car->location[0]; p->location[1] = -car->location[1]; p->location[2] = -car->location[2]; + //p->location[0] = 0; + //p->location[1] = 0; + //p->location[2] = 0; p->location[3] = 1; field_draw(p); } @@ -332,6 +338,9 @@ p->location[0] = -car->location[0]; p->location[1] = -car->location[1]; p->location[2] = -car->location[2]; + //p->location[0] = 0; + //p->location[1] = 0; + //p->location[2] = 0; p->location[3] = 1; field_draw(p); } diff -r 586d68c42c5d -r d84ee8b2cfd9 field.cc~ --- a/field.cc~ Wed Jul 13 16:59:04 2011 +0900 +++ b/field.cc~ Thu Jul 21 17:25:59 2011 +0900 @@ -10,7 +10,9 @@ #include "quotanion.h" #include -#include "Application.h" +#include "gSprite.h" +#include "getStrFromFile.h" + #define BUFSIZE 256 @@ -30,7 +32,6 @@ // 現在走ってるfield static FieldPtr field_actual; -extern Viewer *droot; // 適当に自作:miya PolygonInfo* xml_read_file(char *colImg) @@ -42,54 +43,54 @@ } - -static FieldPtr -field_create(char *fieldImg, char *colImg )// OBJECT *tex) -{ +/* + static FieldPtr + field_create(char *fieldImg, char *colImg )// OBJECT *tex) + { FieldPtr self; OBJECT *obj; void *free_addr; - // xmlファイル内で名前を個別に付けました // 初期化 droot->createFromXMLfile(fieldImg); obj = droot->createSceneGraph("hoge"); droot->createFromXMLfile(colImg); - OBJECT *col_obj = droot->createSceneGraph("hoge"); - + + // OBJECT *col_obj = droot->createSceneGraph("hoge"); + SceneGraphPtr col_obj = droot->createSceneGraph("hoge"); + if (malloc_align16(&free_addr, &self, sizeof(Field)) == -1) { - fprintf(stderr, "field.c: malloc_align16 error\n"); - fflush(stderr); - exit(EXIT_FAILURE); + fprintf(stderr, "field.c: malloc_align16 error\n"); + fflush(stderr); + exit(EXIT_FAILURE); } self->object = obj; self->next = NULL; self->prev = NULL; self->free_addr = free_addr; -#ifdef DEBUG + #ifdef DEBUG fprintf(main_fp, "malloc fieldNode addr = %x(free), %x(obj)\n", (int)free_addr, (int)self); -#endif + #endif printf("col_init()の直前!\n"); // ちょっと今だけコメント --- col_init(&self->colface, col_obj); -#ifdef DEBUG + #ifdef DEBUG fprintf(main_fp, " facenum = %d\n", self->colface.facenum); fprintf(main_fp, " facenum = %x(free), ", (int)self->colface.free_addr); fprintf(main_fp, "facenum = %x(obj)\n", (int)self->colface.colface); -#endif + #endif return self; -} - + } +*/ -/* static FieldPtr -field_create(char *fieldImg, char *colImg)//, TEXTURE* tex) +field_create(char *fieldImg, char *colImg, int number )//, TEXTURE* tex) { FieldPtr self; OBJECT *obj; @@ -104,22 +105,49 @@ ps2util_obj_Set_effect(obj, DEFAULT_SET); // ps2util_obj_Set_texture(obj, tex); + obj = (OBJECT*)malloc(sizeof(OBJECT)); + + // xmlから読み込み + call_createFromXMLfile(fieldImg); + + const char *sStr = "surface name=\""; // この文字列の直後の文字列を取得する + const char *eStr = "\" size="; // この文字列の直前までの文字列を抜き取る + + // xmlファイルから surface name と 数を取得する + obj->partNum = getStrFromFile( obj->partName, fieldImg, sStr, eStr ); + + /* + char *objName; // xmf内のsurfaceの名前を入れる. オブジェクト名。 + + int objNum = 3; // kinokoコースは一つのxmlファイルに3つずつのsurfaceがある + // rainbowなら2こずつ + + for( int i = 1; i < objNum+1; i ++ ){ + sprintf(objName, "course_%d_%d", number+1, i ); + if( i == 1 ) + obj->name = objName; // obj->nameってcourse1_1か、course1_3かどっちがいいかな + + // これキノココースしか適応できてない。他のコースでも汎用できるアルゴリズム欲しい + gSprite_DefSprite( COURSE1_1+(number*objNum)+i, objName, 100, 100, 1 ); + } + */ + memcpy(obj->xyz, location, sizeof(FVECTOR)); memcpy(obj->angle, direction, sizeof(FVECTOR)); ps2util_obj_Renew_transMatrix(obj); - // ここでxml->sizの数も数えてたんだろうね xml = xml_read_file(colImg); // - if (malloc_align16(&free_addr, &self, sizeof(Field)) == -1) { + if (malloc_align16(&free_addr, &self, sizeof(Field)) == -1 ) { fprintf(stderr, "field.c: malloc_align16 error\n"); fflush(stderr); exit(EXIT_FAILURE); } + self->object = obj; self->next = NULL; self->prev = NULL; @@ -138,7 +166,6 @@ //xml_free(xml); return self; } -*/ static void field_new_readCSV(FILE *fp, int id) @@ -184,7 +211,8 @@ if (flag) { sscanf(bufp, " %s %s\n", fieldImg, colImg); - newField = field_create(fieldImg, colImg );//, tex); + // field_num_max 番目のコース + newField = field_create(fieldImg, colImg, field_num_max );//, tex); if (!fieldHead) { fieldHead = prevField = newField; @@ -240,30 +268,38 @@ static void field_draw(FieldPtr p) { - // field_matrix - FMATRIX fm; - - changeMatrix( fm, p->object->matrix ); + ps2_vu0_unit_matrix(p->object->transfer); - ps2_vu0_unit_matrix(fm); - - fm[3][0] = p->location[0]; - fm[3][1] = p->location[1]; - fm[3][2] = p->location[2]; - fm[3][3] = p->location[3]; - - returnMatrix( p->object->matrix, fm ); - - ps2util_obj_Draw(p->object); - - /* p->object->transfer[3][0] = p->location[0]; p->object->transfer[3][1] = p->location[1]; p->object->transfer[3][2] = p->location[2]; p->object->transfer[3][3] = p->location[3]; + + + // 下の行はしないで良いのかな? + memcpy(p->object->xyz, p->location, sizeof(FVECTOR)); + // memcpy(p->object->angle, p->direction, sizeof(FVECTOR)); + + gSprite_PutObject( COURSE1_1, p->object ); + // ps2util_obj_Draw(p->object); + + // ps2_vu0_unit_matrix(&(p->object->matrix)); + + /* + p->object->matrix[3][0] = p->location[0]; + p->object->matrix[3][1] = p->location[1]; + p->object->matrix[3][2] = p->location[2]; + p->object->matrix[3][3] = p->location[3]; */ - //ps2util_obj_Draw(p->object); + /* + // 上の5この処理、このやり方でも同じか確かめて + for( int i = 0; i < 4; i ++ ) + p->object->matrix[11+i] = p->location[0]; + + // 今ちょっとコメント + ps2util_obj_Draw(p->object); + */ } @@ -274,18 +310,24 @@ p = field_actual; // current - p->location[0] = -car->location[0]; - p->location[1] = -car->location[1]; - p->location[2] = -car->location[2]; + //p->location[0] = -car->location[0]; + //p->location[1] = -car->location[1]; + //p->location[2] = -car->location[2]; + p->location[0] = 0; + p->location[1] = 0; + p->location[2] = 0; p->location[3] = 1; field_draw(p); // next p = field_actual->next; if (p) { - p->location[0] = -car->location[0]; - p->location[1] = -car->location[1]; - p->location[2] = -car->location[2]; + //p->location[0] = -car->location[0]; + //p->location[1] = -car->location[1]; + //p->location[2] = -car->location[2]; + p->location[0] = 0; + p->location[1] = 0; + p->location[2] = 0; p->location[3] = 1; field_draw(p); } @@ -293,9 +335,12 @@ // prev p = field_actual->prev; if (p) { - p->location[0] = -car->location[0]; - p->location[1] = -car->location[1]; - p->location[2] = -car->location[2]; + //p->location[0] = -car->location[0]; + //p->location[1] = -car->location[1]; + //p->location[2] = -car->location[2]; + p->location[0] = 0; + p->location[1] = 0; + p->location[2] = 0; p->location[3] = 1; field_draw(p); } diff -r 586d68c42c5d -r d84ee8b2cfd9 field.o Binary file field.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 gFont.cc --- a/gFont.cc Wed Jul 13 16:59:04 2011 +0900 +++ b/gFont.cc Thu Jul 21 17:25:59 2011 +0900 @@ -23,8 +23,8 @@ static ps2utilSprite sp[DEFOBJ*2]; // 表示スプライト用スタック static unsigned int sp_counter; static bool flag_spriteInited = false; // スプライトロードフラグ +//static TEXTURE *font_tex; -//static TEXTURE *font_tex; static void gFont_Init_Png(const char *texname) @@ -94,7 +94,6 @@ { int i, j; int number = 0; - gFont_Init_Png("img/font.png"); gFont_Create(); // スプライト生成 @@ -167,6 +166,9 @@ str++; x += (int)CHAR_W_SIZE*1.5; } + + //droot->createStringFont(root,"As",80,640,480,0x00ff00ff); + } /* diff -r 586d68c42c5d -r d84ee8b2cfd9 gFont.cc~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gFont.cc~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,187 @@ +/* + * $Id$ + * + * フォント表示。といっても結局スプライトです。 + * gSprite.c と一緒にしてもよかったんだけど + * 文字は文字でいろいろあるので分けてみる + */ +#include +#include +#include +#include "libps2.h" +#include "ps2util.h" +#include "gSprite.h" + +#define DEFOBJ 120 +#define SPRITE_COL 0x4f +#define SCREEN_HALF_W 320 +#define SCREEN_HALF_H 240 +#define CHAR_W_SIZE 17 +#define CHAR_H_SIZE 34 + +static SpriteTable sptable[DEFOBJ]; +static ps2utilSprite sp[DEFOBJ*2]; // 表示スプライト用スタック +static unsigned int sp_counter; +static bool flag_spriteInited = false; // スプライトロードフラグ + +//static TEXTURE *font_tex; + +static void +gFont_Init_Png(const char *texname) +{ + /* + if (!(font_tex = read_png_file(texname))) { + fprintf(stderr, + "cannot creat texture - gFont_Init_Png().\n"); + fflush(stderr); + exit(EXIT_FAILURE); + } + + if (ps2util_tex_Set(font_tex) == -1) { + fprintf(stderr, + "cannot set texture - gFont_Init_Png().\n"); + fflush(stderr); + exit(EXIT_FAILURE); + } + */ +} + +static void +gFont_Create() +{ + /* + int i; + for (i=0; iw = w; + m->h = h; + m->color = (color & 32); + m->mx = w / 2; + m->my = h / 2; + m->tex_w = power_of_two(m->w); + m->tex_h = power_of_two(m->h); + m->texture = (int *)name; +} + +void +gFont_Init() +{ + int i, j; + int number = 0; + + gFont_Init_Png("img/font.png"); + gFont_Create(); // スプライト生成 + + for (i=0; i<7; i++) { + for (j=0; j<15; j++) { + gFont_DefSprite(number, j*17, i*34, 17, 34); + number++; + } + } +} + + +static void +gFont_PutSprite(int number, int x, int y) +{ + ps2utilSprite *p = &sp[sp_counter]; + + // ushortってなんですか?:miya + /* + ps2util_sprite_Set_basicAttribute( + p, + (ushort)x, (ushort)y, + (ushort)sptable[number].tw*1.5, (ushort)sptable[number].th*1.5, + (ushort)sptable[number].tx, (ushort)sptable[number].ty, + (ushort)sptable[number].tw, (ushort)sptable[number].th, + SPRITE_PRIO_FOREGROUND); + */ + + ps2util_sprite_Request(p); + sp_counter++; +} + + +static void +gFont_Clear() +{ + int i; + + for (i=0; isgroot->getCamera(); // SgoexCerium.ccより // カメラの更新はここでやれば良いんだろうね void flip() { - CameraPtr camera = droot->sgroot->getCamera(); + droot->sgroot->flip(); // 前フレームで描画した SceneGraph は削除 // 前フレームに作られた SceneGraph は描画用に移行 // 現フレームで新しく SceneGraph がコピーされるので初期化 + camera = droot->sgroot->getCamera();// droot->sgroot->lightCalc(); - + // rootって変数にカメラの位置設定してるんかな? // じゃあ camera ってなによ root = droot->createSceneGraph(); - //root->xyz[0] = screen_w/2; - //root->xyz[1] = screen_h/2; + //root->xyz[0] = 100; + //root->xyz[1] = 200; set_cameraMan( ); - + /* // カメラの設定は後回しにします意味わからん // magoroku_camera @@ -73,13 +75,13 @@ //camera->yd[i] = mc.yd[i]; } */ - + //droot->createStringFont(root,"A",80,200,100,0x00ff00ff); /*親の回転、座標から、子の回転、座標を算出*/ get_matrix(root->matrix, root->angle, root->xyz, camera->matrix); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ get_matrix(root->real_matrix, root->angle, root->xyz, camera->real_matrix); - + //出力して、次のものを出力するための準備 droot->setSceneData(root); } @@ -100,7 +102,7 @@ { float num; - if( n >= 0 && n <= 3 ) num = root->xyz[n]; + if( n >= 0 && n <= 3 ) num = /*root->xyz[n]*/camera->xyz[n]; else num = 0; return num; @@ -114,9 +116,10 @@ for( int i = 0; i < 4; i ++ ){ // root->xyz[i] = -cameraMan[i] + wp[i]; - root->xyz[i] = cameraMan_pos[i]; - root->angle[i] = cameraMan_angle[i]; + /*root*/camera->xyz[i] = cameraMan_pos[i]; + /*root*/camera->angle[i] = cameraMan_angle[i]; } + } // カメラの位置を引数のヤツに追従する @@ -180,7 +183,6 @@ object->xyz[i] -= get_cameraPos(i); } } - root->addChild(object); float scale[] = {my_scale,my_scale,1}; @@ -242,9 +244,9 @@ } // とりあえず画面の真ん中にしたい - // sgObj->xyz[0] += 100; + //sgObj->xyz[0] += 100; //sgObj->xyz[1] += 100; - // sgObj->xyz[2] += 50; + //sgObj->xyz[2] += 0; memcpy( sgObj->matrix, obj->transfer, sizeof(FMATRIX) ); @@ -253,20 +255,22 @@ float scale[] = {my_scale,my_scale,1}; // パーツ生成 - for( int i = 0; i < obj->partNum; i ++ ){ - + for( int i = 1; i < obj->partNum; i ++ ){ SceneGraphPtr part = droot->createSceneGraph(obj->partName[i]); - + for(int t=0; t < 3; t++){ + part->xyz[t] = sgObj->xyz[t]; + part->angle[t] = sgObj->angle[t]; + } + printf("obj_name:%s\n",obj->partName[i]); // addChildの意味? - //root->addChild(part); - //sgObj->addChild(part); - + /*親の回転、座標から、子の回転、座標を算出*/ get_matrix_scale(part->matrix, part->angle, part->xyz, scale, root->matrix); /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ get_matrix(part->real_matrix, part->angle, part->xyz, root->real_matrix); - + //root->addChild(part); + sgObj->addChild(part); } @@ -275,7 +279,8 @@ // 法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている) get_matrix(sgObj->real_matrix, sgObj->angle, sgObj->xyz, root->real_matrix); - + // + } diff -r 586d68c42c5d -r d84ee8b2cfd9 gSprite.cc~ --- a/gSprite.cc~ Wed Jul 13 16:59:04 2011 +0900 +++ b/gSprite.cc~ Thu Jul 21 17:25:59 2011 +0900 @@ -32,17 +32,19 @@ static float my_scale = 5; -static FVECTOR cameraMan = { 0, 0, 0, 1 }; + +static FVECTOR cameraMan_pos = { 0, 0, 0, 1 }; +static FVECTOR cameraMan_angle = { 0, 0, 0, 1 }; FVECTOR def_cameraMan = { 0, 0, 0, 1 }; void set_cameraMan( void ); // SgoexCerium.ccより -void -flip() +// カメラの更新はここでやれば良いんだろうね +void flip() { - CameraPtr camera = droot->sgroot->getCamera(); + CameraPtr camera = droot->sgroot->getCamera();// droot->sgroot->flip(); // 前フレームで描画した SceneGraph は削除 // 前フレームに作られた SceneGraph は描画用に移行 @@ -54,24 +56,23 @@ // じゃあ camera ってなによ root = droot->createSceneGraph(); - root->xyz[0] = 0; - root->xyz[1] = 0; + //root->xyz[0] = screen_w/2; + //root->xyz[1] = screen_h/2; set_cameraMan( ); - + + /* // カメラの設定は後回しにします意味わからん // magoroku_camera - CAMERA mc = get_MagorokuCamera(); - for( int i = 0; i < 4; i ++ ){ root->xyz[i] = mc.xyz[i]; root->angle[i] = mc.angle[i]; - camera->zd[i] = mc.zd[i]; - camera->yd[i] = mc.yd[i]; + // camera->zd[i] = mc.zd[i]; + //camera->yd[i] = mc.yd[i]; } - + */ /*親の回転、座標から、子の回転、座標を算出*/ get_matrix(root->matrix, root->angle, root->xyz, camera->matrix); @@ -99,7 +100,7 @@ { float num; - if( n > -1 && n < 4 ) num = root->xyz[n]; + if( n >= 0 && n <= 3 ) num = root->xyz[n]; else num = 0; return num; @@ -108,29 +109,24 @@ // カメラの位置設定 void set_cameraMan( void ) { - printf("camera_x = %f, cameraMan_x = %f\n",root->xyz[0], cameraMan[0]); - // window_posの略 FVECTOR wp = {0,0, 1000, 1}; - for( int i = 0; i < 3; i ++ ){ - root->xyz[i] = -cameraMan[i] + wp[i]; + for( int i = 0; i < 4; i ++ ){ + // root->xyz[i] = -cameraMan[i] + wp[i]; + root->xyz[i] = cameraMan_pos[i]; + root->angle[i] = cameraMan_angle[i]; } - /* - root->xyz[0] = - cameraMan[0];//pos[0]; - root->xyz[1] = - cameraMan[1];//pos[1]; - root->xyz[2] = - cameraMan[2] - 1000;//pos[2] - 500; - */ - printf("camera_x = %f, cameraMan_x = %f\n",root->xyz[0], cameraMan[0]); } // カメラの位置を引数のヤツに追従する -// cameraManって変数に数値をコピーさせてるだけですけどね -void set_cameraPos( FVECTOR newCameraMan ) +// ここではcameraManって変数に数値をコピーさせてるだけ +void set_cameraPos( FVECTOR newCameraMan_pos, FVECTOR newCameraMan_angle ) { for( int i = 0; i < 4; i ++ ){ - cameraMan[i] = newCameraMan[i]; + cameraMan_pos[i] = newCameraMan_pos[i]; + cameraMan_angle[i] = newCameraMan_angle[i]; } } @@ -185,10 +181,27 @@ object->xyz[i] -= get_cameraPos(i); } } - root->addChild(object); float scale[] = {my_scale,my_scale,1}; + + if(test == 1){ + SceneGraphPtr wheel1 = droot->createSceneGraph("Cylinder.006"); + for( int i = 0; i < 3; i ++ ){ + wheel1->xyz[i] = object->xyz[i]; + } + root->addChild(wheel1); + //object->addChild(wheel1); + + /*親の回転、座標から、子の回転、座標を算出*/ + get_matrix_scale(wheel1->matrix, wheel1->angle, wheel1->xyz, scale, root->matrix); + + /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ + get_matrix(wheel1->real_matrix, wheel1->angle, wheel1->xyz, root->real_matrix); + } + + + // float scale[] = {my_scale,my_scale,1}; //float c_xyz[] = {0,0,0}; //float c_xyz[] = {0,0,0}; @@ -202,19 +215,21 @@ } - -// 制作途中 -void gSprite_PutObject(bool ScreenPos, OBJECT *obj) +void gSprite_PutObject( int number, OBJECT *obj ) { - SpriteTable *m = &sptable[100]; + /* + SpriteTable *m = &sptable[number]; char *name = (char *) m->texture; if (!name) { printf("PutSprite %d unknown\n",100); return; } + */ - SceneGraphPtr sgObj = droot->createSceneGraph(name); + // どっちにするべき? + //SceneGraphPtr sgObj = droot->createSceneGraph(); + SceneGraphPtr sgObj = droot->createSceneGraph(obj->partName[0]); for( int i = 0; i < 4; i ++ ){ sgObj->xyz[i] = obj->xyz[i]; @@ -226,57 +241,41 @@ sgObj->stack_angle[i] = obj->angle[i]; } - // memcpy( sgObj->matrix, obj->transfer, sizeof(FMATRIX) ); - - - printf("sgObj->x = %f\n", sgObj->xyz[0]); - printf("sgObj->y = %f\n", sgObj->xyz[1]); - printf("sgObj->z = %f\n", sgObj->xyz[2]); - printf("sgObj->3 = %f\n", sgObj->xyz[3]); - - printf("obj->x = %f\n", obj->xyz[0]); - printf("obj->y = %f\n", obj->xyz[1]); - printf("obj->z = %f\n", obj->xyz[2]); - printf("obj->3 = %f\n", obj->xyz[3]); - - - /* - // 画面からの座標で表示したい場合 - if( ScreenPos == true ){ - for( int i = 0; i < 3; i ++ ){ - Sgobj->xyz[i] -= get_cameraPos(i); - } - } - */ - + // とりあえず画面の真ん中にしたい + //sgObj->xyz[0] += 100; + //sgObj->xyz[1] += 100; + //sgObj->xyz[2] += 0; + + memcpy( sgObj->matrix, obj->transfer, sizeof(FMATRIX) ); root->addChild(sgObj); float scale[] = {my_scale,my_scale,1}; - - SceneGraphPtr wheel1 = droot->createSceneGraph("Cylinder.006"); - for( int i = 0; i < 3; i ++ ){ - wheel1->xyz[i] = sgObj->xyz[i]; + + // パーツ生成 + for( int i = 1; i < obj->partNum; i ++ ){ + SceneGraphPtr part = droot->createSceneGraph(obj->partName[i]); + + // addChildの意味? + + + + /*親の回転、座標から、子の回転、座標を算出*/ + get_matrix_scale(part->matrix, part->angle, part->xyz, scale, root->matrix); + + /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ + get_matrix(part->real_matrix, part->angle, part->xyz, root->real_matrix); + //root->addChild(part); + //sgObj->addChild(part); } - root->addChild(wheel1); - //object->addChild(wheel1); - - /*親の回転、座標から、子の回転、座標を算出*/ - get_matrix_scale(wheel1->matrix, wheel1->angle, wheel1->xyz, scale, root->matrix); - - /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ - get_matrix(wheel1->real_matrix, wheel1->angle, wheel1->xyz, root->real_matrix); - - - - /*親の回転、座標から、子の回転、座標を算出*/ + // 親の回転、座標から、子の回転、座標を算出 get_matrix_scale(sgObj->matrix, sgObj->angle, sgObj->xyz, scale, root->matrix); - /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/ + // 法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている) get_matrix(sgObj->real_matrix, sgObj->angle, sgObj->xyz, root->real_matrix); - + // } @@ -386,7 +385,6 @@ // testCoeler int tc = 1; - gSprite_DefSprite( TITLE, "title", 512, 666, tc); // タイトル gSprite_DefSprite( SELECT, "select", 33, 33, tc); // 選択マーク gSprite_DefSprite( SP_METER, "sp_meter", 106, 34, tc); // スピードメーター @@ -439,20 +437,105 @@ droot->createFromXMLfile(filename); } + // createScenGraphe()する +/* OBJECT* call_createSceneGraph( char *filename ) { - OBJECT *obj; + OBJECT *obj; obj = droot->createSceneGraph(filename); return obj; } -// createScenGraphe()する + +// createScenGraphe()する OBJECT* call_createSceneGraph( void ) { - OBJECT *obj; + OBJECT *obj; obj = droot->createSceneGraph(); return obj; } +*/ + +#include "controler.h" +// controler.cより +extern SGO_PAD pad; + +// テスト用関数 +void cameraControl( void ) +{ + FVECTOR xyz; + FVECTOR angle; + + for( int i = 0; i < 4; i ++ ){ + xyz[i] = cameraMan_pos[i]; + angle[i] = cameraMan_angle[i]; + } + + float speed = 1.0f; + + bool esc = false; + + if( pad.se > 0 ){ + esc = true; + printf("press selectButton\n"); + } + + if( pad.l1 > 0 ){ + speed = 10.0f; + printf("press W_key\n"); + } + + if( pad.left > 0 ){ + if ( esc == true ) angle[0] -= speed; + else xyz[0] -= speed; + } + if( pad.right > 0 ){ + if ( esc == true ) angle[0] += speed; + else xyz[0] += speed; + } + + if( pad.up > 0 ){ + if ( esc == true ) angle[1] -= speed; + else xyz[1] -= speed; + } + if( pad.down > 0 ){ + if ( esc == true ) angle[1] += speed; + else xyz[1] += speed; + } + + if( pad.circle > 0 ){ + if ( esc == true ) angle[2] += speed; + else xyz[2] += speed; + } + if( pad.cross > 0 ){ + if ( esc == true ) angle[2] -= speed; + else xyz[2] -= speed; + } + + for( int i = 0; i < 3; i ++ ){ + if (angle[i] > 360.0f || angle[i] < -360.0f ) { + angle[i] = 0.0f; + } + } + + for( int i = 0; i < 4; i ++ ){ + + cameraMan_pos[i] = xyz[i]; + cameraMan_angle[i] = angle[i]; + } + + for( int i = 0; i < 4; i ++ ){ + printf("cameraPos[%d] = %f ", i, cameraMan_pos[i] ); + } + printf("\n"); + + for( int i = 0; i < 4; i ++ ){ + printf("cameraAngle[%d] = %f ", i, cameraMan_angle[i] ); + } + printf("\n"); + + +} diff -r 586d68c42c5d -r d84ee8b2cfd9 gSprite.h --- a/gSprite.h Wed Jul 13 16:59:04 2011 +0900 +++ b/gSprite.h Thu Jul 21 17:25:59 2011 +0900 @@ -6,6 +6,7 @@ //+415.692169 #define TEST_Z_GRID -700 // とりあえず + // enum_SpriteNameの略 // 数値に意味が無いんだったら、普通に0から始めましょう enum eSpName { diff -r 586d68c42c5d -r d84ee8b2cfd9 gSprite.h~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gSprite.h~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,130 @@ +#ifndef GSPRITE_H +#define GSPRITE_H + +#include "Magoroku.h" + +//+415.692169 +#define TEST_Z_GRID -700 // とりあえず + +// enum_SpriteNameの略 +// 数値に意味が無いんだったら、普通に0から始めましょう +enum eSpName { + TITLE = 10, + SELECT = 17, + SP_METER = 23, + R_ARROW = 24, + L_ARROW = 25, + KM = 26, // Km/h + RAP = 27, + PLAYER_1 = 28, + PLAYER_2 = 29, + + SELECT_CAR_1 = 51, + SELECT_CAR_2 = 52, + SELECT_CAR_3 = 53, + + SELECT_CORSE_1 = 81, + SELECT_CORSE_2 = 82, + + /* + CAR_ASURADA, + CAR_KART, + CAR_ASURADA_GSX, + CAR_KURUMA, + */ + CHOICE_CAR, // プレイヤーが選択した車. + + COURSE1_1, + COURSE1_2, + COURSE1_3, + + COURSE2_1, + COURSE2_2, + COURSE2_3, + + COURSE3_1, + COURSE3_2, + COURSE3_3, + + COURSE4_1, + COURSE4_2, + COURSE4_3, + + COURSE5_1, + COURSE5_2, + COURSE5_3, + + COURSE6_1, + COURSE6_2, + COURSE6_3, + + SP_TABLE_MAX_NUM // spTableの最大数になるはず +}; + + + +//スプライトの優先順位らしい ? +#define SPRITE_PRIO_FOREGROUND 1 + +typedef struct SpriteTable { + // short dx; + // short dy; + short w; + short h; + short mx; + short my; + int color; + int page; + int tex_w; + int tex_h; + int *texture; + int tex_id; // for open gl + +} SpriteTable; + + + +// extern とってみたけど、なにか不都合ありますか?:miya +void gSprite_Init(); +void gSprite_Draw_Reset(); + +void gSprite_PutSprite(bool ScreenPos,int number, int x, int y, int z, int test); +//void gSprite_PutSpriteEx(int number, int x, int y, float w, float h); +void gSprite_PutSpriteEx(bool ScreenPos, int number, int x, int y, int z, float scalex, float scaley, float angle); + +//void gSprite_DefSprite(int number, int tx, int ty, int tw, int th); +void gSprite_DefSprite(int number, const char *name, float w, float h, int color);//, OBJECT *obj); + +#endif + +void flip(); + +// rootのポインターを返す +SceneGraphPtr getRootPtr( void ); + +/* + float get_cameraPos(int n); + n==0 retrun x + n==1 return y + n==2 return z + n==3 ? +*/ +float get_cameraPos( int n ); + +// 引数の座標にカメラが追従する +void set_cameraPos( FVECTOR, FVECTOR ); + +void gSprite_PutObject(int number,OBJECT *obj); + + +// Viewer *drootにxmlファイルを追加 +void call_createFromXMLfile( char *filename ); + +// createScenGraphe()する +/* +OBJECT* call_createSceneGraph( char *filename ); +OBJECT* call_createSceneGraph( void ); +*/ + +// テスト用関数 +void cameraControl( void ); diff -r 586d68c42c5d -r d84ee8b2cfd9 gSprite.o Binary file gSprite.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 game.o Binary file game.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 game_time.o Binary file game_time.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 getStrFromFile.o Binary file getStrFromFile.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 light.o Binary file light.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 magoroku Binary file magoroku has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 mytype.o Binary file mytype.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 name_dictionary.o Binary file name_dictionary.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 ps2util.o Binary file ps2util.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 quotanion.o Binary file quotanion.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 schedule.cc --- a/schedule.cc Wed Jul 13 16:59:04 2011 +0900 +++ b/schedule.cc Thu Jul 21 17:25:59 2011 +0900 @@ -80,6 +80,14 @@ static void set_schedule_assumption(void (*_func)(Game*) ) { + //droot->createFromXMLfile("/Users/yonaminetakao/Desktop/Cerium/Renderer/Test/xml_file/universe.xml"); + //SceneGraphPtr root = droot->createSceneGraph("Earth"); + //droot->createStringFont(root,"As",80,640,480,0x00ff00ff); + //root->xyz[0] = 320; + //root->xyz[1] = 240; + //root->xyz[2] = 100; + //get_matrix(root->matrix, root->angle, root->xyz, camera->matrix); + //droot->setSceneData(root); sche_func_assumption = _func; change_state = 1; } @@ -153,12 +161,11 @@ graphic_init(); camera_init(); - FVECTOR cP = { 0, 0, 0, 0 }; - FVECTOR cA = { 0, 0, 0, 0 }; - // FVECTOR cA = { 0, 0, 0, 0 }; + FVECTOR cP = { 0, 0, 0, 0 };//camera position + FVECTOR cA = { 0, 0, 0, 0 };//camera angle - set_cameraPos( cP, cA ); - + set_cameraPos( cP, cA );//camera set + #ifdef LINDA //sche_func = &sche_game_wait; //set_schedule_assumption(sche_game_wait); @@ -232,8 +239,6 @@ printf("pad.st = %d\n",pad.st); if (pad.st != 1) { goto OPENING; } */ - - set_schedule_assumption(sche_game_select_car); OPENING: @@ -277,7 +282,6 @@ (game->car_id < 2) ? MAXCAR : game->car_id - 1; } - if (game->play_id == 1) if (pad.circle != 1) { goto SELECT_CAR; } @@ -358,12 +362,14 @@ set_schedule_assumption(sche_game_main_ready); - // とりあえず、トップビューで - FVECTOR cPos = { 0, 877, -7500, 0 }; - FVECTOR cAngle = { 90, 0, 0, 0 }; + +// とりあえず、トップビューで + FVECTOR cPos = { game->jiki->location[0],game->jiki->location[1],game->jiki->location[2],0 }; + FVECTOR cAngle = { 0, 0, 0, 0 }; // FVECTOR cA = { 0, 0, 0, 0 }; set_cameraPos( cPos, cAngle ); + } static void @@ -378,7 +384,8 @@ sche_game_main(Game *game) { printf("sche_game_main()\n"); - + FVECTOR cPos = { game->jiki->location[0],game->jiki->location[1],game->jiki->location[2] ,0 }; + FVECTOR cAngle = {0, 0, 0, 0 }; // jikiによってカメラも移動( camera_update()って関数のほう使うあらイラんね ) // set_cameraPos( game->jiki->body->xyz, game->jiki->body->angle ); @@ -406,8 +413,9 @@ field_update(game->jiki); // 車のDraw関数 - carNode_draw(); - + carNode_draw(game->jiki); + + set_cameraPos( cPos, cAngle ); //camera_update(game, game->jiki->body->transfer); //camera_update(game, &(game->jiki->body->matrix) ); @@ -445,14 +453,12 @@ game->jiki->direction[2] --; } if( pad.right > 0 ){ - game->jiki->direction[1] ++; + game->jiki->direction[0] ++; } if( pad.left > 0 ){ - game->jiki->direction[1] --; + game->jiki->direction[0] --; } - - if ((pad.right > 0) && ((game->jiki->speed != 0) || (pad.circle > 0))) { car_swerve(game->jiki, 1); @@ -545,7 +551,7 @@ // 宣言では引数が二つだったから、第一引数に game を入れてみた car_update(game, game->jiki); //field_update(game->jiki); - carNode_draw(); + carNode_draw(game->jiki); // ちょっとコメントアウト // camera_update( game, (FMATRIX)(game->jiki->body->matrix) ); diff -r 586d68c42c5d -r d84ee8b2cfd9 schedule.cc~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schedule.cc~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,619 @@ +/* schedule.c */ + +#include +#include +#include +#include +#include "libps2.h" +#include "ps2util.h" +#include "field.h" +#include "car.h" +#include "gSprite.h" +#include "gFont.h" +#include "game.h" +#include "controler.h" +#include "camera.h" +#include "carNode.h" +#include "car.h" +#include "light.h" +#include "title_scene.h" +#include "game_time.h" +#include "schedule.h" +#include "game.h" + +#include "mytype.h" +#include "linda.h" + +#include "sjoy.h" + + +#ifdef LINDA +bool linda_update(int p, Game *game); +#else +#define linda_update(change_state, game) true +#endif + +#define MAXCAR 4 // 選択可能機体 +#define MAXFIELD 2 // 選択可能コース +#define MAXRAP 3 // ラップ数 +#define SP_SEL_CAR 50 +#define SP_SEL_COURSE 80 + +// controler.cより +extern SGO_PAD pad; + + +static void set_schedule(Game *game); +static void sche_game_init(Game *game); +//static void sche_game_wait(Game *game); //プロトタイプも消しといた +//static void sche_game_wait_ready(Game *game); +static void sche_game_opening(Game *game); +static void sche_game_select_car(Game *game); +static void sche_game_select_course(Game *game); +static void sche_game_ready(Game *game); +static void sche_game_main_init(Game *game); +static void sche_game_main_ready(Game *game); +static void sche_game_main(Game *game); +static void sche_game_main_pause(Game *game); +static void sche_game_main_goal(Game *game); +static void sche_game_main_finish(Game *game); +static void sche_game_main_finish2(Game *game); + + +/* timer */ +static int start_time,time_count; +static int RUNNIG=0; +char raptime[10]; + +static int ranking = 0; +static LIGHT l; +static int i=0; + +static void (*sche_func_assumption)(Game*); +static void (*sche_func)(Game*) = &sche_game_init; +static int change_state = 0; + + +// schedule.ccで使用してる +void linda_env_init( void ); + +static void +set_schedule_assumption(void (*_func)(Game*) ) +{ + sche_func_assumption = _func; + change_state = 1; +} + +static void +unset_schedule() +{ + change_state = 0; +} + +static void +set_schedule(Game *game) +{ + sche_func = sche_func_assumption; + change_state = 0; +} + +static void +graphic_init() +{ + // flip(); + + printf("graphic_init()\n"); + + gSprite_Init(); // グラフィック関連の初期化 + gFont_Init(); // フォント関連の初期化 +} + +static void +play_init( Game *game ) +{ + printf("play_init()\n"); + + // ここで、car_idには1か2か3が入らんとダメ + game->jiki = car_init(game->car_id); + + // carNode.cc内のcar_listに追加 + carNode_append(game->jiki); + + // + field_init(game->course_id); +} + +// 適当に自作 :miya +void linda_env_init( void ) +{ + printf("linda_env_init\n"); +} + +static void game_env_init ( Game *game ) +{ + game->car_id = 1; + game->course_id = 1; + game->camera_type = 0; + game->rap = 1; + game->jiki = NULL; + + ranking = 0; + + wait_init(); + linda_env_init(); +} + + +void +sche_game_init(Game *game) +{ + printf("sche_game_init()\n"); + + game_env_init(game); + graphic_init(); + camera_init(); + + FVECTOR cP = { 0, 0, 0, 0 };//camera position + FVECTOR cA = { 0, 0, 0, 0 };//camera angle + + set_cameraPos( cP, cA );//camera set + gFont_SetString("test",10,10); +#ifdef LINDA + //sche_func = &sche_game_wait; + //set_schedule_assumption(sche_game_wait); +#else + set_schedule_assumption(sche_game_opening); +#endif +} + +/** + * 通信対戦専用 + * 全ユーザが接続するまで待つ + * ・・・だったんだけど、現在 linda を切っているため worning が出る。 + * ので cut する。 + */ + +/* linda を使用しないのでカットした + static void + sche_game_wait(Game *game) + { + gFont_SetString("WAITING...", 200, 100); + set_schedule_assumption(sche_game_wait_ready); + } +*/ + + +/** + * 通信対戦専用 + * 全ユーザの接続を確認したら呼び出す + * こいつも、linda がないので cut +*/ +/* + static void + sche_game_wait_ready(Game *game) + { + gFont_SetString("CONNECT OK!!", 170, 300); + if (game->play_id == 1) { + gFont_SetString(" PUSH START ", 170, 400); + if (pad.st != 1) { goto WAIT_READY; } + } + + set_schedule_assumption(sche_game_opening); + + WAIT_READY: + return; + } +*/ + + +void +sche_game_opening(Game *game) +{ + static int blink_count = 0; + + //gSprite_PutSprite(TITLE, 600 + get_cameraPos(0), 100 + get_cameraPos(1), -500 + get_cameraPos(2), 0); + + gSprite_PutSprite( true, TITLE, 600, 100, -500, 0); + //gSprite_PutSprite(TITLE, 600 - 40, 100 + get_cameraPos(1), -500 + 30, 0); + + //ここを現在通らないらしい。 + if (game->play_id==1){ + if (blink_count < 35) { + gFont_SetString("PUSH START !!", 170, 380); + } + blink_count = (blink_count > 70) ? 0 : blink_count + 1; + + printf("pad.st = %d\n",pad.st); + if (pad.st != 1) { goto OPENING; } + } + + /*処理をいったんifの外へ。これを見る限り、キー入力自体はokぽい + printf("pad.st = %d\n",pad.st); + if (pad.st != 1) { goto OPENING; } + */ + set_schedule_assumption(sche_game_select_car); + + OPENING: + return; + + if (game->play_id == 1) { + if (title_scene() < 0){ + } + } else if (game->play_id == 2) { + if (i==0){ + title_init_call(); + i=1; + } + } + +} + +void +sche_game_select_car(Game *game) +{ + printf("sche_game_select_car()\n"); + + if (i==1){ + title_finish_call(); + i=2; + } + + gSprite_PutSpriteEx(true,SP_SEL_CAR+game->car_id, 600, 200, TEST_Z_GRID,1.5, 1.5, 0.0); + gSprite_PutSprite(true,R_ARROW, 750, 200, TEST_Z_GRID, 0); + gSprite_PutSprite(true,L_ARROW, 450, 200, TEST_Z_GRID, 0 ); + + gFont_SetString("SELECT CAR", 180, 50); + + if (pad.right == 1) { + game->car_id = + (game->car_id > MAXCAR-1) ? 1 : game->car_id + 1; + } + + if (pad.left == 1) { + game->car_id = + (game->car_id < 2) ? MAXCAR : game->car_id - 1; + } + + if (game->play_id == 1) + if (pad.circle != 1) { goto SELECT_CAR; } + + set_schedule_assumption(sche_game_select_course); + + SELECT_CAR: + return; +} + +void +sche_game_select_course(Game *game) +{ + printf("sche_game_select_course()\n"); + gSprite_PutSpriteEx(true, SP_SEL_COURSE+game->course_id, 600, 200, TEST_Z_GRID ,1.7, 1.8, 0.0); + gSprite_PutSprite(true, R_ARROW, 750, 200, TEST_Z_GRID, 0); + gSprite_PutSprite(true, L_ARROW, 450, 200, TEST_Z_GRID, 0); + + gFont_SetString("SELECT COURSE", 150, 50); + + if (game->play_id == 1) { + if (pad.right == 1) { + game->course_id = + (game->course_id > MAXFIELD-1) ? 1 : game->course_id + 1; + goto SELECT_COURSE; + } + if (pad.left == 1) { + game->course_id = + (game->course_id < 2) ? MAXFIELD : game->course_id - 1; + goto SELECT_COURSE; + } + + if (pad.circle != 1) { goto SELECT_COURSE; } + } + + set_schedule_assumption(sche_game_ready); + + SELECT_COURSE: + return; +} + +void +sche_game_ready(Game *game) +{ + printf("sche_game_ready()\n"); + static int blink_count = 0;// + + int tesX = 500; + + // PLAYER_1 or PLAYER_2 今は通信対戦できないから常にPLAYER_1 + gSprite_PutSprite(true, 27+game->play_id, 265 + 50 , 200, TEST_Z_GRID + 400, 0 ); + + gSprite_PutSpriteEx(true, SP_SEL_CAR+game->car_id, 50 + tesX, 120, TEST_Z_GRID - 300, 1.5, 1.5 , 0.0); + gSprite_PutSpriteEx(true, SP_SEL_COURSE+game->course_id, 340 + tesX, 120, TEST_Z_GRID - 300, 1.7, 1.8 , 0.0); + + /* 点滅 */ + if (blink_count < 35) { + gFont_SetString("GAME START !!", 170, 380); + } + blink_count = (blink_count > 70) ? 0 : blink_count + 1; + + if (pad.st == 1) { + set_schedule_assumption(sche_game_main_init); + } + if (pad.cross > 0) { + set_schedule_assumption(sche_game_select_car); + } +} + +void +sche_game_main_init(Game *game) +{ + printf("sche_game_main_init()\n"); + if (!game->jiki){ + play_init(game); + } + + RUNNIG=0; + + set_schedule_assumption(sche_game_main_ready); + + +// とりあえず、トップビューで + FVECTOR cPos = { game->jiki->location[0]+100,game->jiki->location[1],game->jiki->location[2],0 }; + FVECTOR cAngle = { 0, 0, 0, 0 }; + // FVECTOR cA = { 0, 0, 0, 0 }; + + set_cameraPos( cPos, cAngle ); +} + +static void +sche_game_main_ready(Game *game) +{ + gFont_SetString("Loading....", 180, 100); + set_schedule_assumption(sche_game_main); + +} + +static void +sche_game_main(Game *game) +{ + printf("sche_game_main()\n"); + FVECTOR cPos = { game->jiki->location[0],game->jiki->location[1]-100,game->jiki->location[2]+500 ,0 }; + FVECTOR cAngle = { 90, 0, 0, 0 }; + // jikiによってカメラも移動( camera_update()って関数のほう使うあらイラんね ) + // set_cameraPos( game->jiki->body->xyz, game->jiki->body->angle ); + + /** begin: dispaly RAP TIME **/ + if(RUNNIG==0){ + start_time = game_time_get_msec(); + RUNNIG=1; + } + + time_count = game_time_get_msec() - start_time; + game_time_set_raptime(raptime,time_count); + gFont_SetString("TIME",300,20); + gFont_SetString(raptime,400,20); + /** end: dispaly RAP TIME **/ + + // light_init と init_lightの書き間違え? + init_light(&l); + set_light(&l); + + car_id_update(game, game->jiki); + + // 宣言では引数が二つだったから、第一引数に game を入れてみた + car_update(game, game->jiki); + + field_update(game->jiki); + + // 車のDraw関数 + carNode_draw(game->jiki); + + set_cameraPos( cPos, cAngle ); + //camera_update(game, game->jiki->body->transfer); + //camera_update(game, &(game->jiki->body->matrix) ); + + + gFont_SetStringInt(game->rap, 50, 100); + + /* スピードメーター */ + //gSprite_DefSprite(SP_METER, 1, 1,(int)(106.0*(game->jiki->speed/game->jiki->speed_max)), 34); + + // とりあえずコンパイル通すためにコメント。あとで調べましょう + // gSprite_DefSprite(SP_METER, "name", (float)(106.0*(game->jiki->speed/game->jiki->speed_max)), 34.0, 100); + + gSprite_PutSprite(true,SP_METER, 400, 400, TEST_Z_GRID, 0); + + /* km/h */ + gSprite_PutSprite(true, KM, 470, 350, TEST_Z_GRID, 0); + + /* Rap */ + gSprite_PutSprite(true,RAP, 80, 100, TEST_Z_GRID, 0); + + if (game->rap > MAXRAP) { + ranking = 1; + set_schedule_assumption(sche_game_main_goal); + } + + gFont_SetStringInt((int)(100.0*game->jiki->speed), 380, 350); + + + + + if( pad.up > 0 ){ + game->jiki->direction[1] ++; + } + if( pad.down > 0 ){ + game->jiki->direction[1] --; + } + if( pad.right > 0 ){ + game->jiki->direction[0] ++; + } + if( pad.left > 0 ){ + game->jiki->direction[0] --; + } + + + + + if ((pad.right > 0) && ((game->jiki->speed != 0) || (pad.circle > 0))) { + car_swerve(game->jiki, 1); + } + if ((pad.left > 0) && ((game->jiki->speed != 0) || (pad.circle > 0))) { + car_swerve(game->jiki, -1); + } + + // 丸ボタン押したら加速 + if (pad.circle > 0) { + car_accelerate(game->jiki, 1); + // game->jiki->body->xyz[0] ++; //テスト用でし + } + // バツボタン押したら減速 + if (pad.cross > 0) { + //game->jiki->body->xyz[2] ++; + car_accelerate(game->jiki, -1); + } + + + // テスト用関数 + //cameraControl( ); + + if (pad.r1 == 1) { + game->camera_type = !game->camera_type; + } + + // startボタン押したらpause画面へ + if (pad.st == 1) { + set_schedule_assumption(sche_game_main_pause); + } + + //S-dandy の obj てきな +} + + +void +sche_game_main_pause(Game *game) +{ + printf("sche_game_main_pause\n"); + + static int select = 0; + + // field_update(game->jiki); + //carNode_draw(); + + if (game->play_id == 1) { + // 選択マーク + gSprite_PutSprite(true, SELECT, 100 + 250, 190+select*100 + 10, TEST_Z_GRID + 400, 0); + + gFont_SetString("BACK TO GAME", 200, 200); + gFont_SetString("GO TO TITLE", 200, 300); + } else { + gFont_SetString("Pause ...", 200, 200); + } + + + if (pad.circle == 1) { + if (select == 0) { + set_schedule_assumption(sche_game_main); + } else { + set_schedule_assumption(sche_game_main_finish); + } + } else if (pad.st == 1) { + set_schedule_assumption(sche_game_main); + } else if (pad.up == 1 || pad.down == 1) { + select = !select; + } +} + + +void +sche_game_main_goal(Game *game) +{ + /** dispaly TOTAL TIME **/ + game_time_set_raptime(raptime,time_count); + + gFont_SetString("TOTAL TIME",150,20); + gFont_SetString(raptime,400,20); + gFont_SetString("GOAL !!", 220, 150); + +#ifdef LINDA + if (ranking == 1) + gFont_SetString("You WIN!!", 200, 250); + else + gFont_SetString("You Lose...", 200, 250); +#endif + + + // 宣言では引数が二つだったから、第一引数に game を入れてみた + car_update(game, game->jiki); + //field_update(game->jiki); + carNode_draw(game->jiki); + + // ちょっとコメントアウト + // camera_update( game, (FMATRIX)(game->jiki->body->matrix) ); + + if (pad.st == 1) { + set_schedule_assumption(sche_game_main_finish); + } +} + +void +sche_game_main_finish(Game *game) +{ + field_destroy(); + carNode_destroy(); + game_env_init(game); + + set_schedule_assumption(sche_game_main_finish2); +} + +void +sche_game_main_finish2(Game *game) +{ + gFont_SetString("GAME OVER ...", 200, 200); + + if (pad.st == 1) { + set_schedule_assumption(sche_game_opening); + } + +} + +// 適当に作りました +void wait_sync(Game *game) +{ + printf("wait_sync\n"); +} + +// 適当に +void swap_dbuff() +{ + printf("swap_dbuff()\n"); +} + +void +schedule(Game *game) +{ + flip(); + + printf("----------------------\n"); + printf("schedule()\n"); + + sche_func(game); + + if (linda_update(change_state, game) == true){ + set_schedule(game); + } + else{ + unset_schedule(); + } + + wait_sync(game); + swap_dbuff(); + + // この関数はなんなのかな + sjoy_poll(); + + ps2util_sprite_Draw(); + gSprite_Draw_Reset(); + gFont_Draw_Reset(); + + // ここにgSprite_Init()があるのって良いのかな? + // gSprite_Init(); +} diff -r 586d68c42c5d -r d84ee8b2cfd9 schedule.o Binary file schedule.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 sjoy.o Binary file sjoy.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 sound.o Binary file sound.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 title_scene.o Binary file title_scene.o has changed diff -r 586d68c42c5d -r d84ee8b2cfd9 xml_file/select_car_2.xml~ --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml_file/select_car_2.xml~ Thu Jul 21 17:25:59 2011 +0900 @@ -0,0 +1,1001 @@ + + + + + + -42.000000, 18.000000, 0.000000 + -69.000000, 18.000000, 0.000000 + -69.000000, 38.000000, 0.000000 + -69.000000, 38.000000, 0.000000 + -42.000000, 38.000000, 0.000000 + -42.000000, 18.000000, 0.000000 + + + -0.005369 -0.004739 0.999974 + -0.005369 -0.004739 0.999974 + -0.005369 -0.004739 0.999974 + -0.005369 -0.004739 0.999974 + -0.005369 -0.004739 0.999974 + -0.005369 -0.004739 0.999974 + + + 0.000000 0.000000 0.000000 + + + 0.998552 1.000000 + 0.000000 0.998552 + 0.001448 0.000000 + 0.001448 0.000000 + 1.000000 0.001448 + 0.998552 1.000000 + + + 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 + + +