- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过制作一个简单的小行星游戏来更多地了解 Java 中的 vector 和旋转。我一直在尝试 Vector2d 类,但我觉得我可以只使用 Points 和 doubles 来完成它。我对 Vector2d 的使用是多余的吗?你会如何改变我的程序?
来源:
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.vecmath.Vector2d;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Asteroids extends JPanel implements Runnable{
BufferedImage img;
boolean up, left, right;
double angle = 0;
int imgw = 0;
int imgh = 0;
int magnitude = 0;
JFrame f;
ArrayList<Projectile> bullets;
Vector2d rocket = new Vector2d();
Vector2d Magnitude = new Vector2d();
AffineTransform at = new AffineTransform();
public Asteroids(JFrame f){
this.f = f;
setSize(900, 800);
try {
img = ImageIO.read(new File("res/rocket.png"));
} catch (IOException e) {}
imgw = img.getWidth();
imgh = img.getHeight();
bullets = new ArrayList<Projectile>();
f.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent evt) {
switch (evt.getKeyCode()) {
case KeyEvent.VK_UP:
up= true;
break;
case KeyEvent.VK_LEFT:
left = true;
right = false;
break;
case KeyEvent.VK_RIGHT:
right = true;
left = false;
break;
}
}
public void keyReleased(KeyEvent evt) {
switch (evt.getKeyCode()) {
case KeyEvent.VK_UP:
up= false;
break;
case KeyEvent.VK_LEFT:
left = false;
break;
case KeyEvent.VK_RIGHT:
right = false;
break;
case KeyEvent.VK_SPACE:
Vector2d dir = new Vector2d(Math.cos(angle-Math.toRadians(90)),Math.sin(angle-Math.toRadians(90)));
bullets.add(new Projectile(dir,rocket));
break;
}
}
});
Thread t = new Thread(this);
t.start();
}
public static void main(String[] Args){
JFrame frame = new JFrame();
BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor");
frame.getContentPane().setCursor(blankCursor);
frame.add(new Asteroids(frame));
frame.setVisible(true);
frame.setSize(900,500);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.fillRect(0,0,this.getWidth(),this.getHeight());
g2.drawImage(img,at,this);
g2.setColor(Color.red);
for(Projectile p: bullets){
p.draw(g2);
}
}
public void run(){
rocket = new Vector2d(100, 400);
Magnitude = new Vector2d(Magnitude = new Vector2d(magnitude*Math.cos(angle-Math.toRadians(90)),magnitude*Math.sin(angle-Math.toRadians(90))));
while(true){
if(left){
angle-=Math.toRadians(5);
}
if(right){
angle+=Math.toRadians(5);
}
if(up){
Vector2d m2 = new Vector2d(Math.cos(angle-Math.toRadians(90)),Math.sin(angle-Math.toRadians(90)));
m2.normalize();
m2.x/=5;
m2.y/=5;
Magnitude.add(m2);
}
if(angle>=Math.toRadians(360)){
angle-=Math.toRadians(360);
}else if(angle<=Math.toRadians(-360)){
angle+=Math.toRadians(360);
}
Vector2d rocketN = new Vector2d(rocket);
rocketN.normalize();
rocket.add(Magnitude);
System.out.println(Math.toDegrees(angle));
at.setToTranslation(rocket.x-img.getWidth()/2, rocket.y-img.getHeight()/2);
at.rotate(angle, imgw/2, imgh/2);
Magnitude.x*=0.99;
Magnitude.y*=0.99;
for(Projectile p: bullets){
p.update();
}
repaint();
try {Thread.sleep(25);
} catch (InterruptedException e) {}
}
}
public class Projectile{
int magnitude;
private Vector2d Magnitude, position;
public Projectile(Vector2d dir, Vector2d Position){
this.position = new Vector2d(Position);
magnitude = 10;
Magnitude = new Vector2d(dir);
position.x+=(5*Magnitude.x);
position.y+=(5*Magnitude.y);
Magnitude.x*=magnitude;
Magnitude.y*=magnitude;
}
public void update(){
position.add(Magnitude);
}
public void draw(Graphics2D g2){
g2.drawOval((int)position.x, (int)position.y,4,4);
}
}
}
最佳答案
关于java - 我在 Asteroids 游戏中使用 Vector2d 类是多余的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619509/
我正在用小行星做实验。 我的 html 看起来像: test var ceres = new Asteroid("localhost:3000"); var
题目地址:https://leetcode.com/problems/asteroid-collision/description/ 题目描述 Weare given an array aster
所以我有一个Java swing应用程序,其中有一艘宇宙飞船获取旋转角度,然后沿该方向加速(在其轴上旋转并移动到 scapy 所在的位置)。我遇到的麻烦是当船指向与之前方向相反的方向时让船减速。 Wh
我很难理解如何像在小行星克隆中那样移动我的宇宙飞船。当我旋转宇宙飞船时,我可以沿着世界 y 轴移动它,但不能在它自己的相对 y 轴内向前移动它。我已经评论了 if 语句用于飞船运动的代码。它位于 up
我有两个点 (x1, y1) 和 (x2,y2)它代表我空间中两个实体的位置。我使用毕达哥拉斯定理计算它们之间的欧几里得距离,一切都很好。但是,如果我的空间变得有限,我想在“环绕” map 接缝的点之
我正在尝试通过制作一个简单的小行星游戏来更多地了解 Java 中的 vector 和旋转。我一直在尝试 Vector2d 类,但我觉得我可以只使用 Points 和 doubles 来完成它。我对 V
我正在尝试在 JavaFX 中制作 Asteroids 游戏克隆。到目前为止,我已经能够将飞船和小行星绘制到屏幕上(目前用矩形代表它们)。我还实现了飞船的运动和小行星的随机运动。 我在实现小行星相互弹
我在为我的 GLUT 小行星游戏显示和动画多个小行星时遇到问题。我可以生成 1 ok,但是当我尝试添加更多时,输出不正确,createasteroid 不断被调用,并且出于某种原因只是在屏幕的不同部分
我正在为我的网络小行星游戏开发协议(protocol)。第一个版本将只允许每个玩家在一个滚动的世界中有一艘船射击对手。稍后我会添加岩石,很多岩石。 在 UDP 之上实现协议(protocol)似乎很重
我目前正在研究如何将 Meteor 与我自己的 Angular 项目结构和模板一起使用。有一个名为 Asteroid 的库(“用于 Meteor 后端的 javascript 客户端(浏览器和节点),
我正在寻找在 Parrot 上开发的解决方案设备。我对任何 SDK 或开发人员工具的存在感兴趣。我可以简单地将我的 Android 应用程序安装到设备上吗?我应该修改源代码以在 Parrot 设备上运
我是一名优秀的程序员,十分优秀!