package elements;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.swing.JOptionPane;
import level.Level;
import level.LevelManager;
public class Stage implements Drawable{
TileMap tileMap;
String [][] map ;
Element [][] elements ; // this array is used for quick look up by indeies
ArrayList<Element> laserList = new ArrayList<Element>();
ArrayList<Element> wallList = new ArrayList<Element>();
ArrayList<Element> normaList = new ArrayList<Element>();
ArrayList<Coin> coinList = new ArrayList<Coin>();
Map<String ,Light> lightsMap = new HashMap<String, Light>();
Element currentSelected ;
int currentLevelIndex =1;
Level currentLevel ;
public Stage(){
tileMap = new TileMap();
intiStage();
}
public void intiStage(){
laserList.clear();
normaList.clear();
wallList.clear();
coinList.clear();
currentSelected=null;
elements =new Element[TileMap.ROWS][TileMap.COLS];
loadMap(currentLevelIndex);
addElement();
generateLight();
}
public void createElement(int i,int j,String str){
String[] arr= str.split("-");
int type = Integer.valueOf(arr[0]);
int color = Integer.parseInt(arr[1]);
int direction = Integer.valueOf(arr[2]);
int actType = Integer.valueOf(arr[3]);
Element element = null;
switch (type) {
case Element.LASER:element= new Laser(i, j, color, direction,actType);laserList.add(element);break;
case Element.WALL1:element= new Wall1(i, j, color, direction,actType);wallList.add(element);break;
case Element.WALL2:element= new Wall2(i, j, color, direction,actType);wallList.add(element);break;
case Element.WALL3:element= new Wall3(i, j, color, direction,actType);wallList.add(element);break;
case Element.COIN:element= new Coin(i, j, color, direction,actType);coinList.add((Coin)element);break;
case Element.BLOCK:element= new Block(i, j, color, direction,actType);normaList.add(element);break;
case Element.MIRROR:element= new Mirror(i, j, color, direction,actType);normaList.add(element);break;
case Element.DMIRROR:element= new DMirror(i, j, color, direction,actType);normaList.add(element);break;
case Element.TWOWAY1:element= new Twoway1(i, j, color, direction,actType);normaList.add(element);break;
case Element.TWOWAY2:element= new Twoway2(i, j, color, direction,actType);normaList.add(element);break;
case Element.THREEWAY:element= new Threeway(i, j, color, direction,actType);normaList.add(element);break;
case Element.EIGHTWAY:element= new Eightway(i, j, color, direction,actType);normaList.add(element);break;
case Element.STRAIGHT:element= new Straight(i, j, color, direction,actType);normaList.add(element);break;
case Element.CROSS:element= new Cross(i, j, color, direction,actType);normaList.add(element);break;
case Element.REFRACTION:element= new Refraction(i, j, color, direction,actType);normaList.add(element);break;
}
elements[i][j]=element;
map[i][j]=""+type+"-"+color+"-"+direction+"-"+actType;
}
public void addElement(){
for(int i =0;i<map.length;i++){
for(int j = 0;j<map[i].length;j++){
String str = map[i][j];
if(!"".equals(str)){
createElement(i,j,str);
}
}
}
}
public ArrayList<Coin> getCoinList() {
return coinList;
}
public String[][] getMap() {
return map;
}
public void generateLight(){
lightsMap.clear();
for(int i =0; i<coinList.size();i++){
coinList.get(i).acceptColor.clear();
coinList.get(i).acceptDirection.clear();
}
for(int i =0;i<laserList.size();i++){
Element element = laserList.get(i);
if(((Laser)element).show)addLight(element.rindex,element.cindex,element.direction,element.color);
}
}
//recursion
public void addLight(int i,int j, int direction,int color){
int[] step = getStep(direction);
int starti = i;
int startj = j;
i+=step[0];
j+=step[1];
while(i>=0&&i<TileMap.ROWS&&j>=0&&j<TileMap.COLS){
if(elements[i][j]!=null){
if(elements[i][j].type==Element.COIN){
((Coin)elements[i][j]).accept(color,direction);
}
if(!elements[i][j].canGo(direction)){
int[][] output = elements[i][j].output(direction, color);
if(output!=null){
for(int k=0;k<output.length;k++){
addLight(i,j, output[k][0],output[k][1]);
}
}
break;
}
}
i+=step[0];
j+=step[1];
}
//if light exist, mix the color of it.
if(lightsMap.containsKey(""+starti+startj+i+j)||lightsMap.containsKey(""+i+j+starti+startj)){
Light light = lightsMap.get(""+starti+startj+i+j)!=null?lightsMap.get(""+starti+startj+i+j):lightsMap.get(""+i+j+starti+startj);
light.color = light.color|color;
}else{
lightsMap.put(""+starti+startj+i+j,new Light(starti,startj,i,j,color));
}
}
public int[] getStep(int direction){
int[] step =null;
switch (direction) {
case 1: step = new int[]{-1,0}; break;
case 2: step = new int[]{-1,1}; break;
case 3: step = new int[]{0,1}; break;
case 4: step = new int[]{1,1}; break;
case 5: step = new int[]{1,0}; break;
case 6: step = new int[]{1,-1}; break;
case 7: step = new int[]{0,-1}; break;
case 8: step = new int[]{-1,-1};break;
}
return step;
}
public boolean checkWin(){
for(int i=0;i<coinList.size();i++){
if(!coinList.get(i).isAccept())return false;
}
return true;
}
@Override
public void draw(Graphics2D g) {
// TODO Auto-generated method stub
tileMap.draw(g);
drawLight(g);
drawWall(g);
drawCoin(g);
drawLaser(g);
drawItem(g);
g.setColor(Color.white);
g.drawString("Current Level: "+ this.getCurrentLevelIndex()+"/"+LevelManager.getLevelCount(),900, TileMap.ROWS*TileMap.CELLWIDTH+TileMap.offsetY );
if(checkWin()){
g.drawString("Level passed ",600,400);
}
}
public void drawCoin(Graphics2D g){
for(int i =0; i<coinList.size();i++){
coinList.get(i).draw(g);
}
}
public void drawLaser(Graphics2D g){
for(int i =0; i<laserList.size();i++){
laserList.get(i).draw(g);
}
}
public void drawWall(Graphics2D g){
for(int i =0; i<wallList.size();i++){
wallList.get(i).draw(g);
}
}
public void drawItem(Graphics2D g){
for(int i =0; i<normaList.size();i++){
normaList.get(i).draw(g);
}
}
public void drawLight(Graphics2D g){
Set<String> set = lightsMap.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String id = (String) iterator.next();
Light light = lightsMap.get(id);
light.draw(g);
}
}
public void loadMap(int i ){
if(i==0){
templateLevel();
}else{
currentLevel = LevelManager.getLevel(currentLevelIndex);
map =currentLevel.getMap();
}
}
public int getCurrentLevelIndex(){
return currentLevelIndex;
}
public Level getCurrentLevel(){
return currentLevel;
}
public void newLevel(){
currentLevelIndex=0;
this.intiStage();
}
public void nextLevel(){
currentLevelIndex =(currentLevelIndex==LevelManager.getLevelCount())?1:currentLevelIndex+1;
this.intiStage();
}
public void prevLevel(){
currentLevelIndex = (currentLevelIndex==1)?LevelManager.getLevelCount():currentLevelIndex-1;
this.intiStage();
}
public void setCurrentLevelIndex(int i){
currentLevelIndex=i;
}
public void templateLevel(){
map =new String[][]{
{"2-0-3-4","1-0-1-4","1-0-1-4","3-0-5-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","1-0-1-4","2-0-5-4"},
{"1-0-3-4","","","1-0-3-4","","","","","","","","","","","","","","","","","","","1-0-3-4"},
{"1-0-3-4","","","1-0-3-4","","","","","","","","","","","","","","","","","","","1-0-3-4"},
{"1-0-3-4","","","
没有合适的资源?快使用搜索试试~ 我知道了~
java 光线折射游戏
共100个文件
png:54个
java:32个
level11:1个
4星 · 超过85%的资源 需积分: 10 17 下载量 190 浏览量
2012-05-15
17:58:51
上传
评论 1
收藏 407KB RAR 举报
温馨提示
java 写的光线折射游戏!不知大家是否玩过Aargon 的那款光线游戏,记得当时觉得挺有意思的,让我痴迷好一阵子。好像我对这种逻辑游戏还是挺热衷的。鼠标左键单击 顺时针旋转道具,右键逆时针。 中键换风格,一种是我之前做的,特丑。由此对美工失去信心。 鼠标拖拽移动道具,松开放置。 注:下载的别人的!之所以再上传时因为在csdn上没有找到相关的东西。想方便大家学习!我正在做电脑版的meon,希望大家到时能喜欢!
资源推荐
资源详情
资源评论
收起资源包目录
java 光线折射游戏 (100个子文件)
Thumbs.db 28KB
lightReflection.jar 290KB
Stage.java 10KB
GameView.java 9KB
EditPanel.java 6KB
DMirror.java 4KB
Refraction.java 3KB
Twoway1.java 3KB
Mirror.java 3KB
Element.java 3KB
Twoway2.java 3KB
ToolPanel.java 2KB
Light.java 2KB
Coin.java 2KB
Threeway.java 1KB
WelcomeView.java 1KB
TileMap.java 1KB
MapUtil.java 1KB
MainFrame.java 854B
Level.java 818B
ImageUtil.java 657B
Eightway.java 496B
Cross.java 478B
View.java 459B
Straight.java 427B
LevelManager.java 398B
Laser.java 393B
Wall2.java 341B
Wall1.java 341B
Wall3.java 341B
NoobButton.java 336B
ColorUtil.java 334B
Block.java 272B
Drawable.java 118B
bg.jpg 19KB
level1 3KB
level10 4KB
level11 4KB
level2 3KB
level3 4KB
level4 3KB
level5 3KB
level6 3KB
level7 3KB
level8 4KB
level9 3KB
coin16711680-2.png 6KB
coin65280-2.png 6KB
coin255-2.png 6KB
coin16776960-2.png 6KB
coin65535-2.png 6KB
coin16711935-2.png 6KB
coin16711680-1.png 6KB
coin16776960-1.png 6KB
coin16711935-1.png 6KB
coin255-1.png 6KB
coin65535-1.png 6KB
coin65280-1.png 6KB
coin16777215-2.png 5KB
coin16777215-1.png 5KB
cross.png 4KB
straight.png 4KB
8way.png 4KB
3way.png 4KB
8way.png 4KB
2way1.png 4KB
wall2.png 4KB
2way2.png 4KB
2way1.png 3KB
laser16711935.png 3KB
laser65280.png 3KB
laser16776960.png 3KB
laser65535.png 3KB
laser255.png 3KB
refraction.png 3KB
laser16711680.png 3KB
3way.png 3KB
block.png 3KB
wall3.png 3KB
wall3.png 3KB
cross.png 3KB
refraction.png 3KB
laser16777215.png 3KB
wall2.png 3KB
2way2.png 3KB
straight.png 3KB
wall1.png 3KB
mirror.png 3KB
laser16777215.png 3KB
laser16711935.png 3KB
laser65280.png 3KB
laser65535.png 3KB
laser16776960.png 3KB
laser16711680.png 3KB
laser255.png 3KB
block.png 3KB
doublemirror.png 3KB
mirror.png 3KB
doublemirror.png 3KB
wall1.png 3KB
共 100 条
- 1
资源评论
- 枫夜求索阁2014-11-22能够运行,界面也还好,就是不怎么会玩,似乎没有游戏帮助
- jacqueline_7232013-10-10我记得这个不能运行 因为下了有一段时间了
yukun314
- 粉丝: 16
- 资源: 24
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功