zoukankan      html  css  js  c++  java
  • 迷宫游戏 精灵移动过程中遇到墙之后不能穿过而是被阻挡如何设计

    初步设计代码如下:

    使用判断精灵头脚与每个数组中图片墙上下左右分别判断

    如精灵的右侧与墙的左侧判断大小,同时判断精灵的头部是否被遮挡,精灵的脚部是否被遮挡

    依次再判断向左的情况,向上的情况,向下的情况

    package com.swift;
    
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.event.KeyEvent;
    
    import com.rupeng.game.GameCore;
    
    public class Migong implements Runnable{
    
        public static void main(String[] args) {
            GameCore.start(new Migong());
        }
    
        @Override
        public void run() {
            GameCore.setGameSize(805, 590);
            GameCore.setGameTitle("图片迷宫游戏—二维数组制作");
            GameCore.loadBgView("bg.png");
            //二维数组赋值10行10列,每张图片宽度80*56
            int[][] arr = {{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,0,0,0,0,0,0,0},
                            {0,0,0,0,0,1,0,0,0,0},
                            {4,4,0,0,0,0,0,0,0,0},
                            {0,0,0,0,0,0,4,0,0,0},
                            {1,1,2,0,0,0,0,1,0,0},
                            {0,4,0,0,0,1,0,0,0,0},
                            {0,0,1,0,1,0,0,0,2,2}};
            //计数器
            int num=0;
            //根据元素的值在游戏窗口中生成图片墙
            for(int i=0;i<arr.length;i++) {
                for(int j=0;j<arr[i].length;j++) {
                    if(arr[i][j]==1) {
                        GameCore.createImage(num);
                        GameCore.setImageSource(num, "1.png");
                        GameCore.setImagePosition(num, j*80, i*56);
                        num++;
                    }
                    if(arr[i][j]==2) {
                        GameCore.createImage(num);
                        GameCore.setImageSource(num, "2.png");
                        GameCore.setImagePosition(num, j*80, i*56);
                        num++;
                    }
                    if(arr[i][j]==4) {
                        GameCore.createImage(num);
                        GameCore.setImageSource(num, "4.png");
                        GameCore.setImagePosition(num, j*80, i*56);
                        num++;
                    }
                }
            }
            
            // 女精灵
                    int spriteGirl = 0;
                    GameCore.createSprite(spriteGirl, "butterfly");
                    GameCore.playSpriteAnimate(spriteGirl, "fly", true);
                    GameCore.setSpritePosition(spriteGirl, 100, 20);
                    
                    //得到女精灵的高度和宽度
                    Dimension dGirl=GameCore.getSpriteSize(spriteGirl);
                    int girlHeight=dGirl.height;
                    int girlWidth=dGirl.width;
                    
                    for (;;) {
    
                        int codeNum = GameCore.getPressedKeyCode();
                        Point positionG = GameCore.getSpritePosition(spriteGirl);
                        //得到女精灵头和脚的位置
                        int girlUpY=positionG.y;
                        int girlDownY=positionG.y+girlHeight;
                        //得到女精灵左侧和右侧的位置
                        int girlLeftX=positionG.x;
                        int girlRightX=positionG.x+girlWidth;
                        
                        
    
                        if (codeNum == KeyEvent.VK_UP || codeNum == KeyEvent.VK_W) {
                            if (positionG.y > 30) {
                                GameCore.setSpritePosition(spriteGirl, positionG.x, --positionG.y);
                                GameCore.pause(11);
                            }
                        }
    
                        if (codeNum == KeyEvent.VK_DOWN || codeNum == KeyEvent.VK_S) {
                            if (positionG.y < 550) {
                                GameCore.setSpritePosition(spriteGirl, positionG.x, ++positionG.y);
                                GameCore.pause(11);
                            }
                        }
                        if (codeNum == KeyEvent.VK_LEFT || codeNum == KeyEvent.VK_A) {
                            if (positionG.x > 0) {
                                GameCore.setSpriteFlipX(spriteGirl, true);
                                GameCore.setSpritePosition(spriteGirl, --positionG.x, positionG.y);
                                GameCore.pause(2);
                            }
                        }
                        if (codeNum == KeyEvent.VK_RIGHT || codeNum == KeyEvent.VK_D) {
                            boolean hasRightWall=false;
                            for(int i=0;i<arr.length;i++) {
                                for(int j=0;j<arr[i].length;j++) {
                                    if(arr[i][j]==0) {
                                        continue;
                                    }
                                    //得到墙的左侧和右侧位置
                                    int imageLeftX=80*j;
                                    int imageRightX=80*(j+1);
                                    //得到墙的上边和下边位置
                                    int imageUpY=56*i;
                                    int imageDownY=56*(i+1);
                                    if(girlRightX>=imageLeftX&&(girlUpY<=imageDownY&&girlUpY>=imageUpY
                                            ||girlDownY>=imageUpY&&girlDownY<=imageDownY)) {
                                        hasRightWall=true;
                                    }
                                            
                                }
                            }
                            
                            
                            if (positionG.x < 800&&hasRightWall==false) {
                                GameCore.setSpriteFlipX(spriteGirl, false);
                                GameCore.setSpritePosition(spriteGirl, ++positionG.x, positionG.y);
                                GameCore.pause(1);
                            }
                        }
                    }
            
        }
    
    }

     用简单思路代替:

    通过距离判定的方法

    package com.swift;
    
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.event.KeyEvent;
    
    import com.rupeng.game.GameCore;
    
    public class Migong implements Runnable{
    
        public static void main(String[] args) {
            GameCore.start(new Migong());
        }
    
        @Override
        public void run() {
            GameCore.setGameSize(805, 590);
            GameCore.setGameTitle("图片迷宫游戏—二维数组制作");
            GameCore.loadBgView("bg.png");
            //二维数组赋值10行10列,每张图片宽度80*56
            int[][] arr = {{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,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,2,0,0,0,4,0,0,0},
                            {0,0,0,0,0,0,0,1,0,0},
                            {0,0,0,0,0,1,0,0,0,0},
                            {0,0,1,0,1,0,0,0,2,2}};
            //计数器
            int num=0;
            //根据元素的值在游戏窗口中生成图片墙
            for(int i=0;i<arr.length;i++) {
                for(int j=0;j<arr[i].length;j++) {
                    if(arr[i][j]==1) {
                        GameCore.createImage(num);
                        GameCore.setImageSource(num, "1.png");
                        GameCore.setImagePosition(num, j*80, i*56);
                        num++;
                    }
                    if(arr[i][j]==2) {
                        GameCore.createImage(num);
                        GameCore.setImageSource(num, "2.png");
                        GameCore.setImagePosition(num, j*80, i*56);
                        num++;
                    }
                    if(arr[i][j]==4) {
                        GameCore.createImage(num);
                        GameCore.setImageSource(num, "4.png");
                        GameCore.setImagePosition(num, j*80, i*56);
                        num++;
                    }
                }
            }
            
            // 女精灵
                    int spriteGirl = 0;
                    GameCore.createSprite(spriteGirl, "butterfly");
                    GameCore.playSpriteAnimate(spriteGirl, "fly", true);
                    GameCore.setSpritePosition(spriteGirl, 100, 20);
                    
                    //得到女精灵的高度和宽度
                    Dimension dGirl=GameCore.getSpriteSize(spriteGirl);
                    int girlHeight=dGirl.height;
                    int girlWidth=dGirl.width;
                    
                    for (;;) {
    
                        int codeNum = GameCore.getPressedKeyCode();
                        Point positionG = GameCore.getSpritePosition(spriteGirl);
                        //得到女精灵头和脚的位置
                        int girlUpY=positionG.y;
                        int girlDownY=positionG.y+girlHeight;
                        int girlCenterY=(girlUpY+girlDownY)/2;
                        //得到女精灵左侧和右侧的位置
                        int girlLeftX=positionG.x;
                        int girlRightX=positionG.x+girlWidth;
                        int girlCenterX=(girlLeftX+girlRightX)/2;
                        
                        
    
                        if (codeNum == KeyEvent.VK_UP || codeNum == KeyEvent.VK_W) {
                            if (positionG.y > 30) {
                                GameCore.setSpritePosition(spriteGirl, positionG.x, --positionG.y);
                                GameCore.pause(11);
                            }
                        }
    
                        if (codeNum == KeyEvent.VK_DOWN || codeNum == KeyEvent.VK_S) {
                            if (positionG.y < 550) {
                                GameCore.setSpritePosition(spriteGirl, positionG.x, ++positionG.y);
                                GameCore.pause(11);
                            }
                        }
                        if (codeNum == KeyEvent.VK_LEFT || codeNum == KeyEvent.VK_A) {
                            if (positionG.x > 0) {
                                GameCore.setSpriteFlipX(spriteGirl, true);
                                GameCore.setSpritePosition(spriteGirl, --positionG.x, positionG.y);
                                GameCore.pause(2);
                            }
                        }
                        if (codeNum == KeyEvent.VK_RIGHT || codeNum == KeyEvent.VK_D) {
                            boolean hasRightWall=false;
                            for(int i=0;i<arr.length;i++) {
                                for(int j=0;j<arr[i].length;j++) {
                                    if(arr[i][j]==0) {
                                        continue;
                                    }
                                    //得到墙的左侧和右侧位置
                                    int imageLeftX=80*j;
                                    int imageRightX=80*(j+1);
                                    int imageCenterX=(imageLeftX+imageRightX)/2;
                                    //得到墙的上边和下边位置
                                    int imageUpY=56*i;
                                    int imageDownY=56*(i+1);
                                    int imageCenterY=(imageUpY+imageDownY)/2;
                                    int distance=(int)(Math.sqrt(Math.pow((girlCenterX-imageCenterX),2)+Math.pow((girlCenterY-imageCenterY),2)));
                                    if(distance<100) {
                                        hasRightWall=true;
                                    }
                                            
                                }
                            }
                            
                            if (positionG.x < 800&&hasRightWall==false) {
                                GameCore.setSpriteFlipX(spriteGirl, false);
                                GameCore.setSpritePosition(spriteGirl, ++positionG.x, positionG.y);
                                GameCore.pause(1);
                            }
                        }
                    }
            
        }
    
    }
  • 相关阅读:
    redis 五种数据结构详解(string,list,set,zset,hash)
    推荐一个同步Mysql数据到Elasticsearch的工具
    一些经验,用来鉴别不太靠谱的公司或工作(面试是双向的,是你最好的了解这个公司的机会)
    OpenSSL 使用 base64 编码/解码(liang19890820)
    Qt之QEvent(所有事件的翻译)
    Go 在 Windows 上用户图形界面 GUI 解决方案 Go-WinGUI 国产(使用cef 内核)
    卷积神经网络CNN
    Event Driven Architecture
    wineshark分析抓取本地回环包
    僵尸进程与孤儿进程
  • 原文地址:https://www.cnblogs.com/qingyundian/p/7784626.html
Copyright © 2011-2022 走看看