我目前正在开发一个用于练习的Android项目,并且我无法通过触摸移动拨片,就像让它们从左向右滚动一样。我想过使用Gdx.input.isTouched但遗憾的是,根据我自己的经验,似乎没有任何建议或例子能够得到真正的体会吗?这就是我希望能够澄清的主题
private void updatePaddle2(float dt) {
if(Gdx.input.isTouched(0)){
paddle1.move(-350, 0);
paddle1.Intergrate(dt);
}
private void update(float dt) {
//paddle update
updatePaddle1(dt);
updatePaddle2(dt);
}
private void resetRectangle(){
paddle1.move((field.width * .5f), field.y + (field.height * .1f));
paddle2.move((field.width * .5f), field.y + (field.height * .8f));
}
和桨的类
public class Paddle extends GameShare{
private ShapeRenderer paddleRenderer;
Color paddleColor = new Color();
protected Paddle() {
super(100, 32);
}
public void paddleCreate(){
paddleRenderer = new ShapeRenderer();
}
public void paddleRender(float dt){
paddleRenderer.begin(ShapeType.Filled);
paddleColorSwap(dt);
drawPaddle(dt);
paddleRenderer.end();
}
private void drawPaddle(float dt) {
paddleRenderer.rect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
paddleRenderer.rect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
}
int threshold = 7000;
long LastChanged = 0;
public void paddleColorSwap(float dt){
if(System.currentTimeMillis() - LastChanged < threshold)
return;
int rnd = (int)(Math.random() * 6);
switch(rnd){
case 0: paddleColor.set(Color.GREEN);break;
case 1: paddleColor.set(Color.BLUE);break;
case 2: paddleColor.set(Color.RED);break;
case 3: paddleColor.set(Color.YELLOW);break;
case 4: paddleColor.set(Color.CYAN);break;
case 5: paddleColor.set(Color.ORANGE);break;
}
LastChanged = System.currentTimeMillis();
paddleRenderer.setColor(paddleColor);
}
}
和扩展类
public abstract class GameShare {
private Vector2 position = new Vector2();
private Vector2 velocity = new Vector2();
private Rectangle bounds = new Rectangle();
protected GameShare(int width, int height){
bounds.setWidth(width);
bounds.setHeight(height);
}
public Rectangle getBounds(){
updateBounds();
return bounds;
}
public void setBounds(Rectangle bounds){
this.bounds = bounds;
}
public void updateBounds(){
bounds.set(position.x, position.y, bounds.width, bounds.height);
}
public float getX(){
return position.x;
}
public float getY(){
return position.y;
}
public float getVelocityX(){
return velocity.x;
}
public float getVelocityY(){
return velocity.y;
}
public Vector2 getPosition() {
return position;
}
public void setPosition(Vector2 position) {
this.position = position;
}
public Vector2 getVelocity() {
return velocity;
}
public void setVelocity(Vector2 velocity) {
this.velocity = velocity;
}
public float bottom(){
return bounds.y;
}
public float getHeight(){
return bounds.height;
}
public float getWidth(){
return bounds.width;
}
public void Intergrate(float dt){
position.add((velocity.x * dt), (velocity.y * dt));
}
public float left(){
return bounds.x;
}
public void move(float x, float y){
position.set(x, y);
}
public float right(){
return bounds.x + bounds.width;
}
public void setVelocity(float x, float y){
velocity.set(x, y);
}
public float top(){
return bounds.y + bounds.height;
}
public void translate(float x, float y){
position.add(x, y);
}
答案 0 :(得分:0)
您的updatePaddle2
方法在划线上调用moveTo
,在您的代码中直接设置位置,因此它会立即将划线传送到-350个单位以外的新位置。然后你打电话给Intergrate
,因为你没有在桨上设置速度,所以没有做任何事情。由于每帧都会调用updatePaddle2
,因此您的划分可能会以每帧350个单位* 60 fps =每秒21,000个单位的速度从屏幕上飞出。
根据您尝试做的事情,您的方法应该看起来像这样,尽管似乎还有其他问题(比如为什么要在paddle1
中更新updatePaddle2
方法?)。
private void updatePaddle2(float dt) {
if (Gdx.input.isTouched(0)){
paddle2.setVelocity(-350, 0);
} else {
paddle2.setVelocity(0, 0);
}
paddle2.Intergrate(dt);
}
您需要更改GameShare类中的setVelocity
方法,将x和y作为参数而不是新的Vector2。更换速度矢量而不仅仅是修改速度矢量是浪费的。
我还注意到,当您的GameShare课程中的职位更新时,您不会更新界限。当你开始使用边界时,这将导致问题。代码中修改位置的任何地方,边界&#39; x和y也应该更新以匹配。