|
Тема
|
Айде малко да си размърдате мозъците
|
|
Автор |
jensen-110062 (рекордьор) |
Публикувано | 23.09.11 22:22 |
|
Предлагам ви моя елементарна сглобка на програмата за топки движещи се в панел.
Но се получава един странен ефект, който не мога да разбера от къде идва. Едната топка си върви нормално, а другата вибрира в горната част на панела.
Трябва да се направи панел с топки вътре (2 в моя случай), които се движат безразборно и си сменят посоката при сблъсък в стените на панела.
Ще се радвам ако някой я погледне и подскаже къде бъркам.
Пускам двата класа. Който намери грешката ще получи всичко, каквото си пожелае (виртуално) и разбира се моето признание . Хайде да ви видим
import java.awt.*;
import javax.swing.*;
public class BouncingBalls {
public static void main(String[] args) {
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,300);
Pan panel1=new Pan(Color.RED);
Pan panel2=new Pan(Color.BLUE);
panel1.add(panel2);
frame.add(panel1);
Thread t1=new Thread(panel1);
Thread t2=new Thread(panel2);
t1.start();
t2.start();
frame.setVisible(true);
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Pan extends JPanel implements ActionListener, Runnable{
private int DIAMETER = 40;
private int ballX =0;
private int ballY =0;
private double ballSpeedX = Math.random()*20; // Ball's speed for x and y
private double ballSpeedY = Math.random()*20;
private int rightBound; // Maximum permissible x, y values.
private int bottomBound;
Timer time;
Color color;
public Pan(Color color) {
this.color=color;
setBackground(Color.WHITE);
time=new Timer(10, this);
time.start();
}
public void setBounds(int width, int height) {
rightBound = width - DIAMETER;
bottomBound = height - DIAMETER;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillOval(ballX, ballY, DIAMETER, DIAMETER);
}
public void move() {
ballX += ballSpeedX;
ballY += ballSpeedY;
if (ballX < 0) {
ballX = 0;
ballSpeedX = -ballSpeedX;
} else if (ballX > rightBound) {
ballX = rightBound;
ballSpeedX = -ballSpeedX;
}
if (ballY < 0) {
ballY = 0;
ballSpeedY = -ballSpeedY;
} else if (ballY > bottomBound) {
ballY = bottomBound;
ballSpeedY = -ballSpeedY;
}
}
public void actionPerformed (ActionEvent event) {
setBounds(getWidth(), getHeight());
move();
repaint();
}
public void run() {
try {
Thread.sleep( 20 );
}
catch ( InterruptedException exception ) {
System.err.println( exception.toString() );
}
time.start();
}
}
| |
Тема
|
Re: Айде малко да си размърдате мозъците
[re: jensen-110062]
|
|
Автор |
zaphod (мракобес) |
Публикувано | 24.09.11 08:19 |
|
най-вероятно се е набучила в стена и се отразява постоянно. може би ще възразиш че това няма как да се случи, понеже при отражение координатите се местят на границата и топката трябва да напусне след смяната на посоката съгласен съм, няма как да се случи това което казвам, НО ако се случи въпреки че няма как, топката ще стои и ще трепка. е, явно се случва.
затова проверката ти за отражение трябва да включва не само координатите, но и скоростта тоест отразяваш ако координатите са в стената И скоростта е към стената.
NE SUTOR ULTRA CREPIDAM
| |
Тема
|
Подозренията ми за този клуб се потвърждават
[re: jensen-110062]
|
|
Автор |
Deern ( ღ) |
Публикувано | 24.09.11 19:13 |
|
Когато за пръв път ти прочетох темата, не можах да разбера какво се случва със втората топка. Оказа се че не си въобразявам.
Опитала си да вкараш втората топка в първата, след всичките ти усилия да ги дефинираш да са различни и да правят различни неща.
Джейми ти прати мястото на грешката на бележка
п.п. Вижда се че си ентусиаст, продължавай така!
Но определено ти трябва малко повече (пространствено) мислене. Представи си че решението на задачата не може да се види както в конкретния случай, или не можеш да направиш проверка на изхода.
| |
Тема
|
Re: Подозренията ми за този клуб се потвърждават
[re: Deern]
|
|
Автор |
jensen-110062 (рекордьор) |
Публикувано | 24.09.11 19:47 |
|
не съм получила решение от джейми, но сама открих защо се получава ефекта с втората топка вибрираща горе. Смених лейаута на панела на BorderLayout и сложих втория панел в центъра на първия. После дадох setOpaque(false) и стана. Но не е както искам, защото сега
1. Не знам как да сменя цвета на бекгарунда
2. Не знам по моя начин направено дали може да се детектне collision между топките
| |
|
import java.awt.*;
import javax.swing.*;
public class BouncingBalls extends JFrame{
public BouncingBalls () {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,300);
setForeground(Color.WHITE);
Pan1 panel1=new Pan1(Color.RED);
Pan1 panel2=new Pan1(Color.BLUE);
Pan1 panel3=new Pan1(Color.YELLOW);
panel2.add(panel3, BorderLayout.CENTER);
panel1.add(panel2, BorderLayout.CENTER);
getContentPane().add(panel1);
setVisible(true);
Thread t1=new Thread(panel1);
Thread t2=new Thread(panel2);
Thread t3=new Thread(panel3);
t1.start();
t2.start();
t3.start();
}
public static void main(String[] args)
{
new BouncingBalls();
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Pan1 extends JPanel implements ActionListener, Runnable{
private int DIAMETER = 40;
private int ballX =0;
private int ballY =0;
private double ballSpeedX = Math.random()*20; // Ball's speed for x and y
private double ballSpeedY = Math.random()*20;
private int rightBound; // Maximum permissible x, y values.
private int bottomBound;
Timer time;
Color color;
public Pan1(Color color) {
setOpaque(false);
this.color=color;
//setBackground(Color.WHITE);
setLayout(new BorderLayout());
time=new Timer(20, this);
time.start();
}
public void setBounds(int width, int height) {
rightBound = width - DIAMETER;
bottomBound = height - DIAMETER;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillOval(ballX, ballY, DIAMETER, DIAMETER);
}
public void move() {
ballX += ballSpeedX;
ballY += ballSpeedY;
if (ballX < 0) {
ballX = 0;
ballSpeedX = -ballSpeedX;
} else if (ballX > rightBound) {
ballX = rightBound;
ballSpeedX = -ballSpeedX;
}
if (ballY < 0) {
ballY = 0;
ballSpeedY = -ballSpeedY;
} else if (ballY > bottomBound) {
ballY = bottomBound;
ballSpeedY = -ballSpeedY;
}
}
public void actionPerformed (ActionEvent event) {
setBounds(getWidth(), getHeight());
move();
repaint();
}
public void run() {
try {
Thread.sleep( 20);
}
catch ( InterruptedException exception ) {
System.err.println( exception.toString() );
}
time.start();
}
}
| |
Тема
|
Re: Подозренията ми за този клуб се потвърждават
[re: jensen-110062]
|
|
Автор |
jeweel () |
Публикувано | 25.09.11 01:42 |
|
За колизии не знам, ама за цвета на фона дали не можеш да си сложиш един прост панел (JPanel, не Pan) под всички останали и на тях да им сетнеш setOpaque(false), а тоя най-долният да е с някакъв си там цвят и opaque=true? Това - на първо четене, в момента нямам къде да го изпробвам.
Редактирано от jeweel на 25.09.11 01:42.
| |
Тема
|
Re: Подозренията ми за този клуб се потвърждават
[re: jeweel]
|
|
Автор |
NikiFin (рекордьор) |
Публикувано | 25.09.11 19:26 |
|
ами не знам, но аз го направих по съвсем друг начин с футболна топка и колизии и мога да си избирам фона защото само топката е Runnable и не се налага да слагам opaque false.
Стана кукличка и много му се радвам.
| |
|
|
|
|