Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.help > #2175

Re: Lunar Lander

From Knute Johnson <nospam@knutejohnson.com>
Newsgroups comp.lang.java.help
Subject Re: Lunar Lander
Date 2012-10-24 21:11 -0700
Organization A noiseless patient Spider
Message-ID <k6ae4v$f9j$1@dont-email.me> (permalink)
References <a02ca455-c62d-4397-8673-26489e368630@googlegroups.com> <k6a2po$ulm$1@dont-email.me> <0a94edb9-529b-4df8-8b89-97778cacbd15@googlegroups.com>

Show all headers | View raw


On 10/24/2012 6:32 PM, sqwundle@gmail.com wrote:
> On Wednesday, October 24, 2012 8:57:28 PM UTC-4, Knute Johnson wrote:
>> On 10/24/2012 3:11 PM, sqwundle@gmail.com wrote:
>>
>>> hello im making a lunar lander program but im having trouble with the accleration and when you click the left and right arrows the ball goes flying can anyone help fix my code
>>
>>>
>>
>>> import java.awt.*;
>>
>>> import java.awt.event.*;
>>
>>>
>>
>>> public class lunarlander extends java.applet.Applet implements MouseListener, KeyListener
>>
>>> {
>>
>>> 		double x = 100, y = 40;
>>
>>> 		double vx = 0.1, vy = 0.1;
>>
>>>
>>
>>>
>>
>>> 		public lunarlander()
>>
>>> 		{
>>
>>> 			addMouseListener(this);
>>
>>> 			addKeyListener(this);
>>
>>> 		}
>>
>>> 		public void paint(Graphics g)
>>
>>> 		{
>>
>>> 			vy = vy + 0.1;
>>
>>> 			vx = vx + 0.001;
>>
>>> 			vy = vy * 0.999;
>>
>>> 			vx = vx * 0.999;
>>
>>> 			if(y > 600 && vy > 0)
>>
>>> 				vy = - vy;
>>
>>> 			x = x + vx;
>>
>>> 			y = y + vy;
>>
>>> 			g.fillOval((int)x,(int)y,30,30);
>>
>>> 			for(int i = 0; i < 100000; i ++)
>>
>>> 			repaint();
>>
>>> 			if(y < 100)
>>
>>> 			g.drawString("Crash", 800, 800);
>>
>>> 		}
>>
>>> 		public void keyReleased(KeyEvent ke){}
>>
>>> 		public void keyPressed(KeyEvent ke)
>>
>>> 		{
>>
>>> 			if(ke.getKeyCode() == KeyEvent.VK_UP)
>>
>>> 				vy-=vy+2.0;
>>
>>> 			else if(ke.getKeyCode() == KeyEvent.VK_DOWN)
>>
>>> 				vy-=vy-4.0;
>>
>>> 			else if(ke.getKeyCode() == KeyEvent.VK_LEFT)
>>
>>> 				vx+=x-0.01;
>>
>>> 			else if(ke.getKeyCode() == KeyEvent.VK_RIGHT)
>>
>>> 				vx+=x-0.01;
>>
>>> 		}
>>
>>> 		public void keyTyped(KeyEvent ke){}
>>
>>> 		public void mouseExited(MouseEvent me){}
>>
>>> 		public void mouseEntered(MouseEvent me){}
>>
>>> 		public void mouseClicked(MouseEvent me){}
>>
>>> 		public void mouseReleased(MouseEvent me){}
>>
>>> 		public void mousePressed(MouseEvent me){}
>>
>>> }
>>
>>>
>>
>>
>>
>> Take a look at my Asteroids game code;
>>
>>
>>
>> http://rabbitbrush.frazmtn.com/asteroids.html
>>
>>
>>
>> --
>>
>>
>>
>> Knute Johnson
>
> im a beginner at java so reading long code like that is confusing. what exactly do i need to fix my problem
>

You've got a lot of problems.  You need a more workable structure for 
your drawing code.  Calling repaint() from your paint() method is 
problematic.  You need a Thread or a Timer that calls repaint() after 
you change your velocities.  Lew's suggestion to use Swing would make 
things easier and probably make it work better tool.

The javax.swing.Timer class is very easy to use for your animation loop. 
  You can use the arrow keys to increment or decrement your velocities. 
  Then in each actionPerformed() of the Timer, redraw your lander's world.

Here is some simpler code for you to emulate;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class test1 extends JPanel implements ActionListener {
     private volatile int x = 200, y = 150;
     private volatile int dx = 0, dy = 0;

     private final Timer timer;

     public test1() {
         setPreferredSize(new Dimension(400,300));

         addKeyListener(new KeyAdapter() {
             public void keyPressed(KeyEvent ke) {
                 int code = ke.getKeyCode();
                 switch (code) {
                     case KeyEvent.VK_UP:
                         dy -= 1;
                         break;
                     case KeyEvent.VK_DOWN:
                         dy += 1;
                         break;
                     case KeyEvent.VK_LEFT:
                         dx -= 1;
                         break;
                     case KeyEvent.VK_RIGHT:
                         dx += 1;
                         break;
                 }
             }
         });

         timer = new Timer(40,this);  // 25 frames per second
     }

     public void start() {
         timer.start();
     }

     public void actionPerformed(ActionEvent ae) {
         x += dx;
         y += dy;
         repaint();
     }

     public void paintComponent(Graphics g) {
         g.setColor(getBackground());
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(Color.RED);
         g.drawString(String.format("X:%04d Y:%04d dX:%04d 
dY:%04d",x,y,dx,dy),
          10,10);
         g.fillOval(x-2,y-2,5,5);
     }

     public static void main(String[] args) {
         EventQueue.invokeLater(new Runnable() {
             public void run() {
                 test1 t1 = new test1();
                 JFrame f = new JFrame("test1");
                 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 f.add(t1,BorderLayout.CENTER);
                 f.pack();
                 f.setVisible(true);
                 t1.start();
                 t1.requestFocusInWindow();
             }
         });
     }
}



-- 

Knute Johnson

Back to comp.lang.java.help | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Lunar Lander sqwundle@gmail.com - 2012-10-24 15:11 -0700
  Re: Lunar Lander Knute Johnson <nospam@knutejohnson.com> - 2012-10-24 17:57 -0700
    Re: Lunar Lander sqwundle@gmail.com - 2012-10-24 18:32 -0700
      Re: Lunar Lander Knute Johnson <nospam@knutejohnson.com> - 2012-10-24 21:11 -0700
      Re: Lunar Lander Lew <lewbloch@gmail.com> - 2012-10-25 01:05 -0700
  Re: Lunar Lander Lew <lewbloch@gmail.com> - 2012-10-24 18:31 -0700
  Re: Lunar Lander Daniel Pitts <newsgroup.nospam@virtualinfinity.net> - 2012-10-24 20:37 -0700

csiph-web