Results 1 to 3 of 3

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

  1. #1
    pawit1357
    Guest


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

    ไม่ทราบในเกมส์พวก มาริโอ นี้เขามีวิธีการเช็คยังไงครับ ที่ให้เวลาที่ตัว มาริโอ ไม่ชนอะไรเลยและเดินจนสุดทางเดินแล้วตกลงไปในเหว หรือว่า กระโดดขึ้นไปอยู่บนอิฐแล้ว มันพอเดินเลยที่ไม่มีอิฐแล้วมันตกลงมานะครับ คือตอนนี้ผมเขียนเกมส์แนวนี้อยู่นะครับ กำลังมีปัญหา เรื่องที่กล่าวไปนะครับ ผมลอง ให้มันบวกค่าไปเรื่อง ๆ แล้วรู้สึกว่ามันจะชนกับ 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();
    }


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

  2. #2
    Senior Member
    Join Date
    Jul 2004
    Location
    Bangkok
    Posts
    187


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

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


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

  3. #3
    pawit1357
    Guest


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

    ขอบคุณมากครับ ลองผิดลองถูกตั้งนานกว่าจะได้

Members who have read this thread : 0

Actions : (View-Readers)

There are no names to display.

Members who have read this thread: 0

There are no members to list at the moment.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •