十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
首先创建四个类,敌机和英雄机子弹类,敌机类,英雄机类,类中定义各自的横竖x y坐标属性,值得注意的是,在写构造的时候,子弹的构造需要传入参数,因为子弹英雄机和敌机发出来的嘛。再定义两种子弹移动方法。移动方法很好写,子弹垂直方向发,x——就行了。再在main中调用就行了
成都网站建设公司更懂你!成都创新互联公司只做搜索引擎喜欢的网站!成都网站制作前台采用搜索引擎认可的DIV+CSS架构,全站HTML静态,H5响应式网站+CSS3网站,提供:网站建设,微信开发,成都微信小程序,商城开发,成都App定制开发,空间域名,服务器租售,网站代托管运营,微信公众号代托管运营。
// x1,y1 追踪目标 x2,y2 追踪者 speed 追踪速度
FollowUpBullet(x1,y1,x2,y2,speed){undefined
var deltax = x1 - _x2
var deltay =y1 - y2
if (deltax == 0 ) {undefined
if( y1 = y2 ){undefined
deltax = 0.0000001
}else{undefined
deltax = -0.0000001
}
}
if (deltay == 0 ) {undefined
if( x1= x2 ){undefined
deltay = 0.0000001
}else{undefined
deltay = -0.0000001
}
}
var angle = 0
var π = 3.1415926
if( deltax0 deltay0 ){undefined
angle = Math.atan( Math.abs(deltay/deltax)) // 第一项限
}else if( deltax0 deltay0 ) {undefined
angle = π- Math.atan( Math.abs(deltay/deltax)) // 第二项限
}else if( deltax0 deltay0 ) {
angle = π+ Math.atan( Math.abs(deltay/deltax)) // 第三项限
}else{undefined
angle = 2*π- Math.atan( Math.abs(deltay/deltax)) // 第四项限
}
var x = speed * Math.cos(angle)
var y = speed * Math.sin(angle)
}
看了这套题目感觉很有兴趣,就花了一个中午亲手给你写了一个类似的例子,相信可以帮助你对这个游戏有很好的理解,从右向左那个是僵尸,点一下鼠标就出现植物,我只是起到一个抛砖引玉的作用。代码如下(绝对可以用的代码):
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.event.MouseInputAdapter;
public class PlantsAndZombies extends JFrame {
private static final long serialVersionUID = 1L;
public static final int screenWidth=800;
public static final int screenHeight=600;
Printer printer;
Zombies zombies=new Zombies();
Thread T_Zombies;
Bullet bullet=new Bullet();
Thread T_Bullet;
public PlantsAndZombies(){
this.setSize(new Dimension(screenWidth,screenHeight));
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.addMouseListener(new Shoot(this));
this.setVisible(true);
printer=new Printer( this.getGraphics());
printer.Add(zombies);
printer.Add(bullet);
T_Zombies=new Thread(zombies);
T_Zombies.start();
T_Bullet=new Thread(bullet);
T_Bullet.start();
}
public void Shoot(){
bullet.getTarget(zombies);
}
public static void main(String[] args){
PlantsAndZombies game=new PlantsAndZombies();
}
public void run() {
while(true){
}
}
}
interface Drawable{
void drawMe(Graphics g);
}
class Zombies implements Drawable,Runnable{
public boolean isLive=true;
public int x=PlantsAndZombies.screenWidth;
public int y=500;
public void run() {
while(true){
if(x10){
x-=20;
}else x=PlantsAndZombies.screenWidth;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void drawMe(Graphics g){
g.drawRect(x,y,20,50);
}
}
class Bullet implements Drawable,Runnable{
private int x=0;
private int y=500;
private Zombies _z;
private float a,b,c;
private float step;
public void getTarget(Zombies z){
_z=z;
// 用三点确定一个抛物线的方法,计算弹道
int x1=0;
int y1=500;
int x2=(z.x-6*20)/2;
int y2=300; // 抛物线高度200个像素
int x3=z.x-6*20; // 假设击中僵尸用3秒钟,在这3秒钟内僵尸向前移动了6*20个像素
int y3=500;
a=(float)((y2-y1)*(x3-x2)-(y3-y2)*(x2-x1))/(float)((x2*x2-x1*x1)*(x3-x2)-(x3*x3-x2*x2)*(x2-x1));
b=(float)((y2-y1)-a*(x2*x2-x1*x1))/(float)(x2-x1);
c=y1-a*x1*x1-b*x1;
step=(float)(x3-x1)/(float)(3*20);
}
public void run() {
while(true){
try {
x+=step;
y=(int)(a*x*x+b*x+c);
if(y500){
_z.isLive=false;
}
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void drawMe(Graphics g) {
g.drawRect(x,y,20,20);
}
}
class Printer extends Thread{
private VectorDrawable v=new VectorDrawable();
private Graphics _g;
public Printer(Graphics g){
_g=g;
this.start();
}
public void Add(Drawable o){
v.add(o);
}
public void run(){
while(true){
_g.clearRect(0,0,PlantsAndZombies.screenWidth,PlantsAndZombies.screenHeight);
for(Drawable o:v){
o.drawMe(_g);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Shoot extends MouseInputAdapter{
private PlantsAndZombies _adaptee;
public Shoot(PlantsAndZombies adaptee){
_adaptee=adaptee;
}
public void mouseClicked(MouseEvent e) {
_adaptee.Shoot();
}
}
var _gaq = _gaq || [];//定义一个数组,若_gaq不为空,则取自己的值,否则初始化为空
_gaq.push(['_setAccount', 'UA-16407365-1']);//push方法向数组中添加2个字符串元素_setAccount'和'UA-16407365-1'
(function(){})是一个闭包的用法,在javascript中用的很多也很重要,可以去好好学一下,闭包必定会被调用。
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;//创建一个script元素,脚本类型为javasceipt,异步的类型
ga.src = ('https:' == document.location.protocol ? '' : '') + '.google-analytics.com/ga.js';//设定这个script的源代码为ga.js
var s = document.getElementsByTagName('script')[0]; //取得第一个tag名为script的元素,所谓tag名就是html中每一个元素的类型名字,比如div,img等
s.parentNode.insertBefore(ga, s);//在s前添加元素ga