我做了一个小游戏,里面有两辆坦克,怎么做才可以两个人同时在键盘上操作各自的坦克呢?就像泡泡堂一样。现在某一时刻只能操作其中一辆。程序大至如下
jFrame.addKeyListener(tank1);
jFrame.addKeyListener(tank2);class tank extends JPanel implements KeyListener{
.......
}
jFrame.addKeyListener(tank1);
jFrame.addKeyListener(tank2);class tank extends JPanel implements KeyListener{
.......
}
解决方案 »
- 求关于struts1的一些建议
- JTextArea 实现如UltraEdit 查找功能
- 初学JAVA,刚把JAVA SE看了一遍,想做个东西练习下,大家有什么提议呀,谢谢大家参与
- 一个简单的问题,请进来看一下~~
- 问个有关java布局layoutManager的问题,贴内附代码
- 求一个算法问题!,如何得到2棵树,最下的子节点,并且判断是否是同一顺序。着急!
- 如何在IE的工具条位置加上自己的工具条(象google的工具条)??
- 小妹100分提问:请问如何使矢量图形等比例放大?
- jasperreport的一个小问题,恳请大虾帮忙解决一下
- 在使用in.readObject()时出现如下错误:java.io.OptionalDataException
- 关于TOMCAT的问题
- 关于MAP的一个小问题
另外几个键按下,指挥tank2
{
if(某几个键)坦克1……;
if(另外几个键) 坦克2……;
}
这样算不算逻辑分区啊?
我的方法是实现两个方法,keyPressed和keyReleased,同时对要做处理的按键做个标识,
如果pressed,标时为true,released的时候变为false,这样就可以根据标识来处理相应的事件
至少问题是解决了。只是我的做法,提供参考而已。
import java.awt.event.*;
import javax.swing.*;class TankThread extends JFrame{
Weapon tank;
Weapon tank1;
Button shell;
Button shell2;
Thread t;
public TankThread(){
getContentPane().setLayout(null);
//setLayout(null);
setSize(600,500);
setBackground(new Color(193,193,193));
addWindowListener(new WinAd(this)); tank = new Weapon(1,this);
tank1 = new Weapon(2,this);
//tank1 = new NewTank("坦克",this);
// tank1.setLocation(325,400);
JPanel p = new JPanel();
p.setLocation(200,300);
p.setSize(30,50);
tank.setLocation(225,400);
tank1.setLocation(200,300);
addKeyListener(tank);
addKeyListener(tank1);
getContentPane().add(tank);
t=(new Thread(){
public void run(){getContentPane().add(tank1); }});
//add(tank);
t.start();
shell = new Button();
shell.setSize(8,8);
shell.setBackground(new Color(10,10,10));
shell.setVisible(false);
shell.setFocusable(false);
getContentPane().add(shell); shell2 = new Button();
shell2.setSize(8,8);
shell2.setBackground(new Color(255,10,10));
shell2.setVisible(false);
shell2.setFocusable(false);
getContentPane().add(shell2); // getContentPane().add(p);
//add(shell);
setLocation();
setVisible(true);
} public static void main(String[] args)
{
new TankThread();
} public void setLocation(){
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = this.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
this.setLocation( (screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
this.setVisible(true);
}
}
class WinAd extends WindowAdapter{
private Frame frame;
public WinAd(Frame frame){
this.frame = frame;
}
public void windowClosing(WindowEvent e){
frame.setVisible(false);
frame.dispose();
System.exit(0);
}
}class Weapon extends JPanel implements KeyListener{
int strType;
TankThread jframe;
BulletThread bt1,bt2;
Thread t;
static int fkey;
Weapon wp;
private int orient = 1;
public Weapon(int strType,TankThread jframe){
this.strType = strType;
this.jframe = jframe;
if (strType==1 || strType==2){
this.setSize(50,50);
}else{
this.setSize(10,10);
}
wp = this;
//addKeyListener(this);
} public void paintComponent(Graphics g){
super.paintComponent(g);
if(strType==1 || strType==2){
g.setColor(new Color(112,111,153));
if(orient == 1){
g.fill3DRect(0,15,10,50,true);
g.fill3DRect(10,25,30,15,true);
g.fill3DRect(40,15,50,50,true);
g.fillOval(15,15,20,20);
g.fill3DRect(22,0,6,20,true);
}
if(orient == 2){
g.fill3DRect(15,0,35,10,true);
g.fill3DRect(25,10,15,30,true);
g.fill3DRect(15,40,35,10,true);
g.fillOval(15,15,20,20);
g.fill3DRect(0,22,20,6,true);
}
if(orient == 3){
g.fill3DRect(0,0,10,35,true);
g.fill3DRect(10,10,30,15,true);
g.fill3DRect(40,0,10,35,true);
g.fillOval(15,15,20,20);
g.fill3DRect(22,30,6,20,true);
}
if(orient == 4){
g.fill3DRect(0,0,35,10,true);
g.fill3DRect(10,10,15,30,true);
g.fill3DRect(0,40,35,10,true);
g.fillOval(15,15,20,20);
g.fill3DRect(30,22,20,6,true);
}
}else{
g.setColor(Color.black);
g.fillOval(0,0,10,10);
}
} public void keyPressed(final KeyEvent e){
// t = (new Thread(){
// public void run(){
int x = getLocation().x;
int y = getLocation().y;
if (e.getKeyCode()==KeyEvent.VK_LEFT && (strType==1)){
orient = 2;
if ( x > 0 ){
setLocation((int)x-5,(int)y);
}
}
if (e.getKeyCode()==KeyEvent.VK_RIGHT && strType==1){
orient = 4;
if (x+(int)getSize().getWidth()<jframe.getSize().getWidth()){
setLocation((int)x+5,(int)y);
}
}
if (e.getKeyCode()==KeyEvent.VK_UP && strType==1){
orient = 1;
if(y > 0){
setLocation((int)x,(int)y-5);
}
}
if (e.getKeyCode()==KeyEvent.VK_DOWN && strType==1){
orient = 3;
if( y + (int)getSize().getHeight() < jframe.getSize().getHeight() ){
setLocation((int)x,(int)y+5);
}
} if (e.getKeyCode()==KeyEvent.VK_A && strType==2){
orient = 2;
if ( x > 0 ){
setLocation((int)x-5,(int)y);
}
}
if (e.getKeyCode()==KeyEvent.VK_D && strType==2){
orient = 4;
if (x+(int)getSize().getWidth()<jframe.getSize().getWidth()){
setLocation((int)x+5,(int)y);
}
}
if (e.getKeyCode()==KeyEvent.VK_W && strType==2){
orient = 1;
if(y > 0){
setLocation((int)x,(int)y-5);
}
}
if (e.getKeyCode()==KeyEvent.VK_S && strType==2){
orient = 3;
if( y + (int)getSize().getHeight() < jframe.getSize().getHeight() ){
setLocation((int)x,(int)y+5);
}
}
try{Thread.sleep(1);}catch(Exception me){}
// }
// });
// t.start();
if(e.getKeyCode()==KeyEvent.VK_SPACE && strType==1){
if (!jframe.shell.isVisible()){
bt1 = new BulletThread(jframe,orient,wp,jframe.shell);
bt1.start();
System.out.println("test");
}
} if(e.getKeyCode()==KeyEvent.VK_J && strType==2){
if (!jframe.shell2.isVisible()){
bt2 = new BulletThread(jframe,orient,this,jframe.shell2);
bt2.start();
System.out.println("test2");
}
}
repaint();
} public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e) {}}
class BulletThread extends Thread{
TankThread jframe;
int orient;
int x,y;
Button bullet;
public BulletThread(TankThread jframe, int orient, Weapon wp,Button bullet){
this.jframe = jframe;
this.orient = orient;
this.bullet = bullet;
x = wp.getLocation().x;
y = wp.getLocation().y;
} public void run(){
System.out.println("Thread start");
bullet.setVisible(true);
if(orient==1){
bullet.setLocation(x+20,y-10);
while(true){
int h = bullet.getLocation().y;
int w = bullet.getLocation().x;
if(h<0){
bullet.setVisible(false);
break;
}
bullet.setLocation(w,h-5);
try{Thread.sleep(20);}catch(Exception me){}
}
}
if(orient == 3){
bullet.setLocation(x+20,y+50);
while(true){
int h = bullet.getLocation().y;
int w = bullet.getLocation().x;
if(h>jframe.getSize().getHeight()){
bullet.setVisible(false);
break;
}
bullet.setLocation(w,h+5);
try{Thread.sleep(20);}catch(Exception me){}
}
} if(orient == 2){
bullet.setLocation(x-10,y+20);
while(true){
int h = bullet.getLocation().y;
int w = bullet.getLocation().x;
if(w < 0){
bullet.setVisible(false);
break;
}
bullet.setLocation(w-5,h);
try{Thread.sleep(20);}catch(Exception me){}
}
} if(orient == 4){
bullet.setLocation(x+50,y+20);
while(true){
int h = bullet.getLocation().y;
int w = bullet.getLocation().x;
if(w > jframe.getSize().getWidth()){
bullet.setVisible(false);
break;
}
bullet.setLocation(w+5,h);
try{Thread.sleep(20);}catch(Exception me){}
}
}
}
}
我也是自己编小游戏玩的时候遇到这个问题,自己想的招,我编游戏就是知道了repaint()方法和事件监听这两个方法,原则上游戏就是这两个方法的结合。在一个类里调用另一个类把自己也作为参数,我还没用过,看来很有用。哈哈,我其实也是菜鸟,对于技巧性的东西比较感兴趣。有什么好的创意可以讨论讨论阿。
我的qq:13781120 email: [email protected]
class Weapon
extends JPanel
implements KeyListener,Runnable {
int strType;
TankThread jframe;
BulletThread bt1, bt2;
Thread t;
static int fkey;
//Weapon wp;
boolean upFlag = false;
boolean downFlag = false;
boolean leftFlag = false;
boolean rightFlag = false;
boolean wFlag = false;
boolean sFlag = false;
boolean aFlag = false;
boolean dFlag = false;
boolean spaceFlag = false;
boolean jFlag = false;
private int orient = 1;
public Weapon(int strType, TankThread jframe) {
this.strType = strType;
this.jframe = jframe;
if (strType == 1 || strType == 2) {
this.setSize(50, 50);
}
else {
this.setSize(10, 10);
}
t = new Thread(this);
t.start();
//wp = this;
//addKeyListener(this);
}
public void run(){
for( ; ; ){
reDraw();
try{
Thread.sleep(100);
}catch(InterruptedException e){}
}
} public void paintComponent(Graphics g) {
super.paintComponent(g);
if (strType == 1 || strType == 2) {
g.setColor(new Color(112, 111, 153));
if (orient == 1) {
g.fill3DRect(0, 15, 10, 50, true);
g.fill3DRect(10, 25, 30, 15, true);
g.fill3DRect(40, 15, 50, 50, true);
g.fillOval(15, 15, 20, 20);
g.fill3DRect(22, 0, 6, 20, true);
}
if (orient == 2) {
g.fill3DRect(15, 0, 35, 10, true);
g.fill3DRect(25, 10, 15, 30, true);
g.fill3DRect(15, 40, 35, 10, true);
g.fillOval(15, 15, 20, 20);
g.fill3DRect(0, 22, 20, 6, true);
}
if (orient == 3) {
g.fill3DRect(0, 0, 10, 35, true);
g.fill3DRect(10, 10, 30, 15, true);
g.fill3DRect(40, 0, 10, 35, true);
g.fillOval(15, 15, 20, 20);
g.fill3DRect(22, 30, 6, 20, true);
}
if (orient == 4) {
g.fill3DRect(0, 0, 35, 10, true);
g.fill3DRect(10, 10, 15, 30, true);
g.fill3DRect(0, 40, 35, 10, true);
g.fillOval(15, 15, 20, 20);
g.fill3DRect(30, 22, 20, 6, true);
}
}
else {
g.setColor(Color.black);
g.fillOval(0, 0, 10, 10);
}
} public void keyPressed(final KeyEvent e) {
int code = e.getKeyCode();
switch(code){
case KeyEvent.VK_LEFT:
leftFlag = true;
break;
case KeyEvent.VK_RIGHT:
rightFlag = true;
break;
case KeyEvent.VK_UP:
upFlag = true;
break;
case KeyEvent.VK_DOWN:
downFlag = true;
break;
case KeyEvent.VK_A:
aFlag = true;
break;
case KeyEvent.VK_W:
wFlag = true;
break;
case KeyEvent.VK_S:
sFlag = true;
break;
case KeyEvent.VK_D:
dFlag = true;
break;
case KeyEvent.VK_SPACE:
spaceFlag = true;
break;
case KeyEvent.VK_J:
jFlag = true;
break;
}
} public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_LEFT:
leftFlag = false;
break;
case KeyEvent.VK_RIGHT:
rightFlag = false;
break;
case KeyEvent.VK_UP:
upFlag = false;
break;
case KeyEvent.VK_DOWN:
downFlag = false;
break;
case KeyEvent.VK_A:
aFlag = false;
break;
case KeyEvent.VK_W:
wFlag = false;
break;
case KeyEvent.VK_S:
sFlag = false;
break;
case KeyEvent.VK_D:
dFlag = false;
break;
case KeyEvent.VK_SPACE:
spaceFlag = false;
break;
case KeyEvent.VK_J:
jFlag = false;
break;
}
} public void keyTyped(KeyEvent e) {}
public void reDraw(){
int x = getLocation().x;
int y = getLocation().y;
if (leftFlag && (strType == 1)) {
orient = 2;
if (x > 0) {
setLocation( (int) x - 5, (int) y);
}
}
if (rightFlag && strType == 1) {
orient = 4;
if (x + (int) getSize().getWidth() < jframe.getSize().getWidth()) {
setLocation( (int) x + 5, (int) y);
}
}
if (upFlag && strType == 1) {
orient = 1;
System.out.println("1");
if (y > 0) {
setLocation( (int) x, (int) y - 5);
}
}
if (downFlag && strType == 1) {
orient = 3;
System.out.println("3");
if (y + (int) getSize().getHeight() < jframe.getSize().getHeight()) {
setLocation( (int) x, (int) y + 5);
}
} if (aFlag && strType == 2) {
orient = 2;
if (x > 0) {
setLocation( (int) x - 5, (int) y);
}
}
if (dFlag && strType == 2) {
orient = 4;
if (x + (int) getSize().getWidth() < jframe.getSize().getWidth()) {
setLocation( (int) x + 5, (int) y);
}
}
if (wFlag && strType == 2) {
orient = 1;
if (y > 0) {
setLocation( (int) x, (int) y - 5);
}
}
if (sFlag && strType == 2) {
orient = 3;
if (y + (int) getSize().getHeight() < jframe.getSize().getHeight()) {
setLocation( (int) x, (int) y + 5);
}
}
try {
Thread.sleep(1);
}
catch (Exception me) {} if (spaceFlag && strType == 1) {
if (!jframe.shell.isVisible()) {
bt1 = new BulletThread(jframe, orient, this, jframe.shell);
bt1.start();
System.out.println("test");
}
} if (jFlag && strType == 2) {
if (!jframe.shell2.isVisible()) {
bt2 = new BulletThread(jframe, orient, this, jframe.shell2);
bt2.start();
System.out.println("test2");
}
}
repaint(); }}
当然不会流畅了,你可以调整一下sleep的时间和reDraw()方法里的每次移动的距离