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

📄 introscreen.java

📁 这是一个Java座的扫雷游戏
💻 JAVA
字号:
/*
 * Siemens AG
 * Mobile Radio Terminals
 * Munich, Germany
 * .AUTHOR      Michael Becker CT SE 2 / Sam Nova (THQ)
 * .PACKAGE		GameAPI_Demo
 * .STATUS         DRAFT
 * .CHANGE_CONTROL
 * Version |  Date  	| Changed by | 	Reason for Change
 * 1.0    	21.05.01  		M.Becker		file created.
 * 1.1          26.06.01   Jan Eichholz Math.randomInt removed 
*/

package GameAPI_Demo;


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

import com.siemens.mp.game.*;


class IntroScreen extends MyScreen
{
	private static final int numSprites = 40;
	public boolean running;
	private boolean readyToPaint = false;
	private static final int GAME_SCREEN_WIDTH = 96;
	private static final int GAME_SCREEN_HEIGHT = 80;

	private int gravity = 0x4000;
	private int numberExtraActive, delayExtra;

	private Sprite [] spr;
	private Image gameScreenImage;
	private ExtendedImage gameScreen = null;
	private GraphicObjectManager gfxManager;

	private byte [] [] byteArrays = new byte[128][];
	private int numberArraysUsed = 0;
	private int state, nDelay, nNextActivate, nFrameCounter;
	private boolean bFirePressed;

	// Extra sprites
	private Sprite [] extraSpr;
	private int numberExtra = 0;
	private int [] extraX;
	private int [] extraY;
	private int [] extraXVel;
	private int [] extraYVel;

	private int [] posX = new int[numSprites];
	private int [] posY = new int[numSprites];
	private int [] speedY = new int[numSprites];
	private int [] active = new int [numSprites];		// 0 = active... otherwise the delay until it gets active..


	public IntroScreen()
	{
		// new gameScreen
		try
		{   
			gameScreenImage = Image.createImage(GAME_SCREEN_WIDTH, GAME_SCREEN_HEIGHT);
			gameScreen = new ExtendedImage(gameScreenImage);
			gameScreen.clear((byte)0);			
		}catch(Exception e)
		{
			System.out.println("Exception: "+e);
		}

		gfxManager= new GraphicObjectManager();

		try
		{
			spr = new Sprite[numSprites];
			byte [] megaSpriteBytes = ReadByteArray("res\\title.bin", (96>>3) * 81, 0);

			System.gc();
			//			System.out.println("creating sprites : free memory " + Runtime.getRuntime().freeMemory());
			for (int y = 0; y < numSprites; y++)
			{
				System.gc();
				byteArrays[numberArraysUsed] = new byte[24];
				System.arraycopy(megaSpriteBytes, y * 24, byteArrays[numberArraysUsed], 0, 24);
				try
				{
					spr[y] = new Sprite(byteArrays[numberArraysUsed], 0, 96,2, null, 0, 1);
				}catch(Exception e)
				{
					System.out.println("Exception: "+e);
				}

				posX[y] = (GAME_SCREEN_WIDTH + 8) << 16;		// Off screen
				posY[y] = y << 17;				
				active[y] = y;
				spr[y].setPosition(posX[y]>> 16, posY[y] >> 16);
				gfxManager.addObject(spr[y]);
				numberArraysUsed++;
			}
			megaSpriteBytes = null;

			extraSpr = new Sprite[15];
			extraX = new int[15];
			extraY = new int[15];

				extraXVel = new int[15];
			extraYVel = new int[15];

			// Add the BART :)

			int index = AddExtraSprite("res\\spr1.bin", "res\\spr1.mask", 24,20,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

			index = AddExtraSprite("res\\spr2.bin", "res\\spr2.mask", 24,18,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

				index = AddExtraSprite("res\\spr3.bin", "res\\spr3.mask", 24,18,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

				index = AddExtraSprite("res\\spr4.bin", "res\\spr4.mask", 24,18,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

				index = AddExtraSprite("res\\spr5.bin", "res\\spr5.mask", 32,26,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

			index = AddExtraSprite("res\\spr1.bin", "res\\spr1.mask", 24,20,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

			index = AddExtraSprite("res\\spr2.bin", "res\\spr2.mask", 24,18,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

				index = AddExtraSprite("res\\spr3.bin", "res\\spr3.mask", 24,18,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

				index = AddExtraSprite("res\\spr4.bin", "res\\spr4.mask", 24,18,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

				index = AddExtraSprite("res\\spr5.bin", "res\\spr5.mask", 32,26,1);
			setExtraPositionRandom(index);
			extraSpr[index].setVisible(false);

		}catch(Exception e)
		{
			System.out.println("Exception: "+e);
		}
		System.gc();

		gameScreen.clear((byte)0);
	
		readyToPaint = true;
		numberExtraActive = 0;
		delayExtra = 0;
		
	}


	public void Dispose()
	{
		spr = null;
		gameScreen = null;

		// We should remove all objects from the gfx manager here
		gfxManager = null;
	}


	private int AddExtraSprite(String pixelFile, String maskFile, int width, int height, int numberFrames)
	{
		if (maskFile != null)
		{
			byteArrays[numberArraysUsed] = ReadByteArray(pixelFile, (width >> 3) * height , 0);
			byteArrays[numberArraysUsed+1] = ReadByteArray(maskFile, (width >> 3) * height, 0);
			try
			{
				extraSpr[numberExtra] = new Sprite(byteArrays[numberArraysUsed],0, width, height, byteArrays[numberArraysUsed+1],0, numberFrames);
			}catch(Exception e)
			{
				System.out.println("Exception: "+e);
			}
			numberArraysUsed += 2;
			gfxManager.addObject(extraSpr[numberExtra]);
		}

		numberExtra++;

		return numberExtra - 1;
	}

	private void setExtraPosition(int index, int x, int y)
	{
		extraX[index] = x << 16;
		extraY[index] = y << 16;
		extraSpr[index].setPosition(x,y);
	}

	private void setExtraPositionRandom(int index)
	{
		// Check what edge should be used
		extraX[index] = (Math.abs(GameAPI_Demo.rand.nextInt()) % 64) << 16;
		extraY[index] = (Math.abs(GameAPI_Demo.rand.nextInt()) % 48) << 16;

		int sign = Math.abs(GameAPI_Demo.rand.nextInt());

		extraXVel[index] = (Math.abs(GameAPI_Demo.rand.nextInt()) & 0xffff) + 0x10000;
		if ((sign & 1) == 1)
			extraXVel[index] = -extraXVel[index];

			extraYVel[index] = (Math.abs(GameAPI_Demo.rand.nextInt()) & 0xffff) + 0x10000;
		if ((sign & 1) == 1)
			extraYVel[index] = -extraXVel[index];
	}



	private void updateSprite()
	{

		switch(state)
		{
		case 0 :
			// Init...

			for (int y = 0; y < numSprites; y++)
			{
				if (active[y] != 0)
					active[y]--;
				else
				{
					if (posX[y] > 0)
					{
						int move = posX[y] >> 2;
						if (move < 65536)
							move = 65536;

						move = 65536 * 4;
						//							move = 65536 * 40;
						if (move > posX[y])
							move = posX[y];
						posX[y] -= move;

					}
					else
						posX[y]	= 0;
				}
				spr[y].setPosition(posX[y] >> 16,y << 1);
				bFirePressed = false;

				if (posX[numSprites-1] == 0)
					state = 1;
			}
			break;
		case 1 :
			// Idle
			if (delayExtra != 0)
				delayExtra--;
			else
			{
				delayExtra = 20;
				if (numberExtraActive != numberExtra)
				{
					extraSpr[numberExtraActive].setVisible(true);
					numberExtraActive++;
				}
			}

			// Wait for button press..

			if (bFirePressed)
			{
				state = 2;
				nDelay = 0;
				for (int y = 0; y < numSprites; y++)
				{
					active[y] = 0;
					speedY[y] = 0;
				}
				nNextActivate = numSprites - 1;

			}
			break;
		case 2 :
			// exit

			if (numberExtraActive != 0)
			{
				if (delayExtra != 0)
					delayExtra--;
				else
				{
					delayExtra = 5;
					numberExtraActive--;

					extraSpr[numberExtraActive].setVisible(false);
				}
			}
			else
			{
				if (nDelay > 0)
					nDelay--;
				else
				{
					nDelay = 1;
					// Activate the next
					if (nNextActivate >= 0)
					{
						active[nNextActivate] = 1;
						speedY[nNextActivate] = 0x10000;
						nNextActivate--;
					}
				}
				for (int y = 0; y < numSprites; y++)
				{
					if (active[y] == 1)
						speedY[y] += gravity;

					posY[y] += speedY[y];

					spr[y].setPosition(0,posY[y] >> 16);

					if (posY[y] > (80 << 16))
						spr[y].setVisible(false);
				}

				if (posY[0] > (80 << 16))
					running = false;
			}

			break;
		}
		// Lets move some sprites over the screen...
		for (int i = 0; i < numberExtraActive; i++)
		{
			extraX[i] += extraXVel[i];
			extraY[i] += extraYVel[i];					

			if (extraX[i] < 0)
			{
				extraX[i] = 0;
				extraXVel[i] = -extraXVel[i];
			}
			else if (extraX[i] > (96-24) << 16)
			{
				extraXVel[i] = -extraXVel[i];
			}

			if (extraY[i] < 0)
			{
				extraY[i] = 0;
				extraYVel[i] = -extraYVel[i];
			}
			else if (extraY[i] > (80-24) << 16)
			{
				extraYVel[i] = -extraYVel[i];
			}
			extraSpr[i].setPosition(extraX[i] >> 16, extraY[i] >> 16);
		}

	}


	/**
	* Method declaration
	*
	*
	* @param g
	*
	* @see
	*/
	public void paint(Graphics g)
	{
		//no normal painting used!
		//paint all Sprites (no repaint necessary!)
		if (gameScreen != null && readyToPaint)
		{
			gameScreen.clear((byte)0);
			try
			{
				gfxManager.paint(gameScreen, 0, 0);
				gameScreen.blitToScreen(0,0);
			}catch(Exception e)
			{
				System.out.println("Exception: "+e);
			}

		}
	}

	public int getReturnValue()
	{
		return 0;
	}

	protected void keyPressed(int keyCode)
	{
		int key = getGameAction(keyCode);

		switch(key)
		{
		case Canvas.FIRE :
			bFirePressed = true;
			break;
		}
	}


	public void run()
	{
		running = true;
		state = 0;
		nFrameCounter = 0;

		while (running)
		{
			try
			{
				Thread.yield();
				//				Thread.sleep(20);
			}
			catch (Exception exc)
			{
			}

			//move the sprites
			nFrameCounter++;
			updateSprite();

			//clear the doublebuffer
			//spriteManager.clearGameScreenWithBackground(gameScreen, Background96x80.image); // Rather slow...
			//System.arraycopy(clearScreen, 0 , gameScreen, 0, (GAME_SCREEN_WIDTH >> 3) * GAME_SCREEN_HEIGHT);
			gameScreen.clear((byte)0);

			//paint all Sprites (no repaint necessary!)
			try
			{
				gfxManager.paint(gameScreen, 0, 0);
				gameScreen.blitToScreen(0,0);
			}catch(Exception e)
			{
				System.out.println("Exception: "+e);
			}

		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -