Mercurial > hg > old > magoroku_racing
diff car.cc @ 128:d9e3137e70a0
xml name change
author | e085768 |
---|---|
date | Thu, 07 Jul 2011 16:10:21 +0900 |
parents | 030394675d8e |
children | 4f50f5a3b363 |
line wrap: on
line diff
--- a/car.cc Wed Jul 06 21:46:37 2011 +0900 +++ b/car.cc Thu Jul 07 16:10:21 2011 +0900 @@ -12,7 +12,7 @@ #include "game.h" #include "stdbool.h" -#include "Application.h" +#include "gSprite.h" #define DEFAULT_SET (EFFECT_TEXTURE_USE | EFFECT_ALPHABLEND_UNUSE | EFFECT_SHADING_FLAT) #define BUFSIZE 256 @@ -23,8 +23,6 @@ extern FILE* main_fp; -extern Viewer *droot; - static CarPtr car_create(int car_id, char *filename, char *texname, float speed_accel, float speed_max, float rot, float brake) @@ -38,19 +36,27 @@ body = ps2util_obj_Create_fromXML(filename); ps2util_obj_Set_effect(body, DEFAULT_SET); + // xmlファイルから読み込み + call_createFromXMLfile(filename); + + gSprite_DefSprite( CAR_BODY, "body", 0, 0, 0); + gSprite_DefSprite( CAR_TIRE_TOP_R, "top_r", 0, 0, 0); + gSprite_DefSprite( CAR_TIRE_TOP_L, "top_l", 0, 0, 0); + gSprite_DefSprite( CAR_TIRE_BTM_R, "btm_l", 0, 0, 0); + gSprite_DefSprite( CAR_TIRE_BTM_L, "top_l", 0, 0, 0); + + // 初期化 + body = call_createSceneGraph(); + if (malloc_align16(&free_addr, &car, sizeof(Car)) == -1) { fprintf(main_fp, "car.c: malloc_align16 error\n"); exit(EXIT_FAILURE); } - // 初期化はこれが正解だった - body = droot->createSceneGraph(); + car->body = body; - // car->body = new OBJECT(); - // car->body = (OBJECT*)malloc(sizeof(OBJECT)); + car->next = NULL; - car->body = body; - car->next = NULL; car->speed = 0.0; car->speed_accel = speed_accel; car->speed_max = speed_max; @@ -59,8 +65,6 @@ car->y_angle = 0.0; car->free_addr = free_addr; - // car->body = new OBJECT(); - // car->body = (OBJECT*)malloc(sizeof(OBJECT)); ps2_vu0_copy_vector(car->direction, direction); ps2_vu0_copy_vector(car->location, location); @@ -96,7 +100,8 @@ float speed_accel, speed_max, brake, rot; char buff[BUFSIZE], *bufp; char carImg[BUFSIZE], texImg[BUFSIZE]; - bool flag; + + bool flag; // 探したい車が見つかったらture flag = false; @@ -107,7 +112,9 @@ switch (buff[0]) { case 'n': if (flag == false) { - sscanf(bufp, " %d\n", &car_id); // car_id = nの後ろの数字一文字 + + // car_id = car/car.datファイルのnの後ろの数字一文字 + sscanf(bufp, " %d\n", &car_id); if (id == car_id) { flag = true; } @@ -158,14 +165,16 @@ car_swerve(CarPtr car, int flg) { FMATRIX rot; - FVECTOR v; - + 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); } @@ -178,7 +187,11 @@ 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; } @@ -239,24 +252,38 @@ { FVECTOR mov, prev_location; + // movは車の移動量を計算して入れるのかな。たぶん ps2_vu0_scale_vector(mov, car->direction, car->speed); + + // 前フレームの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) { ps2_vu0_copy_vector(car->location, prev_location); car->speed = car->speed*0.5; } + */ + } static void car_axis_rotation(CarPtr car) { - FMATRIX pose, yrot, yrotinv; + 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)); @@ -264,7 +291,7 @@ FVECTOR yd = {0, -1, 0, 1}; FVECTOR rotaxis; FVECTOR q; - + ps2_vu0_outer_product(rotaxis, car->vertical, yd); { float scale=1/NORM(rotaxis); @@ -272,22 +299,32 @@ 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((FMATRIX)(car->body->matrix), pose); - ps2_vu0_rot_matrix_y((FMATRIX)(car->body->matrix), (FMATRIX)(car->body->matrix) , degree2radian(car->y_angle)); + + + FMATRIX carMrix; // car->body->matrix をFMATRIX型に変換して計算したい + + changeMatrix( carMrix, car->body->matrix ); + + //ps2_vu0_copy_matrix(car->body->transfer, pose); + ps2_vu0_copy_matrix( carMrix, pose); + + // ps2_vu0_rot_matrix_y(car->body->transfer, car->body->transfer, degree2radian(car->y_angle)); + ps2_vu0_rot_matrix_y(carMrix, carMrix, degree2radian(car->y_angle)); + + returnMatrix( car->body->matrix, carMrix ); } void car_update( Game *game, CarPtr car ) { - // 移動 + // 移動 ここで壁との当たり判定もしとる car_move(game,car); // 摩擦による速度減少