File: dynobj.C

package info (click to toggle)
flying 6.20-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny
  • size: 752 kB
  • ctags: 1,873
  • sloc: cpp: 10,966; makefile: 189
file content (104 lines) | stat: -rw-r--r-- 2,714 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#ifndef _global_h
#	include "global.h"
#endif

#ifndef _dynobj_h
#	include "dynobj.h"
#endif
#ifndef _ball_h
#	include "ball.h"
#endif

//
// Statik der DynObj-Klasse
//
Ball		*DynObj::hit_ball=0L;		// an Kollision beteiligter Ball
Object 	*DynObj::hit_object=0L;		// weiteres an Kollision beteiligtes Objekt
DynObj 	*DynObj::dyn_queue = 0L;	// globale Liste der dynamischen Objekte
int 		DynObj::id_count = 0;		// aktuelle Objekt-Id

DynObj::DynObj() {
	id = id_count++;				// muss von der Unterklasse gelesen werden
	next = dyn_queue;		// alle Objekte in dynamische Liste ketten
	dyn_queue = this;
	idle=0;
}

DynObj::~DynObj() {
DynObj	*last;

	if ( dyn_queue == this )		dyn_queue = next;
	else {
		last = dyn_queue;			// Element in Dynamik-Liste suchen ...
		while ( last->next && last->next != this )	last = last->next;
		last->next = next;		// Element ausketten
	}
}
void DynObj::ForAllDyn( DynObjFun fun ) {
		for (DynObj *obj=dyn_queue; obj; obj=obj->next )	(obj->*fun)();
}
void DynObj::ForAllDyn( DynObjFunD fun, Real param ) {
   	for (DynObj *obj=dyn_queue; obj; obj=obj->next )	(obj->*fun)(param);
}

//
// CollisionAll
// -  Der naechste Collisionszeitpunkt soll bestimmt werden.
// -  Dazu wird jedes dynamische Objekt nach der naechsten Kollision befragt.
// -  Die Zeit wird ermittelt, indem sich das das Objekt an alle anderen Objekte
//    wendet und danach befragt, wann sie getroffen werden.
//
Real DynObj::CollisionAll() {

	Object::min_time = MAX_TIME;
	for (DynObj *obj=dyn_queue; obj; obj=obj->next )
		obj->NextCollision();
	return (Object::min_time<MAX_TIME)?Object::min_time-current_time:Real(MAX_TIME);
}

void DynObj::DynInitAll() {	ForAllDyn(&DynObj::DynInit);	}

void DynObj::DynEndAll() {
}

void DynObj::DynInit() {
#if (TIME_CACHE)
	col_objects = Object::id_count;
	obj_list.Init(col_objects);
	for (Object *obj=Object::stat_queue; obj; obj=obj->next )
			obj_list[obj->id] = obj;
#endif
}

//
// Collide
// Die Kollision an dem durch HitFromBallAll gefundenen Objekt findet statt.
//
void DynObj::Collide() {
	if (Object::min_time<MAX_TIME) {
#ifdef DEBUG
		if (debug&BeforCollision) {
		  	printf( "BEFOR: %9.5f, Collision %9.5f\n", current_time,
													(double)Object::min_time );
		 	hit_object->Info();
			hit_ball->Info();
		}
#endif
		hit_object->CollideWithBall( hit_ball );
		hit_ball->WasHit(hit_object);
#ifdef DEBUG
		if (debug&AfterCollision) {
		  	if (debug&BeforCollision)	 printf( "AFTER:\n" );
			else		printf( "AFTER: %9.5f, Collision %9.5f\n", current_time,
													(double)Object::min_time );
		   hit_object->Info();
		   hit_ball->Info();
		}
#endif
	}
}


void DynObj::Move( Real )		{ }
void DynObj::Reset()				{ }
void DynObj::Redraw()			{ }