主頁 > 移動端開發 > 使用IDEA制作Java面向物件小游戲《原諒帽大作戰》

使用IDEA制作Java面向物件小游戲《原諒帽大作戰》

2020-11-13 20:24:32 移動端開發

成果展示

在這里插入圖片描述

制作思路

第1步:發現類(物件)

人物-小丑: Buffoon
子彈-帽子:Missile
墻體:Wall
爆炸物:Explode

第2步:發現屬性

小丑:寬和高,位置(x,y),移動速度
帽子:寬和高,位置(x,y),移動速度
墻體:寬和高,位置(x,y)
爆炸物:寬和高,位置(x,y)

第3步:發現方法

小丑:移動、攻擊、人物撞邊界
子彈:移動、子彈撞墻、子彈撞邊界
爆炸物:消失

重難點分析

表單如何創建

public class GameClient extends Frame

通過繼承Frame類實作Java表單

public class Frame extends Window implements MenuContainer

Frame類繼承了Window類和MenuContainer介面

如何將圖片加載到表單里

步驟1:創建常用工具類CommonUtils,新建getImage方法實作將圖片資源轉換為Java物件

public class CommonUtils {
    /**
     * 讀取圖片資源, 轉變為Java物件 Image
     * @param imgPath  圖片路徑
     * @return Image物件
     */
    public static Image getImage(String imgPath) {
        ImageIcon imageIcon = new ImageIcon(imgPath);
        return imageIcon.getImage();
    }
}

步驟2:呼叫getImage方法添加物件圖片

public class GameClient extends Frame {
    Image bg_image = CommonUtils.getImage("images/bg.png");
    Image explode = CommonUtils.getImage("images/explode.png");
    Image missile = CommonUtils.getImage("images/missile.png");
    Image wall_h = CommonUtils.getImage("images/wall-h.png");
    Image wall_v = CommonUtils.getImage("images/wall-v.png");
    Image buffoon = CommonUtils.getImage("images/body/s-left.png");

步驟3:重寫Framed的paint方法,實作表單加載圖片

@Override
    public void paint(Graphics g){
        //畫背景圖
        g.drawImage(bg_image,0,0,1100,700,this);
        //畫小丑
        g.drawImage(buffoon,300,200,80,80,this);
        //畫爆炸物
        g.drawImage(explode,800,400,90,90,this);
        //畫原諒帽
        g.drawImage(missile,300,300,60,60,this);
        //畫橫著的墻體
        g.drawImage(wall_h,400,300,100,20,this);
        //畫豎著的墻體
        g.drawImage(wall_v,400,300,20,100,this);

Graphics類的drawImage方法需要提供Image類引數、表單的x引數、表單的y引數、Image類的寬度width、Image類的長度length以及observer(當轉換了更多影像時要通知的物件)

物件移動的實作

指向標的地圖,通常采用“上北下南,左西右東”的規則確定方向,移動的八個方向通常指的是北、東北、東、東南、南、西南、西、西北,因此在定義移動方向時用上、左、下、右、上右、下右、上左、下左來表示

林家彬設計的

小丑:移動  move<Orientation類傳遞方向引數>
'left向左'   :x = x - this.speed;
'right向右'  :x = x + this.speed;
'down向下'   :y = y + this.speed;
'up向上'     :y = y - this.speed;
'ur東北方向'  : x = x + this.speed;
                y = y - this.speed;
'ul西北方向'  : x = x - this.speed;
                y = y - this.speed;
'dr東南方向'  : x = x + this.speed;
                y = y + this.speed;
'dl西南方向'  : x = x - this.speed;
                y = y + this.speed;

表單關閉的實作

    public void start() {
        //表單添加偵聽方法
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                //退出游戲
                System.exit(0);
            }
        });

WindowAdapter類
1.接收視窗事件的抽象配接器類,此類中的方法為空,此類存在的目的是方便創建偵聽器物件,
2.擴展此類可創建 WindowEvent 偵聽器并為所需事件重寫該方法,(如果要實作 WindowListener 介面,則必須定義該介面內的所有方法,此抽象類將所有方法都定義為 null,所以只需針對關心的事件定義方法,
3.使用擴展的類可以創建偵聽器物件,然后使用視窗的 addWindowListener 方法向該視窗注冊偵聽器,當通過打開、關閉、激活或停用、圖示化或取消圖示化而改變了視窗狀態時,將呼叫該偵聽器物件中的相關方法,并將 WindowEvent 傳遞給該方法,
windowAdapter監聽器

按鍵事件觸發的實作

 this.addKeyListener(new KeyAdapter() {
             //鍵盤按下的時候出發
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
            }
            //鍵盤松開
            @Override
            public void keyReleased(KeyEvent e) {
                //獲取被按下的鍵對應的數值,如,a:67,b:68
                int keyCode = e.getKeyCode();
                switch (keyCode){
                    case KeyEvent.VK_UP:
                        System.out.println("向上走!!!");
                        buffoon.setDir("UP");
                        break;
                    case KeyEvent.VK_DOWN:
                        System.out.println("向下走");
                        buffoon.setDir("DOWN");
                        break;
                    case KeyEvent.VK_RIGHT:
                        System.out.println("向右走");
                        buffoon.setDir("RIGHT");
                        break;
                    case KeyEvent.VK_LEFT:
                        System.out.println("向左走!!");
                        buffoon.setDir("LEFT");
                        break;
                }
                buffoon.move(buffoon.getDir());
            }
        });

按鍵觸發的要點

要點一:‘new KeyAdapter()’ 新建一個按鍵事件的監聽器,并通過addKeyListener()向主表單注冊該監聽器;
要點二:重寫KeyAdapter的方法,分別是KeyTyped(鍵入)、KeyPresdded(按下)、KeyReleased(釋放),這里我們只監聽KeyPressed事件并重寫該方法,實作對人物方向狀態的改變;
要點三:KeyEvent e.getKeyCode回傳的是按下按鍵對應的鍵值,參考KeyEvent的鍵值屬性,Java 8在線API

創建物件Buffoon.move()方法

    public void move(String dir){
        switch (dir){
            case "UP":
                this.y -= this.speed;
                setDir("STOP");
                break;
            case "DOWN":
                this.y += this.speed;
                setDir("STOP");
                break;
            case "RIGHT":
                this.x += this.speed;
                setDir("STOP");
                break;
            case "LEFT":
                this.x -= this.speed;
                setDir("STOP");
                break;
        }

每次監聽到按鍵事件呼叫move方法實作buffoon物件的移動

每次監聽到按鍵事件呼叫move方法

物件移動的原理

物件移動的畫面也叫影片,是在螢屏上顯示一系列連續影片畫面的一幀一幀的圖形,然后在間隔很短的時間顯示下一幀圖形,如此反復,利用人眼的‘視覺暫留’現象主觀感覺好像畫面的物體在運動,
FPS(Frames Per Second),是每秒鐘的幀數,一幀就是一幅靜態畫像,電影的播放速度是24FPS,幀數越多,所顯示的動作就會越流暢,通常,要避免動作不流暢的最低是30FPS,FPS百度百科

影片移動的搬運工-執行緒(thread)

什么是執行緒
執行緒(thread)是作業系統能夠進行運算調度的最小單位,它被包含在行程之中,是行程中的實際運作單位,一條執行緒指的是行程中一個單一順序的控制流,一個行程中可以并發多個執行緒,每條執行緒并行執行不同的任務,

/**
 * 定義一個重新繪制畫面的執行緒,相當于招一個工人專門去從事這項作業
 */
public class RePaintThread implements Runnable{
    @Override
    //執行緒操作的全都在run方法中
    public void run() {
        while (true){
            //每50毫秒 執行一次
            try {
                Thread.sleep(20);
                //重新繪制影像
                gameClient.repaint();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

要點一:Runnable介面
public class RePaintThread implements Runnable
使用實作介面 Runnable 的物件創建一個執行緒時,啟動該執行緒將導致在獨立執行的執行緒中呼叫物件的 run 方法,
要點二:重寫Run方法
方法 run 的常規協定是:它可能執行任何所需的動作,
重新繪制影像
gameClient.repaint();
要點三:Thread.sleep—執行緒反復執行的時間間隔
1、使用’While(true)'構造死回圈
2、在死回圈中執行repaint()重繪圖形方法
3、執行緒中斷例外(InterruptedException)是當前執行緒被中斷的表現之一,遇到這個例外時,如果你不知道如何處理,你應當向上拋出,
catch從句

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/213944.html

標籤:其他

上一篇:Java B組藍橋杯第十屆國賽:平方拆分

下一篇:應屆生拿下京東小米Java崗offer,學習筆記都在這里了(年薪28w的面經)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more