前文主要紀錄了自己的學習程序,如果想參考代碼可以直接下滑到十二月十一日處!!
類魂斗羅游戲的制作
- 2020.12.8
- 2020.12.9
- 2020.12.10
- 2020.12.11
2020.12.8
最近java也開始了一段落了感覺入門的se基本都淺顯的了解了,目前在刷書!然后經過一番討論,覺得需要實操專案來打磨一下自己的java基礎知識,所以僅以此文來記錄我的java制作簡單游戲的程序
話不多說現在也夜深了那就先上傳一下今天學習的一些簡單代碼,是關于JFrame.wing的簡單用法的
下面展示:
package game;
import javax.swing.*;
public class MyJFrame {
public static void main(String[] args) {
JFrame frame=new JFrame();
//創建JFrame實體物件(1)
frame.setTitle("吳鎏的第一個JavaGui");
//設定gui標題(2)
//(1)(2)據說可以合為
//JFrame frame=new JFrame("吳鎏的第一個JavaGui");
frame.setSize(500,500);//設定gui的長寬
frame.setLocation(400,400);//設定gui出現的位置
frame.setVisible(true);//設定gui是否可見(默認為不可見哦)
frame.setResizable(true);//設定視窗是否可調節大小
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//設定關閉按鈕的效用
//2020.12.8 2:07am 所以大家晚安
}}
====================================
2020.12.9
今天敲代碼遇到了很大的瓶頸所以找了一些視瞥澩,想著先參考一下網上飛機大戰的程序熟悉一下具體的影像移動碰撞的面向物件思想(目前準備寫個類魂斗羅游戲,要不然純參考網上的教程寫個飛機大戰太沒有成就感了!)
由于學習能力太差,今天也僅僅看了一個panel模塊,了解了如何向視窗里添加圖片,感覺硬著頭皮也能寫出個殘次品了(因為python環境下已經實操過類似的小專案),但還是想著盡善盡美,所以踏踏實實學吧!
下面上今天的代碼,是關于JPanel和圖片插入工具的
//這是圖片插入工具類
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
public class GetImage {
public static BufferedImage getImage(String path) throws IOException {
return ImageIO.read(new FileInputStream(path));
}
}
//具體沒什么難點吧,涉及了一些IO流的知識
然后給大家看看 JPanel的一些方法
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
public class GamePanel extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);
try {
g.drawImage(GetImage.getImage("hero.png"),0,0,null);
g.drawImage(GetImage.getImage("bg.jpg"),0,0,null);//感覺這里很妙上面生成圖片的工具類使用了static靜態方法使得這里可以跳過創建實體來呼叫GeiImage的getImage方法,果然還是我太菜
} catch (IOException e) {
e.printStackTrace();
}
}
}
//之前一直在想生成影像是否也是我hero類的方法,可是目前發現網上都是在JPanel重復添加影像,也許后面的方法里會出現我想了解的方法吧
//現在是20.12.09 3:29am,別問我為什么老這么晚,我睡不著,晚安
2020.12.10
今天是代碼的一天,這里先感謝江xiao同學為我繪畫了游戲素材,真的特別精美!實在好困,那就直接總結今天的得失吧!
今天將hero以及子彈類和他們的移動方法都添加進了我們的視窗中,但是現在有點頭疼的是hero轉向之后子彈的設計方向也得轉向,按照思維邏輯那肯定就是多個判斷陳述句來確認子彈的方向選擇嗎,但可能還是我目前代碼的缺陷,解決起來十分的棘手(可能只是對我來說T_T
那就草草添加一下今天的代碼就睡覺吧
下面的代碼整體比較凌亂,具體只是一些oop的邏輯思路,但是真的花費了我一天來自己琢磨(有點感覺浪費了不少時間
由于太凌亂所以可以跳過看這個,等作品完成之后會盡量優化一下代碼塊的書寫以及解釋
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
public class GamePanel extends JPanel {
Hero hero;
Bg bg;
ArrayList<Buffet>buffets=new ArrayList<>();
//先準備個arraylist來做子彈的容器
{
try {
hero = new Hero();
bg = new Bg();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void paint (Graphics g){
super.paint(g);
g.drawImage(bg.image, bg.x, bg.y, bg.w, bg.h, null);
g.drawImage(hero.image, hero.x, hero.y, hero.w, hero.h, null);
for (Buffet biu:buffets
) {
g.drawImage(biu.image,biu.x,biu.y,biu.w,biu.h,null);
}
}
public GamePanel(JFrame frame) {
hero.up.start();
hero.left.start();
hero.down.start();
hero.right.start();
if (hero.y<=700){
hero.y-=30;
}repaint();
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
super.keyTyped(e);
}
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
switch (e.getKeyCode()) {
case 87:
hero.up.run();
hero.move(1);
break;
case 83:
hero.down.run();
hero.move(2);
break;
case 65:
hero.left.run();
hero.move(3);
break;
case 68:
hero.right.run();
hero.move(4);
break;
case 74:
shoot();
}
if (hero.x == frame.getWidth() - 200) {
hero.moveRight = false;
bg.x -= 20;
} else if (hero.x == 0) {
hero.moveLeft = false;
bg.x += 20;
} else {
hero.moveLeft = true;
hero.moveRight = true;
hero.moveDown=true;
hero.moveUp=true;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
super.keyReleased(e);
switch (e.getKeyCode()) {
case 87:
hero.moveUp = false;
break;
case 83:
hero.moveDown = false;
break;
case 65:
hero.moveLeft = false;
break;
case 68:
hero.moveRight = false;
break;
}
}
});
}
public void shoot(){
buffets.add(new Buffet("/Users/lingeng/IdeaProjects/untitled/src/matieral/buffet"+(new Random().nextInt(3))+".png",hero.x+150,hero.y+25));
}
public void biubiuMove() {
for (Buffet biu:buffets) {
biu.biuMove();
}
}
public void action(){
new Thread(){
@Override
public void run() {
while(true){
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
biubiuMove();
repaint();
}}
}.start();
}
}
//20.12.10 2:40am-good night
2020.12.11
現在是11號下午四點,很開心的游戲做出來,
現在來進行總結
游戲總體有下面這里多物件

值得一提的是GetImage類,這是一個用來提取圖片的工具類物件,以下是代碼
package game;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
public class GetImage {
public static BufferedImage getImage(String path) throws IOException {
return ImageIO.read(new FileInputStream(path));
}
}
一般來說只要稍微了解一些簡單的IO流應該就能看明白了!
參考的話可以直接全站搜索“JAVA-IO流”~
再來看看游戲的幾個視窗
視窗1為開始視窗:

(我是不可能告訴你因為太累了不想好好做開始界面才找的迪麗熱巴來當排面
視窗二是用來寫游戲介紹噠

也比較簡略,畢竟主要目的還是領略一些oop的思想以及se語法
視窗三是結束視窗

略顯屌絲,無傷大雅
因為我們游戲是沒有生命值的!
所以你輸不了
更棒的是贏了之后你除了這張圖可以看什么也得不到!
接下來最最最重要的是游戲的視窗,先上幾張游戲截圖吧(當然也很簡陋,希望不要嘲笑我



我們的主角是不是很棒,因為資源有限現在只有三種npc,而且因為準備考試周了也沒精力給他們配置攻擊能力了~
回到代碼
四個視窗之間的切換我琢磨了很久,最后找到了一套比較可行的方案
package game;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
public class GameStart {
public static void gameStart(){
GameFrame gf = new GameFrame();
gf.create("game", 800, 1000);
GamePanel gp= null;
try {
gp = new GamePanel(gf);
} catch (IOException e) {
e.printStackTrace();
}
gp.setVisible(true);
gp.action();
gf.add(gp);
gf.setVisible(true);
}
}
//構造一個專門用來創建新視窗的工具類
//之后在你前一個類中呼叫,通過設定可見度即setVisible
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
switch (e.getKeyCode()){
case 78:
GameStart.gameStart();
setVisible(false);
// 這樣就十分簡單
然后一個難點就是英雄的跳躍,現在也還沒有弄到完美,不過現在下落的動態變化形象了不少
由于并不懂得物理演算法,所以只能通過調節執行緒的睡眠時間以及圖片移動的速度來使他盡可能看起來好(不那么奇怪)一點,在這就不做贅述了
然后就是碰撞,我采用的是通過影像得到矩形類然后呼叫矩形的碰撞方法intersects來檢測的
for (FlyEnemy npc : flyEnemies) {
Rectangle bu = new Rectangle(biu.x, biu.y, biu.w, biu.h);
Rectangle np = new Rectangle(npc.x, npc.y, npc.w, npc.h);
if (bu.intersects(np)) {
buffets.remove flyEnemies.remove(npc);
score+=1;
}
}
具體難點好像就這么多了,總的任務難度不算特別高屬于可實作的難度,本質就是一堆圖片的增刪移動碰撞,但是對我這種小白來說,著實廢了一番苦工
最后本來想上一下整個Game包里最關鍵的GamePanel代碼做結束的,但是可能由于我的語法格式問題,上傳上來的代碼太模糊了所以就到這結束吧,如果有和我一樣的小白想要交流的可以加我QQ310349523
感謝閱讀!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233570.html
標籤:其他
上一篇:C++面向物件五子棋
