⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 particles.java

📁 Critter_Crunch_J2ME 游戏源
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                  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 + -