2012-10-08 38 views
0

你好,爲了學校練習,我需要創建一個遊戲,我決定創建Pacman。一切順利,但我無法做到的一件事就是畫一個pacman哥們和他的鬼魂......我做了,做了橢圓形但現在呢?我希望帕克曼嘴也隨着它的移動而打開和關閉。有人可以幫助畫這個?在Java中繪製pacman

下面我有什麼至今:

package h04PacMan; 

import java.awt.*; 

public class DrawPacMan { 

public void drawPacMan(Graphics g, int x, int y, Color color) { 

    g.setColor(color); // set color 
    g.fillOval(x, y, 50, 50); // paint 
    g.setColor(Color.black); 
    g.drawOval(x, y, 50, 50); // outline 
    // mouth? 

} 

public void drawGhost(Graphics g, int x, int y, Color color) { 

    g.setColor(color); // color 
    // here goes shape 

} 

} 
+6

我建議你使用精靈/圖像而不是形狀。 – JCOC611

+0

是的,我知道這是好得多,但我必須自己畫..(只是開始Java所以它的運動目的),除此之外,我沒有使用精靈或圖像,所以我不知道如何.. – Reshad

回答

1

因此,有幾件事情會在這裏,你將需要解決的。

1.繪製字符

,我只能在這裏解決繪圖吃豆子。

想到Pacman遊戲,吃豆人的角色有兩個狀態 - 嘴巴閉合,張開嘴巴(在每個主要方向!)。這對於我們在一會兒製作Pacman動畫時非常重要,所以首先讓我們使用Graphics library中的fillArc方法建立我們的pacman形狀。口開吃豆子的

例子:

g.setColor(Color.yellow); 
    g.fillArc(0,0,150,150,30,300); 

這將在窗口的左上角創建吃豆子,吃豆子用的嘴面向屏幕的右側。 fillArc方法的最後兩個參數控制該開口 - 第5個參數是開始角度,第6個參數是完整弧的角度。您可以從中推斷出起始角度0是從圓弧中心到屏幕右側的水平線。還要記住,從數學上來說,一個完整的圓是360度。

使用這些信息,嘗試繪製張開嘴的Pacman面朝上,向下和向左。做完之後,填滿整個弧線,以便閉上嘴巴時吸引Pacman。還可以考慮圖形庫中的其他方法,您可以使用它來繪製鬼魂!

2.動畫吃豆子

對於這個任務,你可能會希望實現某種線程結構的動畫吃豆子,它得到了不少比你在這裏證明什麼更復雜。由於我們不知道您的程序規格,而且您還沒有演示任何與動畫有關的代碼,所以我很猶豫是否將此更進一步。不過,我會直接向您介紹一些關於此事的鏈接:

+0

我正在使用Swing這個項目,要求如下:創建一些鬼從a移動到b和從b移動到a(所以不是隨機的)和一個pacman對象可以使用我創建的4個按鈕(上,下,左,右)移動。在這一刻,我創造了一切已經開始工作,除了上下按鈕贏得了;噸工作如預期,我不能動畫的pacman /幽靈,其餘的並不那麼辛苦。 – Reshad

+0

@Reshad很高興聽到你取得了一些成功 - 這聽起來像你可以做你想做的事情與SwingWorker。這將爲您的動畫所在的swing組件創建一個線程,並在那裏處理動畫,以便它不會通過在主線程中工作來凍結GUI。繼續閱讀上面的鏈接,讓我們知道你的進步。 –

+0

謝謝你的幫助安東尼,我試圖「理解」SwingWorker,但自從我在學校剛開始學習Java以來​​,並不是很容易理解:P p.s.如果你想看看我有什麼,直到現在看到我的項目在github上:https://github.com/reshadf/Java/tree/master/DeBasis/src/h04PacMan – Reshad

2

而不是使用drawOvalfillOval,你應該看看drawArcfillArc

參見java.awt.Graphics

關於口中的動畫:由於吃豆子是不斷移動的,你可以結合使用正弦函數Pacman的位置得到一個不錯的流暢嘴部動作,是這樣的:

angle = 20 * (Math.sin((x + y)*2*Math.PI/50) + 1); # alt. betw. 0 and 40 
g.fillArc(x, y, 50, 50, angle/2, 360-angle); 

這樣,當他在迷宮中移動他自己的大小時,Pacman的嘴巴會自動進行一次開啓 - 關閉循環。 (你可能需要稍微調整一下數字以適應你的設置。)

當然,你仍然需要一個線程來運行整個遊戲,但Pacman的嘴巴的動畫也可以這樣完成,沒有額外的線程。

+0

我嘗試你的方式與一些編輯..但它不會如預期的那樣工作,我做了以下:\t \t int angle =(int)(20 *(sin((x + y)* 2 * Math.PI/50)+ 1)); g.fillArc(x,y,半徑,半徑,角度/ 2,360角); \t \t \t} \t \t公共靜態雙重罪(雙罪){ \t \t回罪。 \t} – Reshad

+0

不知何故,它不會工作,因爲我得到一個錯誤的罪惡部分..你能給我一個例子,你已經使用了什麼方法和你的例子的「工作」代碼? – Reshad

+0

沒關係,現在按預期工作吧!不得不重寫罪惡math.sin :) – Reshad

0

我建議趁Area/Path2D API。

看一看​​

你可以看看這個answer示例代碼爲例