【问题标题】:How to Make objects "move" with pressing a specific key? - Processing如何通过按特定键使对象“移动”? - 加工
【发布时间】:2015-07-03 04:30:40
【问题描述】:

我是编程新手,我正在构建一个简单的 pong 应用程序时遇到问题。这个想法是玩家 1 控制左侧和顶部桨,而玩家 2 控制右侧和底部。程序没有完成,但我遇到了问题。现在使用我的代码,桨要么根本不动,要么沿对角线移动,而不是从左到右移动两个桨。非常感谢您的帮助,任何有关如何修复或更好地组织我的程序的指示都将不胜感激。感谢您的时间和帮助。

package xpong;

import processing.core.PApplet;
import processing.core.PFont;
import processing.core.PImage;

public class XPong extends PApplet {
    PFont f;      
    public boolean sideMoveLeft = false;
    public boolean sideMoveRight = false;
    public boolean topMoveLeft = false;
    public boolean topMoveRight = false;
    public float speed = 5;

    public float x = 0;
    public float y = 0;
    public float a = 0;
    public float b = 0;
    public boolean sideMoving = false;
    public boolean topMoving = false;



    public void setup() {
        size(800, 700);
        background(255, 255, 255);
        f = createFont("Arial",16,true);
        smooth();
    }

    public void draw() {
        background(255, 255, 255);
        textFont(f,16);                 
        fill(0);

        text("Press Spacebar to Begin!",300, 350);

            //leftBar();
            //topBar();
            //rightBar();
            //bottomBar();


        //Checks to see if if players keys are pressed to start playing and draws he bar
                moveLeftAndRight();
                translate(x, y);
                leftBar();          
                rightBar();

            /*if(key == 'q' || key == 'w'){
                moveTopAndBottom();
                translate(x, y);

                topBar();
            }*/
    }   
//Draws the bars
    public void leftBar() {

    fill(0, 0, 0);
    rect(40, 260, 10, 200);

    }
    public void rightBar() {

        fill(0, 0, 0);
        rect(730, 260, 10, 200);        
    }

    public void topBar() {

        fill(0, 0, 0);
        rect(300, 40, 200, 10);     
    }
    public void bottomBar() {

        fill(0, 0, 0);
        rect(300, 650, 200, 10);        
    }
    // Checks for key press and tells the program user wants to move
    public void keyPressed(){
        if(key == 'q')
        {
            sideMoveLeft = true;
            topMoveLeft = true;
            sideMoving = true;
            topMoving = true;

        }
        if(key == 'w')
        {
            sideMoveRight = true;
            topMoveRight = true;
            sideMoving = true;
            topMoving = true;

        }
        if(key == 'o'){
            sideMoveLeft = true;
            sideMoving = true;

        }
        if(key == 'p'){
            sideMoveRight = true;
            sideMoving = true;

        }
    }
    //checks if the player has released the key to stop movement, and everything is set back to false
    public void keyReleased(){
        if(key == 'q')
        {
            sideMoveLeft = false;
            topMoveLeft = false;
            sideMoving = false;
            topMoving = false;
        }
        if(key == 'w')
        {
            sideMoveRight = false;
            topMoveRight = false;
            sideMoving = false;
            topMoving = false;
        }
        if(key == 'o'){
            sideMoveLeft = false;
            sideMoving = false;

        }
        if(key == 'p'){
            sideMoveRight = false;
            sideMoving = false;

        }
    }
    //checks to see if users is pressing key and adds 5(speed) to y
    public void moveLeftAndRight()
    {
        if(sideMoveRight)
        {
            y += speed;

        }
        if(sideMoveLeft)
        {
            y -= speed;

        }

 }
    //checks to see if users is pressing key and adds 5(speed) to x
    public void moveTopAndBottom()
    {
        if(topMoveRight)
        {
            x += speed;

        }
        if(topMoveLeft)
        {
            x -= speed;

        }
    }
}

【问题讨论】:

  • 附带说明:您可能希望使用keyPressed() 来处理键盘输入。
  • 好的,感谢您的快速和有用的输入。
  • 如果我错了请纠正我,但默认情况下处理包括update() 方法。该方法在draw() 之前调用,因此您可以将逻辑方法放在该块中,以使游戏更加流畅。
  • 现在您检查两个不同位置的按键:keyPressed()draw()。这是一个坏主意。在绘图中,您不会对用户输入做出反应,您只会对您的文件(主要是布尔值)做出反应。你的面板还在对角线移动吗?
  • 是的,我试着看看我是否能让左右桨至少工作,但是说玩家 1 的键是 q 和 w,如果我按下它们,它会同时移动玩家 2 的桨时间不独立。我已经更新了代码。

标签: java processing


【解决方案1】:

我认为问题在于您的if-cases:

if (key == 'q' || key == 'w') {
    moveLeftAndRight();
    translate(x, y);
    leftBar();
}
if (key == 'q' || key == 'w') {
    moveTopAndBottom();
    translate(a, b);
    topBar();
}

两者相同,意思是:当且仅当您输入第二个if时,您输入第一个if。这可能会导致对角线平移。我想你想把第二个if 改成:

if (key == 'w' || key == 's') {
    ...
}

【讨论】:

  • 我的想法是玩家 1 用相同的键控制两个小节。这样球就不会来回弹跳,而是可以在所有四个侧面到处弹跳。
  • 请在您的程序中添加一些 cmets。我不确定我是否理解程序的每一行和整个调用结构。 if-cases 很可能不是您的问题的根源。
  • 好吧,我真的没想太多 cmets,因为我想我是唯一一个在看的人,所以我可以理解什么是什么,但我会确保发表更多评论。感谢您的建议。
  • 有什么可能的原因,或者我需要分配不同的键吗?
  • 您不需要定义不同的键。我只是试图理解你的程序的语义。我的想法是:如果你有两个if-cases 不同的body,那么条件应该不同。否则,您只能使用一个if
【解决方案2】:

修复和更新代码并忽略注释代码:

package xpong;


import processing.core.PApplet;
import processing.core.PFont;
import processing.core.PImage;
public class XPong extends PApplet {
//  PFont f;
    //public boolean alwaysTrue = true;

    public boolean p1SideMoveUp = false;
    public boolean p1SideMoveDown = false;
    public boolean p2SideMoveUp = false;
    public boolean p2SideMoveDown = false;
    public boolean p1moving = false;
    public boolean p2moving = false;

    public float speed = 5;
//  int ballSpeed = 10;

    public float p1X = 0;
    public float p1Y = 0;
    public float p2A = 0;
    public float p2B = 0;
  //  int ballX = 400;

  //  float theta;
  //  String message = "thelra;kdjfasdfadsf adfa";

    public void setup() {

    //  size(800, 700);
    //  f = createFont("Arial",16,true);
        smooth();
    }

    public void draw() {
        background(255, 255, 255);
        //screenDivider();

        //textFont(f,16);
        //fill(0);
      //  text("Hello Strings!",10,100);

        moveRight();
        moveLeft(); 
    //ballX = ballX + ballSpeed;

    /*if ((ballX > width) || (ballX < 0)) {

        ballSpeed = ballSpeed * -1;
    }*/
      //stroke(0);
      //fill(175);
     // ellipse(ballX,350,32,32);
}   
    public void moveLeft(){
        moveP1Paddle();
        p1BarDraw();
    }
    public void moveRight(){
        moveP2Paddle();
        p2BarDraw();
    }

//Draws the bars
    public void p1BarDraw() {

    fill(0, 0, 0);
    rect(p1X + 40, p1Y + 260, 10, 200);

    }
    public void p2BarDraw() {

        fill(0, 0, 0);
        rect(p2A + 730, p2B + 260, 10, 200);        
    }
    /*public void screenDivider() {
        line(400, 10000, 400, 0);
    }*/

    // Checks for key press and tells the program user wants to move
    public void keyPressed(){
        if(key == 'q')
        {
            p1SideMoveUp = true;
        }
        if(key == 'w')
        {
            p1SideMoveDown = true;
        }
        if(key == 'o'){
            p2SideMoveUp = true;
        }
        if(key == 'p'){
            p2SideMoveDown = true;
        }
    }
    //checks if the player has released the key to stop movement, and everything is set back to false
    public void keyReleased(){
        if(key == 'q')
        {
            p1SideMoveUp = false;
        }
        if(key == 'w')
        {
            p1SideMoveDown = false;
        }
        if(key == 'o'){
            p2SideMoveUp = false;
        }
        if(key == 'p'){
            p2SideMoveDown = false;
        }
    }
    //checks to see if users is pressing key and adds speed to y
    public void moveP1Paddle()
    {
        if(p1SideMoveDown){
            p1Y += speed;
        }
        if(p1SideMoveUp){
            p1Y -= speed; 
        }

 }
    public void moveP2Paddle()
    {
        if(p2SideMoveDown){
            p2B += speed;
        }
        if(p2SideMoveUp){
            p2B -= speed;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多