Mercurial > hg > old > magoroku_racing.bad
annotate field.c @ 95:b0249b856488
change_ps2util
author | Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 26 May 2011 18:13:40 +0900 |
parents | cb6c6de125dc |
children | 0b65ca27f113 |
rev | line source |
---|---|
0 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
90
8edae89a3877
compile on Mac OS X
Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
parents:
88
diff
changeset
|
3 #include <stdbool.h> |
91 | 4 #include <string.h> |
5 #include "libps2.h" | |
6 #include "ps2util.h" | |
0 | 7 #include "mytype.h" |
8 #include "field.h" | |
9 #include "car.h" | |
10 #include "quotanion.h" | |
90
8edae89a3877
compile on Mac OS X
Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
parents:
88
diff
changeset
|
11 #include <stdbool.h> |
0 | 12 |
13 #define BUFSIZE 256 | |
14 | |
15 /* --- main.c --- */ | |
16 extern FILE *main_fp; | |
17 | |
18 static int field_num_max = 0; | |
19 static int field_num = 1; | |
20 | |
21 static FieldPtr field_list; | |
22 static FieldPtr field_actual; | |
91 | 23 |
0 | 24 static FieldPtr |
91 | 25 field_create(char *fieldImg, char *colImg, TEXTURE *tex) |
0 | 26 { |
27 FieldPtr self; | |
91 | 28 OBJECT *obj; |
29 PolygonInfo *xml; | |
0 | 30 void *free_addr; |
31 | |
91 | 32 FVECTOR location = {0, 0, 0, 1}; |
33 FVECTOR direction = {0, 0, 0, 1}; | |
0 | 34 |
90
8edae89a3877
compile on Mac OS X
Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
parents:
88
diff
changeset
|
35 // obj = ps2util_obj_Create_fromXML(fieldImg); |
91 | 36 memcpy(obj->xyz, location, sizeof(FVECTOR)); |
37 memcpy(obj->angle, direction, sizeof(FVECTOR)); | |
38 ps2util_obj_Renew_transMatrix(obj); | |
39 ps2util_obj_Set_effect(obj, DEFAULT_SET); | |
40 ps2util_obj_Set_texture(obj, tex); | |
0 | 41 |
90
8edae89a3877
compile on Mac OS X
Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
parents:
88
diff
changeset
|
42 // xml = xml_read_file(colImg); //ここでコースの走れる場所(当たり判定) |
0 | 43 |
91 | 44 if (malloc_align16(&free_addr, &self, sizeof(Field)) == -1) { |
0 | 45 fprintf(stderr, "field.c: malloc_align16 error\n"); |
46 fflush(stderr); | |
47 exit(EXIT_FAILURE); | |
48 } | |
91 | 49 self->object = obj; |
0 | 50 self->next = NULL; |
51 self->prev = NULL; | |
52 self->free_addr = free_addr; | |
53 #ifdef DEBUG | |
91 | 54 fprintf(main_fp, "malloc fieldNode addr = %x(free), %x(obj)\n", (int)free_addr, (int)self); |
0 | 55 #endif |
91 | 56 col_init(&self->colface, xml); |
0 | 57 |
34 | 58 #ifdef DEBUG |
91 | 59 fprintf(main_fp, " facenum = %d\n", self->colface.facenum); |
60 fprintf(main_fp, " facenum = %x(free), ", (int)self->colface.free_addr); | |
61 fprintf(main_fp, "facenum = %x(obj)\n", (int)self->colface.colface); | |
34 | 62 #endif |
63 | |
91 | 64 //xml_free(xml); |
0 | 65 |
66 return self; | |
67 } | |
91 | 68 |
69 | |
0 | 70 |
71 static void | |
32 | 72 field_new_readCSV(FILE *fp, int id) |
0 | 73 { |
74 FieldPtr fieldHead = NULL; | |
75 FieldPtr newField = NULL; | |
76 FieldPtr prevField = NULL; | |
77 char buff[BUFSIZE], *bufp; | |
78 char fieldImg[BUFSIZE], colImg[BUFSIZE], texname[BUFSIZE]; | |
91 | 79 TEXTURE *tex = NULL; |
0 | 80 int course_id; |
90
8edae89a3877
compile on Mac OS X
Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
parents:
88
diff
changeset
|
81 bool flag = false; |
0 | 82 |
83 while ((bufp = fgets(buff, BUFSIZE, fp)) != NULL) { | |
84 bufp++; | |
85 | |
86 switch (buff[0]) { | |
88 | 87 case 'n': // コースIDの読み取り |
0 | 88 if (!flag) { |
89 sscanf(bufp, " %d\n", &course_id); | |
32 | 90 if (id == course_id) { |
90
8edae89a3877
compile on Mac OS X
Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp>
parents:
88
diff
changeset
|
91 flag = true; |
0 | 92 } |
93 } else { | |
94 goto FINISH_LOAD; | |
95 } | |
96 break; | |
88 | 97 case 't': // テクスチャのロード |
0 | 98 if (flag) { |
99 sscanf(bufp, " %s\n", texname); | |
91 | 100 //tex = read_png_file(texname); |
101 ps2util_tex_Set(tex); | |
0 | 102 } |
103 break; | |
88 | 104 case 'c': // コースのロード |
0 | 105 if (flag) { |
106 sscanf(bufp, " %s %s\n", fieldImg, colImg); | |
91 | 107 newField = field_create(fieldImg, colImg, tex); |
0 | 108 if (!fieldHead) { |
109 fieldHead = prevField = newField; | |
110 } else { | |
111 prevField->next = newField; | |
112 newField->prev = prevField; | |
113 prevField = newField; | |
114 } | |
115 newField->init = fieldHead; | |
116 field_num_max++; | |
117 } | |
118 break; | |
119 default: | |
120 break; | |
121 } | |
122 } | |
123 | |
124 FINISH_LOAD: | |
88 | 125 // 先頭と最後尾のリンクを張る |
0 | 126 newField->next = newField->init; |
127 newField->init->prev = newField; | |
128 | |
129 field_list = field_actual = fieldHead; | |
130 } | |
131 | |
132 | |
133 /*---------------------/ | |
134 FieldPtr | |
135 field_init: | |
88 | 136 指定したファイルからコースを生成する。 |
137 戻り値 | |
138 コース先頭のポインタ | |
0 | 139 /---------------------*/ |
140 void | |
32 | 141 field_init(int id) |
0 | 142 { |
143 FILE *fp; | |
144 char *filename = "course/course.dat"; | |
145 | |
146 if (!(fp = fopen(filename, "r"))) { | |
147 fprintf(main_fp, "error read file %s\n", filename); | |
148 exit(EXIT_FAILURE); | |
149 } | |
32 | 150 field_new_readCSV(fp, id); |
0 | 151 fclose(fp); |
152 } | |
153 | |
91 | 154 |
0 | 155 static void |
156 field_draw(FieldPtr p) | |
157 { | |
91 | 158 ps2_vu0_unit_matrix(p->object->transfer); |
0 | 159 |
91 | 160 p->object->transfer[3][0] = p->location[0]; |
161 p->object->transfer[3][1] = p->location[1]; | |
162 p->object->transfer[3][2] = p->location[2]; | |
163 p->object->transfer[3][3] = p->location[3]; | |
164 ps2util_obj_Draw(p->object); | |
0 | 165 } |
91 | 166 |
0 | 167 |
168 void | |
169 field_update(CarPtr car) | |
170 { | |
171 FieldPtr p; | |
172 | |
173 p = field_actual; | |
174 // current | |
91 | 175 p->location[0] = -car->location[0]; |
176 p->location[1] = -car->location[1]; | |
177 p->location[2] = -car->location[2]; | |
178 p->location[3] = 1; | |
179 field_draw(p); | |
0 | 180 |
181 // next | |
182 p = field_actual->next; | |
183 if (p) { | |
91 | 184 p->location[0] = -car->location[0]; |
185 p->location[1] = -car->location[1]; | |
186 p->location[2] = -car->location[2]; | |
187 p->location[3] = 1; | |
188 field_draw(p); | |
0 | 189 } |
190 | |
191 // prev | |
192 p = field_actual->prev; | |
193 if (p) { | |
91 | 194 p->location[0] = -car->location[0]; |
195 p->location[1] = -car->location[1]; | |
196 p->location[2] = -car->location[2]; | |
197 p->location[3] = 1; | |
198 field_draw(p); | |
0 | 199 } |
200 } | |
201 | |
202 void | |
203 field_destroy() | |
204 { | |
205 FieldPtr p = field_list; | |
206 FieldPtr d; | |
91 | 207 TEXTURE *t; |
0 | 208 |
209 p->prev->next = NULL; | |
210 | |
91 | 211 t = p->object->surfaces->texture; |
212 ps2util_tex_Exclude(t); | |
213 free_texture(t); | |
0 | 214 |
215 while (p) { | |
216 d = p; | |
217 p = p->next; | |
91 | 218 ps2util_obj_Free(d->object); |
219 free(d->colface.free_addr); | |
220 free(d->free_addr); | |
0 | 221 #ifdef DEBUG |
91 | 222 fprintf(main_fp, "free fieldNode addr = %x\n", (int)d->free_addr); |
0 | 223 #endif |
224 } | |
225 | |
226 field_num_max = 0; | |
227 field_num = 1; | |
228 } | |
229 | |
230 /* | |
88 | 231 * 周回記録。1周する毎に1を返す。 |
0 | 232 */ |
233 int | |
234 field_rap_increment(int n) | |
235 { | |
236 field_num += n; | |
237 if (field_num > field_num_max) { | |
238 field_num = 1; | |
239 return 1; | |
240 } else { | |
241 return 0; | |
242 } | |
243 } | |
244 | |
245 void | |
246 field_set_actual(FieldPtr p) | |
247 { | |
248 field_actual = p; | |
249 } | |
250 | |
251 FieldPtr | |
252 field_get_actual() | |
253 { | |
254 return field_actual; | |
255 } |