Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 12:04 13.07.25 
Компютри и Интернет
   >> Програмисти
*Кратък преглед

Тема Айде малко да си размърдате мозъцитенови  
Автор 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 между топките




Тема криво лево работещо решениенови [re: jensen-110062]  
Автор jensen-110062 (рекордьор)
Публикувано24.09.11 19:49



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.
Стана кукличка и много му се радвам.







*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2025 Dir.bg Всички права запазени.