/
SPRITE.CC
120 lines (110 loc) · 2.07 KB
/
SPRITE.CC
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//SPRITE.CC
#include "boatrage.h"
#include "sprite.h"
sprite *sprite::pfirst=NULL; //pekare till den f”rsta spriten
int sprite::spritecount=0;
//skapa sprite
sprite::sprite(fixed newx, fixed newy) {
x=newx; y=newy;
type=0;
size=1;
tobedeleted=0;
spritecount++;
//pnext=pfirst;
//pfirst=this;
sprite *s;
if (pfirst) {
for (s=pfirst; s->pnext; s=s->pnext) {
}
s->pnext=this;
pnext=NULL;
} else {
pfirst=this;
pnext=NULL;
}
}
//d”da sprite
sprite::~sprite() {
spritecount--;
if (tobedeleted) return;
sprite *s;
if (pfirst==this) {
pfirst=pnext;
} else {
for (s=pfirst; s; s=s->pnext) {
if (s->pnext==this) {
s->pnext=pnext;
break;
}
}
}
}
/*
sprite *delsprite(sprite *s, int i) {
sprite *sp;
if (s->valid!=1234) {cerr << "Sprite #" << i << endl; return s->pnext;}
sp=s->pnext;
delete s;
return sp;
} */
//flytta allt krafs
void sprite::moveall() {
int i=0;
sprite *s,*sn;
for (s=pfirst; s; s=s->pnext) {
s->move();
}
sn=pfirst;
for (s=pfirst; s; s=s->pnext) {
i++;
if (s->tobedeleted==true) {
s->tobedeleted=false;
sn->pnext=s->pnext;
delete s;
s=sn->pnext;
}
sn=s;
if (sn==0) break;
}
}
//kolla om den har krockat
int sprite::collided(sprite *sp) {
fixed dist;
dist=fsqrt(fmul(sp->x-x,sp->x-x)+fmul(sp->y-y,sp->y-y));
if (dist<(sp->size+size)<<12)
{return 1;}
else
{return 0;}
}
void sprite::killall() {
//s† l„nge n†gon finns kvar...
while (pfirst>NULL) {
//ta bort den
delete pfirst;
}
}
//jag har problem med dessa: anv„nder dom inte
/*void sprite::sendtoback() {
if (pfirst==this) return;
sprite *sp;
for (sp=pfirst; (sp->pnext!=this) && (sp); sp=sp->pnext);
sp->pnext=pnext;
pnext=pfirst;
pfirst=this;
}
void sprite::bringtofront() {
sprite *sp;
for (sp=pfirst; (sp->pnext!=this) && (sp); sp=sp->pnext);
sp->pnext=pnext;
for (; sp; sp=sp->pnext);
sp->pnext=this;
pnext=NULL;
} */
sprite *sprite::findat(fixed x,fixed y,int thetype) {
sprite *s;
int flag=0;
for (s=sprite::pfirst; s; s=s->pnext) {
if (s->hit(x,y) && s->type==thetype) {flag=1;break;}
}
if (flag==1) return s; else return 0;
}