PDA

View Full Version : ตรวจสอบการตกลงพื้นของ Sprite



pawit1357
21-10-2004, 01:38 AM
ไม่ทราบในเกมส์พวก มาริโอ นี้เขามีวิธีการเช็คยังไงครับ ที่ให้เวลาที่ตัว มาริโอ ไม่ชนอะไรเลยและเดินจนสุดทางเดินแล้วตกลงไปในเหว หรือว่า กระโดดขึ้นไปอยู่บนอิฐแล้ว มันพอเดินเลยที่ไม่มีอิฐแล้วมันตกลงมานะครับ คือตอนนี้ผมเขียนเกมส์แนวนี้อยู่นะครับ กำลังมีปัญหา เรื่องที่กล่าวไปนะครับ ผมลอง ให้มันบวกค่าไปเรื่อง ๆ แล้วรู้สึกว่ามันจะชนกับ tiled แล้วมันเด้งขึ้นลง ไม่หยุดนะ เลยอยากจะรู้แนวคิดรบกวนท่านผู้รู้ด้วยนะครับ ( เออ! เกมส์ที่เขียนเป็นเกมส์บนมือถือนะครับ midp 2.0 (j2me)
นี่เป็นส่วนโคดครับ

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.lang.*;
public class LEVEL01 extends GameCanvas implements Runnable{
private static boolean start;
private static boolean jumpUp;
private static boolean jumpDown;
private static boolean keyStatus;
private static boolean playerStatus;
private static boolean ef,wStatus;
private static final int floor = 208;
private static final int far = 170;
private static Thread runThread;
private static int posX, posY,refPosX, refPosY;
private static int wX,wY,i;
private static byte dir;
private static SpriteEngine playerว
private static TiledLayer gameFloor,brick;
private static LayerManager gLayer,wLayer;

private static int[] map1 = {4,0,0,0,0,0,4,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,
4,1,1,1,1,1,1,0,0,0,0,1,1,1,1,4,4,4,4,4,4,4,4,4,4, //พื้นที่ตั้วละครเหยียบอยู่
4,2,2,2,2,2,2,0,0,1,1,2,2,2,0,4,4,4,4,4,4,4,4,4,4};

public LEVEL01(IZA midlet){
super(true);
setFullScreenMode(true);

int[] map2 = {
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0, //Position of car
0,0,0,0,0,0,0,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0};

gLayer = new LayerManager();
wLayer = new LayerManager();
player = new SpriteEngine(midlet.createImage("/mario.png"),17,18);
gameFloor = player.Map(midlet.createImage("/floor.png"),map1,0,163,25,3,15,15);
brick = player.Map(midlet.createImage("/track.png"),map2,0,0,11,11,16,16);
weapon = new SpriteEngine(midlet.createImage("/laser.png"),20,10);
initial();

}
public void initial(){
jumpUp = false;
keyStatus = true;
ef = false;
wStatus = true;
refPosX = posX = 20;
refPosY = posY = (floor -48);


}
public void startApp() {
start = true;
runThread = new Thread(this);
runThread.start();
}

public void pauseApp() {
start = false;
runThread = null;
runThread.yield();
}

public void destroyApp(boolean unconditional) {
start = false;
}


public void run(){
Graphics g = getGraphics();
if(!jumpUp) posY+=2; //ตรงนี้ถ้ากำหนดให้เป็นไม่กระโดดอยู่ให้ตกลงมาเรื่อยๆ ซื่งมีปัญหาครับคือมันเด้งขึ้นลงไปเรื่อย ๆ
while (true){
keyPressed();
jump();
paint(g);
try{Thread.sleep(40);}
catch(InterruptedException e){}
}
}//End Method Run

public void checkCollides(int key){

int[] map = this.map1;
if (player.collidesWith(gameFloor, false) | player.collidesWith(brick,false)){
posX = (refPosX+1);
posY = refPosY;
}
if (!player.collidesWith(gameFloor,false) & !player.collidesWith(brick,false)){
refPosY = posY;
refPosX = posX;
}



}//End Check collide

public void keyPressed(){
int key = getKeyStates();
checkCollides(key);
weapon(key);
if(keyStatus){
switch(key){
case UP_PRESSED: player.setFrame(5);
player.nextFrame();
player.setFrame(5);
jumpUp = true;break;
case RIGHT_PRESSED : player.nextFrame();
if(player.getFrame()>4) player.setFrame(0);
posX+=3;
dir = 1;
player.setTransform(Sprite.TRANS_NONE);
break;
case LEFT_PRESSED : player.nextFrame();
if(player.getFrame()>4) player.setFrame(0);
posX-=3;
dir = 0;
player.setTransform(Sprite.TRANS_MIRROR);
break;
case GAME_A_PRESSED: posY-=2;break;
default :;break;}
}//If condition check key Status
}//End Method keyPressed


public void paint(Graphics g){
g.setColor(0x000000);
g.fillRect(0, 0, getWidth(), getHeight());
player.setPosition(posX,posY);
weapon.setPosition(wX,wY);
gLayer.append(player);
gLayer.append(gameFloor);
gLayer.append(brick);
gLayer.setViewWindow(0,0,getWidth(),getHeight());
gLayer.paint(g,0,0);
wLayer.paint(g,0,0);

g.setColor(0xfff00f);
g.drawString(" posX= "+posX+" PosY= "+posY,0,0,g.TOP|g.LEFT);
g.drawString(" refX= "+refPosX+" refY= "+refPosY,0,20,g.TOP|g.LEFT);
//g.drawString("FrameSeq= "+player.getFrame()+" Key status= "+keyStatus,0,20,g.TOP|g.LEFT);
//g.drawString("UP= "+jumpUp+" DOWN= "+jumpDown,0,35,g.TOP|g.LEFT);
flushGraphics();
}


รบกวนขอแนวคิดด้วยนะครับ

labyrinth
26-10-2004, 05:32 PM
ถ้าเกมเป็น tiled base นะ
จาก map ให้มองว่าตัวละครของเราอยู่ที่พิกัด(x,y) ไหนของ map จากนั้นก็มาดูจากค่าของ tile ว่าเป็นพื้นหรือไม่ หรืออะไรก็แล้วแต่ที่อยากทำ


มองให้เป็นสามมุมมอง
- object (tile)
- world ประกอบไปด้วย object อะไรบ้างที่ตำแหน่งไหนบ้าง
- view (camera) จะแสดงตรงไหนของ world ให้ผู้เล่นดู

pawit1357
27-10-2004, 12:17 AM
ขอบคุณมากครับ ลองผิดลองถูกตั้งนานกว่าจะได้