Pham_loi
Chức vụ: 22:44:26, 28-07-2015 |
Vẽ một phần của hình ảnh- menu game
Vẽ nguyên cả hình ảnh vào trong màn hình thì thật không tiện lợi chút nào, nhất là khi muốn vẽ nhiều hình ảnh mà mỗi hình ảnh lại phải tạo một biến image mới thì thật là mệt. thay vào đó ta chỉ việc dồn tất cả vào một bức ảnh và khi muốn thì chỉ hiển thị phần cần thiết mà thôi.
Để làm được điều đó ta sử dụng công thức setClip(start-x,start-y,w,h) đối với graphics, xem ví dụ sau sẽ rõ:
Ta tạo một file menu.java với nội dung như sau:
<?php
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class menu extends GameCanvas implements Runnable
{
private vd main;
private Graphics g=getGraphics();
private Image mn;
int w=getWidth();
int h=getHeight();
private int index=0;
private boolean play=true;
public menu(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this);
t.start();}
public void run()
{
try{mn=Image.createImage("/menu.png");}catch(Exception e){}
while(play){
g.setColor(0x000000);
g.fillRect(0,0,w,h);
g.setClip((w-128)/2,(h-64)/2,128,64);//chỉ vẽ trong khung chu nhat tu diem() voi rong va cao
g.drawImage(mn,(w-128)/2,(h-64)/2-32,g.TOP|g.LEFT);
g.setClip((w-128)/2,(h-64)/2+index*32,128,32);
g.drawImage(mn,(w-128)/2,(h-64)/2+index*32,g.TOP|g.LEFT);
flushGraphics();
try{Thread.sleep(30);}catch(Exception e){}//cho ngung mot thoi gian
}
}
protected void keyPressed(int key){
if(key==KEY_NUM2){index--;}//len tren
if(key==KEY_NUM8){index++;}//xuong duoi
if(index>1){index=0;}//cho xoay vong
if(index<0){index=1;}//cho xoay vong
if(key==KEY_NUM5){if(index==1){
play=false;
main.destroyApp(true);}}//neu nhan 5 tai exit thi thoat
}
}
?>
Copy code
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class menu extends GameCanvas implements Runnable
{
private vd main;
private Graphics g=getGraphics();
private Image mn;
int w=getWidth();
int h=getHeight();
private int index=0;
private boolean play=true;
public menu(vd main){
super(false);
this.main=main;}
void start(){
Thread t=new Thread(this);
t.start();}
public void run()
{
try{mn=Image.createImage("/menu.png");}catch(Exception e){}
while(play){
g.setColor(0x000000);
g.fillRect(0,0,w,h);
g.setClip((w-128)/2,(h-64)/2,128,64);//chỉ vẽ trong khung chu nhat tu diem() voi rong va cao
g.drawImage(mn,(w-128)/2,(h-64)/2-32,g.TOP|g.LEFT);
g.setClip((w-128)/2,(h-64)/2+index*32,128,32);
g.drawImage(mn,(w-128)/2,(h-64)/2+index*32,g.TOP|g.LEFT);
flushGraphics();
try{Thread.sleep(30);}catch(Exception e){}//cho ngung mot thoi gian
}
}
protected void keyPressed(int key){
if(key==KEY_NUM2){index--;}//len tren
if(key==KEY_NUM8){index++;}//xuong duoi
if(index>1){index=0;}//cho xoay vong
if(index<0){index=1;}//cho xoay vong
if(key==KEY_NUM5){if(index==1){
play=false;
main.destroyApp(true);}}//neu nhan 5 tai exit thi thoat
}
}
?>
Copy code
. trong ví dụ này tôi sử dụng hình ảnh này để thực hiện vịêc vẽ menu
. bức hình sau sẽ giải thích rõ tác dụng của việc setClip như thế nào:
- trên bức ảnh ta có thể thấy khung chữ nhật xanh lá là khung setClip của chứng ta(được xác định từ điểm (1) và có độ rộng w, độ cao h). tất cả những hình ảnh vẽ vào sau đó chỉ có phần nào nẳm trong khung đó thì mới hiện thị ra màn hình. như trong hình, ảnh chứa play và exit được vẽ từ điểm (2), sẽ chỉ hiển thị phần có chứa chữ exit.
• nên nhớ rằng sau mỗi khi setClip và vẽ xong phần cần vẽ phải trả lại toàn màn hình cho graphics như vậy các phần vẽ sau sẽ không bị giới hạn bởi tác dụng của setClip nữa. chúng ta đơn giản là setClip(getWidth(),getHeight()); là được.
• chúng ta thực hiện việc gọi class menu này trong class vd cũng tương tự như các class khác.
Chỉnh sửa lúc 2016-07-10 19:40 bởi Pham_loi
: 0 ♥
Trực Tuyến:
Khách: 1