📄 particles.java
字号:
angle = (vx>0) ? 30 : -30;
radius = (m_life[i]-m_age[i] > 8) ? 8 : m_life[i]-m_age[i];
vx = (radius*Engine.sin((m_age[i]+i)*angle))>>FP_SHIFT;
vy = (radius*Engine.cos((m_age[i]+i)*angle))>>FP_SHIFT;
fx = (radius*Engine.sin((m_age[i]+i+1)*angle))>>FP_SHIFT;
fy = (radius*Engine.cos((m_age[i]+i+1)*angle))>>FP_SHIFT;
}
// uses m_p1 as colour, and m_p2 for the highlight colour
g.setColor(m_p1[i]);
g.drawLine(x,y,x-vx,y-vy);
if (m_age[i] < m_life[i]-1 || m_type[i]==TYPE_GOO_SPIN) {
g.setColor(m_p2[i]);
g.drawLine(x,y-1,x-vx,y-vy);
g.setColor(m_p1[i]);
g.drawLine(x+1,y,x-vx,y-vy);
g.drawLine(x-1,y,x-vx,y-vy);
g.drawLine(x,y+1,x-vx,y-vy);
x-=vx; y-=vy; vx-=fx; vy-=fy;
g.drawLine(x,y,x-vx,y-vy);
}
// decelerate
m_fp_vx[i] -= (m_fp_vx[i]>>3);
m_fp_vy[i] -= (m_fp_vy[i]>>3);
m_fp_fx[i] -= (m_fp_fx[i]>>3);
m_fp_fy[i] -= (m_fp_fy[i]>>3);
break;
case TYPE_BIT:
// uses m_p1 as initial colour, and fades to m_p2 for the final colour
blendRGB(g, m_p1[i], m_p2[i], m_age[i], m_life[i]);
g.drawLine(x,y,x-vx/(m_age[i]+1),y-vy/(m_age[i]+1));
break;
case TYPE_CHUNK:
// uses m_p1 as initial colour, and fades to m_p2 for the final colour
x1 = -vy;
y1 = vx;
blendRGB(g, m_p1[i], m_p2[i], m_age[i], m_life[i]);
g.drawLine(x, y, x+x1, y+y1);
if (m_age[i] < m_life[i]){
g.drawLine(x-1, y, x-1+x1, y+y1);
g.drawLine(x+1, y, x+1+x1, y+y1);
g.drawLine(x, y-1, x+x1, y-1+y1);
g.drawLine(x, y+1, x+x1, y+1+y1);
}
// decelerate
m_fp_vx[i] -= (m_fp_vx[i]>>3);
m_fp_vy[i] -= (m_fp_vy[i]>>3);
m_fp_fx[i] -= (m_fp_fx[i]>>3);
m_fp_fy[i] -= (m_fp_fy[i]>>3);
break;
case TYPE_SPARKLE:
offset = m_age[i];
if (m_age[i]>=(m_life[i]>>1)) offset -= m_life[i];
if (offset < 0) offset *= -1;
g.setColor(SPARKLE_RGB_3);
if (i%2==0) {
g.drawLine(x,y-offset, x,y+offset);
g.drawLine(x-offset,y, x+offset,y);
} else {
if (offset == 1) {
fillSquare(g,x,y,2);
} else {
if (offset > 0) --offset;
g.drawLine(x-offset,y-offset, x+offset,y+offset);
g.drawLine(x-offset,y+offset, x+offset,y-offset);
}
}
break;
case TYPE_STAR:
//#ifndef PARTICLES_LOW
angle = (i+m_age[i])*10 * ((i%2==0) ? -1 : 1);
length = m_life[i]-m_age[i];
if (length>4) length = 4;
//g.setColor(255,255, m_age[i]*255/m_life[i]);
g.setColor(SPARKLE_RGB_2);
// draws a pentagram!!
x1 = length*Engine.sin(angle);
y1 = length*Engine.cos(angle);
for (p=1; p<=5; ++p) {
x2 = length*Engine.sin((72*((p*2)%5))+angle); y2 = length*Engine.cos((72*((p*2)%5))+angle);
g.drawLine(x+(x1>>FP_SHIFT),y+(y1>>FP_SHIFT),x+(x2>>FP_SHIFT),y+(y2>>FP_SHIFT));
x1 = x2; y1 = y2;
}
if (length>3) //g.fillRect(x-length/2,y-length/2,length,length); // approx fill in the gaps with a square!
fillSquare(g, x, y, length);
//#endif
break;
case TYPE_RING:
//#ifndef PARTICLES_LOW
// uses m_p1 as initial colour, and fades to m_p2 for the final colour
blendRGB(g, m_p1[i], m_p2[i], m_age[i], m_life[i]);
segments = m_age[i]+4;
width = m_age[i]+(m_age[i]*vx);
height = m_age[i]+(m_age[i]*vy);
angle = m_age[i];
length = 360/segments;
x1 = width*Engine.sin(angle); y1 = height*Engine.cos(angle);
for (p=0; p<segments+(segments>>1); ++p) {
angle += (p%2==0) ? Engine.getRandom(length*(m_life[i]-m_age[i])/m_life[i] +1) : Engine.getRandom(length*2);
x2 = width*Engine.sin(angle); y2 = height*Engine.cos(angle);
if (p%2==0) {
g.drawLine(x+(x1>>FP_SHIFT), y+(y1>>FP_SHIFT), x+(x2>>FP_SHIFT), y+(y2>>FP_SHIFT));
}
x1 = x2; y1 = y2;
}
// decelerate
m_fp_vx[i] -= (m_fp_vx[i]>>3);
m_fp_vy[i] -= (m_fp_vy[i]>>3);
//#endif
break;
case TYPE_BUBBLE:
radius = ((m_life[i]-m_age[i])>>1) +2;
if (radius > 4) radius = 4;
g.setColor(m_p2[i]);
fillCircle(g, x, y, radius);
radius--;
x--; y--;
//#ifndef PARTICLES_LOW
g.setColor(m_p1[i]);
fillCircle(g, x, y, radius);
//#endif
x--; y--;
g.setColor(HIGHLIGHT_RGB);
g.drawLine(x,y,x,y);
break;
case TYPE_LEAF:
//#ifndef PARTICLES_LOW
if (vx==0 && vy==0 && y>Engine.SCREEN_HEIGHT-20) { remove(i); break; }
// swaying motion
if (vx < -(4-Engine.getRandom(4))) m_fp_fx[i] = (1<<FP_SHIFT)>>1;
if (vx >= (4-Engine.getRandom(4))) m_fp_fx[i] = (-1<<FP_SHIFT)>>1;
if (m_p1[i] != 0) g.setColor(m_p1[i]);
else g.setColor(LEAF_RGB_1);
angle = (vx + 4)*(-180/(4*2)) - 90;
length = /*(i%3==0) ? 6 :*/ 4;
x1 = (length*Engine.sin(angle-100))>>FP_SHIFT;
y1 = (length*Engine.cos(angle-100))>>FP_SHIFT;
x2 = (length*Engine.sin(angle+100))>>FP_SHIFT;
y2 = (length*Engine.cos(angle+100))>>FP_SHIFT;
g.drawLine(x, y, x+x1, y+y1);
g.drawLine(x, y-1, x+x1, y+y1);
//if (i%3==0) g.drawLine(x, y-2, x+x1, y+y1);
g.drawLine(x, y+1, x+x1, y+y1);
g.drawLine(x, y, x+x2, y+y2);
g.drawLine(x, y-1, x+x2, y+y2);
//if (i%3==0) g.drawLine(x, y-2, x+x2, y+y2);
if (m_p1[i] != 0) g.setColor(m_p1[i]);
else g.setColor(LEAF_RGB_2);
g.drawLine(x, y+1, x+x2, y+y2);
//#endif
break;
case TYPE_CROSS:
length = (m_life[i] - m_age[i])*CROSS_LENGTH;
width = length>>1;
if (length>3) {
blendRGB(g, m_p1[i], m_p2[i], 1, 3);
g.drawLine(x-1, y-(length>>1), x-1, y+(length>>1));
g.drawLine(x+1, y-(length>>1), x+1, y+(length>>1));
g.drawLine(x-(width>>1), y-1, x+(width>>1), y-1);
g.drawLine(x-(width>>1), y+1, x+(width>>1), y+1);
}
blendRGB(g, m_p1[i], m_p2[i], 2, 3);
g.drawLine(x, y-length, x, y+length);
g.drawLine(x-width, y, x+width, y);
break;
case EMITTER_FIRE_LEFT:
case EMITTER_FIRE_RIGHT:
if (m_type[i]==EMITTER_FIRE_LEFT) {
image = Coords.EFLAME_L_1 + (m_age[i]%2);
x -= (Engine.COORDS[Coords.EFLAME_L_1][Engine.WIDTH]>>1);
} else {
image = Coords.EFLAME_R_1 + (m_age[i]%2);
x += (Engine.COORDS[Coords.EFLAME_R_1][Engine.WIDTH]>>1);
}
x -= (Engine.COORDS[image][Engine.WIDTH]>>1);
y -= (Engine.COORDS[image][Engine.HEIGHT]>>1);
// keep the emitter synced with the boards vertical movement
if (m_age[i] > 0 && m_p2[i]<Level.s_board_offset_total)
m_p2[i] = Level.s_board_offset_total;
Engine.drawImage(g, image, x, y + m_p2[i]);
Engine.clipScreen(g); // reclip screen for rest of particles
break;
case TYPE_FIRE_LEFT_UNIT:
case TYPE_FIRE_RIGHT_UNIT:
if (m_age[i]>=m_life[i]) image = (m_type[i]==TYPE_FIRE_LEFT_UNIT)?Coords.SFLAME_L_1:Coords.SFLAME_R_1 + (i%2);
else image = Coords.MFLAME_1 + (m_age[i]%2);
// m_p1 stores the id of it's emitter - keep this is sync with the emitter's vertical position
y = (m_fp_y[m_p1[i]]>>FP_SHIFT) + m_p2[m_p1[i]];
x -= (Engine.COORDS[image][Engine.WIDTH]>>1);
y -= (Engine.COORDS[image][Engine.HEIGHT]>>1);
Engine.drawImage(g, image, x, y);
Engine.clipScreen(g); // reclip screen for rest of particles
break;
case TYPE_TNT_UNIT:
// use m_p1[i] and m_p2[i] as the x,y distance from the explosion center
radius = 2*(m_life[i]-m_age[i]) +3;
g.setColor(TNT_UNIT_RGB_1);
fillCircle(g, x, y, radius);
//radius--;
x -= m_p1[i]/3; y -= m_p2[i]/3;
g.setColor(TNT_UNIT_RGB_2);
fillCircle(g, x, y, radius);
//radius--;
x -= m_p1[i]/3; y -= m_p2[i]/3;
g.setColor(TNT_UNIT_RGB_3);
fillCircle(g, x, y, radius);
m_p1[i] -= (m_p1[i]>>2);
m_p2[i] -= (m_p2[i]>>2);// -1;
break;
case TYPE_TOXIC_UNIT:
/*length = m_p2[i];
offset = (x+y)+(x*y);
x1 = x + Engine.getRandom(2)-1;
y1 = y + Engine.getRandom(2)-1;
radius = (((length>>2)*Engine.sin(m_clock*23 + m_p1[i]+offset))>>FP_SHIFT) + length*2;
g.setColor(getCreatureColor(Critter.CREATURE_TOXIC, 0));
fillCircle(g, x1, y1, radius);
//#ifndef PARTICLES_LOW
radius--;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -