changeset 132:d84ee8b2cfd9

camera position update
author Takao YONAMINE <e095763@ie.u-ryukyu.ac.jp>
date Thu, 21 Jul 2011 17:25:59 +0900
parents 586d68c42c5d
children e7caa277d7e8
files Magoroku.o Makefile Makefile~ Ss.o TAGS camera.cc camera.cc~ camera.h camera.h~ camera.o car.cc car.cc~ car.o carNode.cc carNode.cc~ carNode.h carNode.h~ carNode.o col.o controler.o field.cc field.cc~ field.o gFont.cc gFont.cc~ gFont.o gSprite.cc gSprite.cc~ gSprite.h gSprite.h~ gSprite.o game.o game_time.o getStrFromFile.o light.o magoroku mytype.o name_dictionary.o ps2util.o quotanion.o schedule.cc schedule.cc~ schedule.o sjoy.o sound.o title_scene.o xml_file/select_car_2.xml~
diffstat 47 files changed, 3364 insertions(+), 603 deletions(-) [+]
line wrap: on
line diff
Binary file Magoroku.o has changed
--- 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
--- /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
Binary file Ss.o has changed
--- 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
--- 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);
 }
 
 /*
--- /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 <stdlib.h>
+#include <string.h>
+#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;
+}
--- 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
--- /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
Binary file camera.o has changed
--- 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;
   }
-  */
+  
 
 }
 
--- /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 <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#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) );
+}
Binary file car.o has changed
--- 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
--- /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 <stdio.h>
+#include <stdlib.h>
+#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;
+}
--- 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
--- /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
Binary file carNode.o has changed
Binary file col.o has changed
Binary file controler.o has changed
--- 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);
   }
--- 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 <stdbool.h>
 
-#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);
   }
Binary file field.o has changed
--- 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);
+
 }
 
 /*
--- /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 <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#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; i<DEFOBJ; i++) {
+    if (ps2util_sprite_Create(&sp[i], font_tex) == -1) {
+      fprintf(stderr,
+	      "cannot create sprite - gFont_Create()\n");
+      fflush(stderr);
+      exit(EXIT_FAILURE);
+    }
+    ps2util_sprite_Unuse_alpha(&sp[i]);
+  }
+
+  flag_spriteInited = true;
+    */
+
+}
+
+static void
+gFont_DefSprite(int number, int x, int y, int w, int h)
+{
+  sptable[number].mx = x;
+  sptable[number].my = y;
+  sptable[number].w = w;
+  sptable[number].h = h;
+}
+
+void
+DefSprite(int number, const char *name, float w, float h, int color, OBJECT *obj)
+{
+  SpriteTable *m = &sptable[number];
+  m->w = 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; i<DEFOBJ; i++) {
+    sprite_disappear(&sp[i].attribute);
+  }
+  sp_counter = 0;
+}
+
+void
+gFont_Draw_Reset()
+{
+  if (flag_spriteInited == true) {
+    gFont_Clear();
+  }
+}
+
+static int
+get_number_char(char a)
+{
+  return (int)a-32;
+}
+
+/*
+ * str をスプライド表示
+ */
+void
+gFont_SetString(const char *str, int x, int y)
+{
+  int number;
+
+  while (*str != '\0') {
+    number = get_number_char(*str);
+    gFont_PutSprite(number, x, y);
+    str++;
+    x += (int)CHAR_W_SIZE*1.5;
+  }
+}
+
+/*
+ * numを文字列に変換してSetStringに渡す
+ */
+void
+gFont_SetStringInt(int num, int x, int y)
+{
+  char bufp[256];
+
+  snprintf(bufp, 256, "%d", num);
+  gFont_SetString(bufp, x, y);
+}
+
+void
+gFont_SetFont_OP()
+{
+}
Binary file gFont.o has changed
--- a/gSprite.cc	Wed Jul 13 16:59:04 2011 +0900
+++ b/gSprite.cc	Thu Jul 21 17:25:59 2011 +0900
@@ -28,7 +28,7 @@
 
 extern Viewer	*droot;
 
-/*static*/ SceneGraphPtr root;
+/*static*/SceneGraphPtr root;
 
 static float	my_scale = 5;
 
@@ -39,28 +39,30 @@
 FVECTOR def_cameraMan = { 0, 0, 0, 1 };
 
 void set_cameraMan( void );
+CameraPtr camera;// = droot->sgroot->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);
-
+  //
+ 
 }
 
 
--- 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");
+  
+  
+}
--- 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 {
--- /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 );
Binary file gSprite.o has changed
Binary file game.o has changed
Binary file game_time.o has changed
Binary file getStrFromFile.o has changed
Binary file light.o has changed
Binary file magoroku has changed
Binary file mytype.o has changed
Binary file name_dictionary.o has changed
Binary file ps2util.o has changed
Binary file quotanion.o has changed
--- 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) );
--- /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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#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();
+}
Binary file schedule.o has changed
Binary file sjoy.o has changed
Binary file sound.o has changed
Binary file title_scene.o has changed
--- /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 @@
+<?xml version="1.0"?>
+<OBJECT-3D>
+	<surface name="select_car_2" size="6" prim="Triangle" parent="NULL">
+		<coordinate>
+			<!-- 0.992781 0.950403 0.031982
+			-1.007184 0.955430 0.021267
+			-1.012160 -1.044541 0.011762
+			-1.012160 -1.044541 0.011762
+			0.987805 -1.049568 0.022477
+			0.992781 0.950403 0.031982 -->
+			-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
+		</coordinate>
+		<normal>
+			-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
+		</normal>
+		<model>
+			0.000000 0.000000 0.000000
+		</model>
+		<texture>
+			0.998552 1.000000
+			0.000000 0.998552
+			0.001448 0.000000
+			0.001448 0.000000
+			1.000000 0.001448
+			0.998552 1.000000
+		</texture>
+		<image name="select_car_2.png">
+			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
+		</image>
+	</surface>
+</OBJECT-3D>