使用Java线程创建测试冲突检测的对象
我使用的是acm库(acm.jar),斯坦福大学的学生在Java课程CS106A中使用的同样的库,以便更轻松地创建图形应用程序 可以在此处找到acm.jar: 下面的代码将字符精灵添加到图形窗口中。如果我按z键,角色将自己设置动画,通过使用Java线程移动他的弓和箭头,开始产生垂直移动。到目前为止没有错误 现在我希望能够在线程化的使用Java线程创建测试冲突检测的对象,java,multithreading,collision-detection,Java,Multithreading,Collision Detection,我使用的是acm库(acm.jar),斯坦福大学的学生在Java课程CS106A中使用的同样的库,以便更轻松地创建图形应用程序 可以在此处找到acm.jar: 下面的代码将字符精灵添加到图形窗口中。如果我按z键,角色将自己设置动画,通过使用Java线程移动他的弓和箭头,开始产生垂直移动。到目前为止没有错误 现在我希望能够在线程化的GImage对象(linkArrow)上执行碰撞检测。尝试执行此操作时,我的程序中发生错误: arrowPoint = new GPoint(linkArrow.get
GImage对象(linkArrow)
上执行碰撞检测。尝试执行此操作时,我的程序中发生错误:
arrowPoint = new GPoint(linkArrow.getX(),linkArrow.getY());
arrowObject = getElementAt(arrowPoint);
我得到这个错误:
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
您可以按住ctrl+f键并键入bug以查看我的程序的错误位置
在使用图形矩形和椭圆形之前,我在游戏“突破”中使用了GPoint
和getElementAt
进行了碰撞检测,并且在使用GPoint
和getElementAt
时从未遇到过问题
下面是我的代码:第一个类是运行线程的主程序。第二类是线程
import java.awt.event.KeyEvent;
import acm.graphics.GImage;
import acm.program.GraphicsProgram;
import acm.util.RandomGenerator;
public class Link extends GraphicsProgram {
private static final double GRAVITY = 1;
public void init(){
setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
addLink();
addKeyListeners();
}
private void addLink(){
linkCharacter = new GImage("link sprites/linkFaceRight/link_frame_1_face_right.png");
add(linkCharacter,link_Location_XCoord,link_Location_YCoord);
}
public void keyPressed(KeyEvent e){
/* Link's Movement
*
*/
char linkMoveRightKey = e.getKeyChar();
if(linkMoveRightKey == 'z')
{
xSpeed = 0;
ySpeed = 0;
pause(arrowDELAY);
linkCharacter.move(xSpeed, ySpeed);
linkCharacter.setImage(linkAttackWithBow[linkFrame]);
linkFrame++;
callArrow();
// BUG
arrowPoint = new GPoint(linkArrow.getX(),linkArrow.getY());
arrowObject = getElementAt(arrowPoint);
}
//
/*
* summon link's arrow
*/
}
if(linkFrame>=linkAttackWithBow.length){
linkFrame = 0;
}
}
private void callArrow(){
if(linkFrame == 2){
linkArrow = new ArrowThread(SIZE, rgen.nextColor());
add(linkArrow,linkCharacter.getX(),linkCharacter.getY());
Thread arrowThread = new Thread(linkArrow);
arrowThread.start();
}
}
private ArrowThread linkArrow;
private int SIZE = 400;
private RandomGenerator rgen = RandomGenerator.getInstance();
private GImage gameBackgroundImage;
private GImage linkCharacter;
private double arrowDELAY = 28;
private int link_Location_XCoord = 50;
private int link_Location_YCoord = 50 ;
private final int APPLICATION_WIDTH = 1200;
private final int APPLICATION_HEIGHT = 800;
private String[] linkAttackWithBow = {"link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_1.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_2.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_3.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_1.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_2.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_3.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_1.png","link sprites/linkAttackWithBow/Link_Bow_Attack_Frame_2.png"};
private int linkFrame = 0;
private int xSpeed =5; //the number of pixels to move in x
private int ySpeed = 0; //0 so you only move horizontally
}
这是我的线程类来生成箭头
import java.awt.Color;
import acm.graphics.GImage;
public class ArrowThread extends GImage implements Runnable{
public ArrowThread(int SIZE,Color color){
super("link sprites/linkAttackWithBow/arrow.png", SIZE,SIZE);
}
public void run(){
for(int i = 0; i < 1000/STEP;i++){
pause(60);
move(arrowSpeedX,arrowSpeedY);
}
}
private static final int arrowSpeedX = 0;
private static final int arrowSpeedY = -5;
private static final double STEP = 5;
}
导入java.awt.Color;
导入acm.graphics.GImage;
公共类ArrowThread扩展GImage实现Runnable{
公共箭头线(整数大小、颜色){
超级(“链接精灵/linkAttackWithBow/arrow.png”,大小,大小);
}
公开募捐{
对于(int i=0;i<1000/步;i++){
暂停(60);
移动(箭头速度x,箭头速度x);
}
}
私有静态最终整数arrowSpeedX=0;
专用静态最终整数=-5;
专用静态最终双步骤=5;
}
问题似乎在于成员linkArrow
在第一帧上为空。请参阅支票:
if(linkFrame == 2){
linkArrow = new ArrowThread(SIZE, rgen.nextColor());
问题似乎是成员
linkArrow
在第一帧上为空。请参阅支票:
if(linkFrame == 2){
linkArrow = new ArrowThread(SIZE, rgen.nextColor());
我不明白。该代码只是在角色精灵执行linkAttackWithBow[2]时生成一个箭头线程。如果在从其起始值0开始两次递增
linkFrame
之前调用linkArrow.getX()
,则会引发错误。我不明白。当角色精灵执行linkAttackWithBow[2]时,该代码只生成一个箭头线程。如果在从其起始值0开始两次递增linkFrame
之前调用linkArrow.getX()
,则会引发错误。