小游戏

这是我第一次做一个小游戏,做的很差了,但是我以后一定会越做越好的。。。
因为这是从网页上的极品飞车进行的构思,但是和他相差的差距是比较大的,所以我决定给他的命名就叫做了次品飞车了。。。
当然这个是闲话。。。
在做这个游戏的时候,我首先碰到的问题当然是页面切换的问题,虽然在制作的初期就龙哥就已经告诉我们解决的方法了,但是我觉得还是有必要讲一下吧,因为怎么说也是龙哥的汗水吧。。。
其实这种界面的切换是很简单的,只要注意一下界面的关闭和重新打开就行了,重新打开当然就是调用方法然后运用了,这个就是没什么好说的了,然后就是上一个界面的关闭,这个就是要用到一个方法,这个方法是dispose的方法,只要知道了这个方法,其他的就没什么好说的了。
具体代码如下:
SecondCar.this.dispose();

很简单的一句代码,第一句SecondCar是要关闭的界面的类,然后就是调用了dispose的方法。。
当然,并没有这么简单,我们需要注意一些细节的问题,比如说如果我们重新制作的窗体的大小和上一个不一样的话,虽然说并不会怎么样,但是看起来肯定会不爽,而且在游戏里面玩的时候我们需要的坐标也会需要相当的费力。。。
说道了坐标,就必须要说一下相对于屏幕和相对窗体这两个区别了,我们必须要注意,不然的话,我们所取得的坐标值和我们所预期的相差就非常的大了。


再来就进入了我自己写的阶段了,在这个阶段,我首先碰到的问题就是我的图片没有显示出来,这个问题是学长帮我解决的。
具体的问题是这样的:
问题的起因是因为我要使用一个旋转图片的方法,这个方式是Graphics2D中的一个方法,是rotate的方法,这个方法的详细介绍可以在JDK中找到,我就不做过多的解释了。然后是问题了,因为我需要使用这个方法,但是使用了之后我就看到了我的图片已经无法正常的显示了,为了这个问题我纠结了很久,最后,解决的方法是使用bufferImage的方法代替我们普通使用的Image的方法,据说这个是用来专门画图的方法,使用这个方法之后可以很好的运用很多东西。
当然,在这个方法里面我还是学到了一点东西的。
在旋转图片的时候的方法是我们之前就需要把旋转的方法放在我们要把图片放到我们创建的BufferImage中之前,这样的话,就是把我们即将加入的图片进行一种旋转。
具体代码如下:
ImageIcon img = new ImageIcon("car-4.png");
// 创建一个赛车图片的图标
ImageIcon img_car = new ImageIcon("car.png");
// 创建一个空的BufferedImage
BufferedImage buffered = new BufferedImage(img.getIconWidth(),
img.getIconHeight(), BufferedImage.TYPE_INT_BGR);
// 获取他的画布
Graphics2D gr = (Graphics2D) buffered.getGraphics();
// 将背景画到画布上去
gr.drawImage(img.getImage(), 0, 0, 638, 478, null);
// 设置画的时候旋转
gr.rotate(angle, x + 6, y + 5);
// 将赛车绘制到图片上去
gr.drawImage(img_car.getImage(), (int) x, (int) y,null)   
         // 将这个图片画到面板上去
g.drawImage(buffered, 0, 0, null);
这个应该是做这个游戏的时候遇到的最大的问题,也是最大的收获了吧 。

其他的还有组合键的问题,这个问题确实是很蛋疼的一个问题,我在网上搜索了很久,但是最后找到的方法就是,把每个键位的值用Boolean值来代替,然后在按键的时候改变他的Boolean值,这个方法最后实验的以后是可行的,但是有一点很大的问题,这个算是尚未解决还是需要想办法去解决的吧。。
具体代码如下:
public void keyPressed(KeyEvent e) {
if (x <= 16) {
x = x + 5;
} else if (y >= 360) {
y = y - 5;
} else if (y <= 100) {
y = y + 5;
} else if (x >= 470) {
x = x - 5;
} else {
int i = e.getKeyCode();
switch (i) {
case KeyEvent.VK_LEFT:
isLeft = true;
break;
case KeyEvent.VK_UP:
isUp = true;
break;
case KeyEvent.VK_DOWN:
isDown = true;
break;
case KeyEvent.VK_RIGHT:
isRight = true;
break;
}
}
// 只按了向上的键
if (isUp == true && isDown == false && isLeft == false
&& isRight == false) {
if (speed < 5) {
speed += 0.1;
x += Math.cos(angle) * speed;
y += Math.sin(angle) * speed;
} else {
x += Math.cos(angle) * speed;
y += Math.sin(angle) * speed;
}
}
// 只按了向下的键
else if (isUp == false && isDown == true & isLeft == false
&& isRight == false) {
x -= Math.cos(angle);
y -= Math.sin(angle);
}
// 按了左下的键
else if (isUp == false && isDown == true & isLeft == true
&& isRight == false) {
theta -= 10;
angle = (float) theta / 180 * Math.PI;
if (speed < 5) {
speed += 0.1;
x -= Math.cos(angle) * speed;
y -= Math.sin(angle) * speed;
} else {
x -= Math.cos(angle) * speed;
y -= Math.sin(angle) * speed;
}
}
// 按了右上的键
else if (isUp == true && isDown == false & isLeft == false
&& isRight == true) {
theta += 10;
angle = (float) theta / 180 * Math.PI;
if (speed < 5) {
speed += 0.1;
x += Math.cos(angle) * speed;
y += Math.sin(angle) * speed;
} else {
x += Math.cos(angle) * speed;
y += Math.sin(angle) * speed;
}
}
// 按了左上的键
else if (isUp == true && isDown == false & isLeft == true
&& isRight == false) {
theta -= 10;
angle = (float) theta / 180 * Math.PI;
if (speed < 5) {
speed += 0.1;
x += Math.cos(angle) * speed;
y += Math.sin(angle) * speed;
} else {
x += Math.cos(angle) * speed;
y += Math.sin(angle) * speed;
}
}
// 按了右下的键
else if (isUp == false && isDown == true & isLeft == false
&& isRight == true) {
theta += 10;
angle = (float) theta / 180 * Math.PI;
if (speed < 5) {
speed += 0.1;
x -= Math.cos(angle) * speed;
y -= Math.sin(angle) * speed;
} else {
x -= Math.cos(angle) * speed;
y -= Math.sin(angle) * speed;
}
}
// 只按了向左的键
else if (isUp == false && isDown == false & isLeft == true
&& isRight == false) {
theta -= 10;
angle = (float) theta / 180 * Math.PI;
}
// 只按了向右的键
else if (isUp == false && isDown == false & isLeft == false
&& isRight == true) {
theta += 10;
angle = (float) theta / 180 * Math.PI;
}
}

public void keyReleased(KeyEvent e) {
int i = e.getKeyCode();
switch (i) {
case KeyEvent.VK_LEFT:
isLeft = false;
break;
case KeyEvent.VK_UP:
isUp = false;
break;
case KeyEvent.VK_DOWN:
isDown = false;
break;
case KeyEvent.VK_RIGHT:
isRight = false;
break;
}

}

};


总体来分析的话,我认为这个问题的本质就是我们输入的时候,程序一次只能够识别一个键位,多了的话,他无法同时识别,这个方法,稍微使用了一点点技巧,但是仍旧不能完全的解决,在我的思路之中,曾经是想要用一个线程去解决这个问题,简单的思路和这个方法很类似,也是给这些键位设上Boolean值,然后让线程一直运转,按键的时候改变为true,松开的时候又变回false,但是最终证明这个方法是错误的,因为他还是只能认识一个键位,我们无法让两个键位的Boolean值同时改变,这样的话就回到了最初的问题,并没有解决掉这个问题,然后我在百度上也只能找到上述的方法,并没有其他什么更好的方法,估计是大神们都隐匿了,只剩下水民了,现在这里也坐等高手来真正的解决下这个问题,感激不敬,剩下的就是和弹球时候的问题差不多了,都是一些碰撞的问题,没有必要一一叙述了。
这个差不多就是我第一个游戏所能得到的一点总结吧,感觉同伴们做的都比我好的很多,还是要好好的努力一下了。

你可能感兴趣的:(游戏,rotate,dispose,组合键)