📄 introscreen.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 + -