📄 tukcanvas.java
字号:
import com.nokia.mid.ui.FullCanvas;
import java.io.PrintStream;
import java.util.Random;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class TukCanvas extends FullCanvas
implements Repeater, Runnable
{
public final int KEY_OPTION = -6;
public final int KEY_CANCEL = -7;
private Point cPos = new Point(0, 0);
private Point cMapPos = new Point(0, 0);
private Map map;
private Image imgCar;
private Image imgCarFront;
private Image imgCarBack;
private Image imgCarLeft;
private Image imgCarRight;
private Image imgFace1;
private Repeat repeat;
private Car myCar;
private TukMIDP midlet;
Image imgBuffer;
Graphics buffer;
int gTYPE = 20;
int pixel = 20;
int viewMapPixel = 3;
int width;
int height;
int mapX;
int mapY;
int startX;
int startY;
int mesgMode;
String mesg = "";
int fuel = 150;
int speed = 650;
int count;
int lifeCount = 3;
int gabBuffer = 10;
int manNo;
int score;
int fromEdge = 3;
Man[] mans;
Point pickPos;
String destination = "";
Random random = new Random();
Thread thread;
int carDirection = 6;
boolean isEnable = true;
boolean isGameOver;
boolean isExplain;
boolean isShowTime;
boolean isShowMsg;
boolean isHalt;
boolean isFull;
boolean isMenuShow;
boolean isViewMapMode;
boolean isExitMenu;
int gameLevel = 7;
boolean runMode = true;
TukCanvas.TimeCounter totalTime;
TukCanvas.TimeCounter eachTime;
public TukCanvas(TukMIDP midlet, int manNo, int speed)
{
this.totalTime = new TukCanvas.TimeCounter(this);
this.eachTime = new TukCanvas.TimeCounter(this);
this.map = new Map(this.pixel);
this.width = getWidth();
this.height = getHeight();
this.manNo = manNo;
this.midlet = midlet;
this.speed = speed;
this.mans = new Man[manNo];
this.mapX = this.map.sizeX;
this.mapY = this.map.sizeY;
}
public void paint(Graphics g) {
if (!(this.isViewMapMode))
{
if (this.imgBuffer == null)
this.imgBuffer = Image.createImage(this.width + this.gabBuffer * this.pixel, this.height + this.gabBuffer * this.pixel);
if (this.buffer == null)
this.buffer = this.imgBuffer.getGraphics();
if (this.isEnable)
{
drawMap();
drawCar();
this.buffer.setFont(Font.getFont(64, 0, 0));
if (this.isShowMsg) {
this.buffer.setColor(0, 0, 200);
this.buffer.fillRoundRect(30, this.height - 20, this.width - 60, 20, 5, 5);
this.buffer.setColor(255, 255, 255);
this.buffer.drawString(this.mesg, 50, this.height - 15, this.gTYPE);
}
this.buffer.setColor(255, 0, 0);
this.buffer.drawString(this.destination, 70, 5, this.gTYPE);
this.buffer.setColor(255, 255, 255);
this.buffer.fillRect(5, 5, 50, 3);
this.buffer.setColor(255, 0, 0);
this.buffer.fillRect(5, 5, this.fuel / 3, 3);
this.buffer.setFont(Font.getFont(64, 1, 0));
this.buffer.setColor(255, 0, 0);
this.buffer.drawString("$ : ".concat(String.valueOf(String.valueOf(this.score))), 5, 10, this.gTYPE);
this.buffer.drawString(String.valueOf(String.valueOf(new StringBuffer("n : ").append(this.count).append("/").append(this.manNo))), 5, 25, this.gTYPE);
this.buffer.drawString("x ".concat(String.valueOf(String.valueOf(this.lifeCount))), 5, this.height - 15, this.gTYPE);
if (this.isExplain)
drawExplainScreen();
} else {
drawGameMessage();
}
if (this.isMenuShow)
drawMenu();
}
else {
drawViewMap();
}
g.drawImage(this.imgBuffer, 0, 0, this.gTYPE);
}
public void initGame()
{
this.isEnable = true;
this.isGameOver = false;
this.isExplain = false;
this.isShowTime = false;
this.isShowMsg = false;
this.isHalt = false;
this.isFull = false;
this.isMenuShow = false;
this.isViewMapMode = false;
this.isExitMenu = false;
this.count = 0;
this.score = 0;
this.destination = "";
this.fuel = 150;
this.lifeCount = 3;
if (this.buffer != null)
this.buffer.setFont(Font.getDefaultFont());
this.mesg = "";
this.imgCar = this.imgCarRight;
if (this.myCar == null)
this.myCar = new Car("car", this.imgCar, 127, new Point(0, 0));
else
this.myCar.setPosition(new Point(0, 0));
this.cPos.x = (this.cPos.y = 0);
loadMan();
Thread t1 = new Thread(new TukCanvas.CarRunner(this));
Thread t2 = new Thread(this.totalTime);
t1.start();
t2.start();
repaint(); }
public void run() {
loadImage();
initGame();
}
void drawCar() {
Point carPos = this.myCar.getPosition();
this.buffer.drawImage(this.imgCar, (carPos.x - this.cPos.x) * this.pixel, (carPos.y - this.cPos.y) * this.pixel, this.gTYPE); }
void drawGameMessage() {
this.buffer.setColor(150, 150, 150);
this.buffer.fillRoundRect(10, 30, this.width - 20, this.height - 60, 10, 10);
this.buffer.setColor(255, 255, 255);
this.buffer.drawRoundRect(10, 30, this.width - 20, this.height - 60, 10, 10);
if (this.isGameOver) {
this.buffer.setFont(Font.getFont(64, 1, 16));
this.buffer.drawString("GAME OVER", 45, 55, this.gTYPE);
this.buffer.setFont(Font.getFont(64, 1, 0));
this.buffer.drawString("Your score : ".concat(String.valueOf(String.valueOf(this.score))), 30, 85, this.gTYPE);
} else {
switch (this.mesgMode)
{
case 0:
this.buffer.setFont(Font.getFont(64, 1, 16));
this.buffer.drawString(" YOU WIN", 45, 55, this.gTYPE);
this.buffer.setFont(Font.getFont(64, 1, 0));
this.buffer.drawString("Your score : ".concat(String.valueOf(String.valueOf(this.score))), 30, 85, this.gTYPE);
this.buffer.drawString("Time ".concat(String.valueOf(String.valueOf(this.totalTime.getTime()))), 30, 115, this.gTYPE);
break;
case 1:
this.buffer.setFont(Font.getFont(64, 1, 0));
this.buffer.drawString("Empty Fuel", 45, 75, this.gTYPE); }
}
}
void drawExplainScreen() {
this.buffer.setColor(0, 0, 200);
this.buffer.setFont(Font.getFont(64, 0, 0));
this.buffer.fillRect(0, this.height - 48, this.width, 48);
this.buffer.fillRoundRect(0, this.height - 50, this.width, 5, 5, 5);
this.buffer.drawImage(this.imgFace1, 0, this.height - this.imgFace1.getHeight(), this.gTYPE);
this.buffer.setColor(150, 150, 150);
this.buffer.fillRoundRect(55, this.height - 42, this.width - 60, 35, 5, 5);
this.buffer.setColor(0, 0, 0);
if (!(this.isFull)) {
this.buffer.drawString("I want to go to ..", 65, this.height - 37, this.gTYPE);
this.buffer.setColor(255, 0, 0);
this.buffer.drawString(String.valueOf(String.valueOf(new StringBuffer("\"").append(this.destination).append("\""))), 62, this.height - 20, this.gTYPE);
} else {
this.buffer.drawString("\"Thank you.\"", 70, this.height - 30, this.gTYPE);
}
if (this.isShowTime) {
this.buffer.setColor(150, 150, 150);
this.buffer.fillRoundRect(10, 100, this.width - 20, this.height - 150, 10, 10);
this.buffer.setColor(255, 255, 255);
this.buffer.drawRoundRect(10, 100, this.width - 20, this.height - 150, 10, 10);
this.buffer.setFont(Font.getFont(64, 1, 0));
this.buffer.drawString("Time ".concat(String.valueOf(String.valueOf(this.eachTime.getTime()))), 30, 125, this.gTYPE);
}
}
void newLife()
{
this.isEnable = false;
this.isHalt = true;
this.mesgMode = 1;
repaint();
try {
Thread.sleep(3000L); } catch (Exception localException) {
}
this.isEnable = true;
this.isHalt = false;
this.isExplain = false;
this.destination = "";
this.isFull = false;
this.fuel = 150;
this.myCar.pos.x = 0;
this.myCar.pos.y = 0;
this.cPos.x = 0;
this.cPos.y = 0;
this.lifeCount -= 1;
if (this.lifeCount < 1)
finishGame(true);
}
void drawMenu() {
int blockHieght = 35;
int margin = 2;
int noBlock = 3;
this.buffer.setColor(255, 255, 255);
this.buffer.fillRect(0, this.height - 80, this.width, 80);
this.buffer.setColor(0, 0, 0);
this.buffer.setFont(Font.getFont(64, 1, 16));
this.buffer.drawString("Yes", 5, this.height - 20, this.gTYPE);
this.buffer.drawString("No", this.width - 25, this.height - 20, this.gTYPE);
this.buffer.setFont(Font.getDefaultFont());
this.buffer.setColor(100, 100, 100);
this.buffer.fillRect(3, this.height - 78, this.width - 6, 50);
this.buffer.fillRect(5, this.height - 76, this.width - 6, 50);
this.buffer.setColor(255, 255, 255);
this.buffer.fillRect(1, this.height - 80, this.width - 6, 50);
this.buffer.setColor(0, 0, 0);
this.buffer.drawRect(1, this.height - 80, this.width - 6, 50);
if (this.isExitMenu)
this.buffer.drawString("Quit game ? ", 10, this.height - 70, this.gTYPE);
else
this.buffer.drawString("Play again ? ", 10, this.height - 70, this.gTYPE);
}
private void drawMap() {
byte code = 0;
int x = 0; int y = 0;
for (int i = -(this.gabBuffer / 2); i < this.width / this.pixel + this.gabBuffer / 2; ++i)
for (int j = -(this.gabBuffer / 2); j < this.height / this.pixel + this.gabBuffer / 2; ++j) {
x = i + this.cPos.x;
y = j + this.cPos.y;
if (x >= this.mapX) break; if (y >= this.mapY)
break;
if (x < 0) x = 0;
if (y < 0) y = 0;
code = this.map.getCode(x, y);
if ((code != 0) && (code != 2)) {
Image img = this.map.getObject(code).getImage();
if (img == null)
System.out.println("Image is null ".concat(String.valueOf(String.valueOf(code))));
this.buffer.drawImage(img, i * this.pixel, j * this.pixel, this.gTYPE);
}
}
}
private void drawViewMap()
{
boolean isDest = false;
boolean isEmpty = true;
byte code = 0;
int x = 0; int y = 0; int w = 0; int h = 0;
int indexX = 0; int indexY = 0;
this.buffer.setColor(255, 255, 255);
this.buffer.fillRect(0, 0, this.width, this.height);
Point tempPos = this.myCar.getPosition();
int mWidth = this.width / this.viewMapPixel;
int mHeight = this.height / this.viewMapPixel;
for (int i = 0; i < mWidth; ++i)
for (int j = 0; j < mHeight; ++j) {
x = i * this.viewMapPixel;
y = j * this.viewMapPixel;
w = this.viewMapPixel;
h = this.viewMapPixel;
int mapPosX = this.cMapPos.x + i;
int mapPosY = this.cMapPos.y + j;
if (mapPosX > this.map.sizeX)
break;
if (mapPosY > this.map.sizeY)
break;
code = this.map.getCode(mapPosX, mapPosY);
if ((code < 3) || (code >= 51)) {
if (code == 0) {
this.buffer.setColor(0, 100, 255);
this.buffer.fillRect(x, y, w, h);
} else {
this.buffer.setColor(0, 255, 0);
this.buffer.fillRect(x, y, w, h);
}
} else if (code < 21) {
if (code == 20) {
this.buffer.setColor(255, 0, 0);
this.buffer.fillRect(x, y, w, h);
}
else
{
this.buffer.setColor(100, 100, 100);
this.buffer.fillRect(x, y, w, h);
}
} else if (code <= 41) {
this.buffer.setColor(0, 100, 255);
this.buffer.fillRect(x, y, w, h);
this.buffer.setColor(0, 0, 0);
this.buffer.drawRect(x, y, w, h);
isDest = this.destination.equals(this.map.getObject(code).getName());
if (isDest) {
indexX = mapPosX;
indexY = mapPosY;
isEmpty = false;
}
}
if ((tempPos.x == mapPosX) && (tempPos.y == mapPosY))
{
this.buffer.setColor(255, 255, 255);
this.buffer.fillRect(x, y, w, h);
this.buffer.setColor(0, 0, 0);
this.buffer.drawRect(x, y, w, h);
}
}
if (!(isEmpty)) {
this.buffer.setColor(255, 0, 0);
this.buffer.drawLine((indexX - this.cMapPos.x) * this.viewMapPixel, (indexY - this.cMapPos.y) * this.viewMapPixel, this.viewMapPixel * (indexX + 2 - this.cMapPos.x), this.viewMapPixel * (indexY + 2 - this.cMapPos.y));
this.buffer.drawLine((indexX - this.cMapPos.x) * this.viewMapPixel, (indexY + 2 - this.cMapPos.y) * this.viewMapPixel, this.viewMapPixel * (indexX + 2 - this.cMapPos.x), this.viewMapPixel * (indexY - this.cMapPos.y));
this.buffer.drawLine((indexX - this.cMapPos.x) * this.viewMapPixel, (indexY - this.cMapPos.y) * this.viewMapPixel + 1, this.viewMapPixel * (indexX + 2 - this.cMapPos.x), this.viewMapPixel * (indexY + 2 - this.cMapPos.y) + 1);
this.buffer.drawLine((indexX - this.cMapPos.x) * this.viewMapPixel, (indexY + 2 - this.cMapPos.y) * this.viewMapPixel + 1, this.viewMapPixel * (indexX + 2 - this.cMapPos.x), this.viewMapPixel * (indexY - this.cMapPos.y) + 1);
}
}
private void loadMan()
{
for (int i = 0; i < this.manNo; ++i) {
if (this.mans[i] != null)
this.map.setCode(this.mans[i].pos.x, this.mans[i].pos.y, this.mans[i].roadCode);
int x = 0;
int y = 0;
byte code = this.map.getCode(x, y);
while ((code < 3) || (code > 13) || (x == 0) || (y == 0))
{
x = Math.abs(this.random.nextInt() % this.mapX);
y = Math.abs(this.random.nextInt() % this.mapY);
code = this.map.getCode(x, y);
}
this.mans[i] = new Man(this.map.getObject(20).getImage(), 20, new Point(x, y), this.map.getRandomPlace(), this.map.getCode(x, y));
this.map.setCode(x, y, 20);
}
}
private void loadImage()
{
try
{
this.imgCarFront = Image.createImage("/carfront.png");
this.imgCarBack = Image.createImage("/carback.png");
this.imgCarLeft = Image.createImage("/carleft.png");
this.imgCarRight = Image.createImage("/carright.png");
this.imgFace1 = Image.createImage("/manFace1.png");
}
catch (Exception ex) {
System.out.println("Cound not load car image".concat(String.valueOf(String.valueOf(ex))));
}
}
public void goLeft()
{
this.carDirection = 2;
byte b = 0;
if (this.imgCar.equals(this.imgCarFront))
b = this.map.getCode(this.myCar.pos.x - 1, this.myCar.pos.y + 1);
else
b = this.map.getCode(this.myCar.pos.x - 1, this.myCar.pos.y);
if ((b < 3) || (b > 20)) {
return;
}
if (!(this.isFull)) {
this.fuel -= 1;
if (this.fuel < 0)
newLife();
}
if (this.imgCar.equals(this.imgCarFront)) {
this.myCar.pos.y += 1;
this.myCar.pos.x -= 1;
} else if (this.imgCar.equals(this.imgCarBack)) {
this.myCar.pos.x -= 1;
}
if (this.imgCar.equals(this.imgCarLeft))
this.myCar.pos.x -= 1;
this.imgCar = this.imgCarLeft;
if (this.myCar.pos.x < 0)
this.myCar.pos.x = 0;
if (this.myCar.pos.x - this.cPos.x < this.fromEdge) {
this.cPos.x -= 1;
if (this.cPos.x < 0)
this.cPos.x = 0;
}
repaint(); }
public void goRight() {
this.carDirection = 5;
byte b = 0;
if (this.imgCar.equals(this.imgCarFront))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -