Ich stelle euch heute mein Programm Modell von dem bekannten Spiel Ping-Pong vor.
Da es sich nur um ein Modell handelt habe ich die Hilfe von Processing in Anspruch genommen.
Ich würde gerne mit euch zusammen weiter daran Arbeiten um den Thread immer mehr zu verfeinern.
Als erstes solltet ihr über processing.org die Software "Processing" donwloaden.
Eigentlich braucht man nur die "core.jar" Datei, falls man in Java programmieren will,
aber ich Empfehle euch die Software sehr.
Um euch einen kleinen einblick über die Software zu geben folgt der Text welcher beim downloaden erscheint.
"Processing is open source, free software. All donations fund the Processing Foundation,
a nonprofit organization devoted to advancing the role of programming within the visual arts through developing Processing."
Es wird empfohlen die Java JDK über Oracel zu downloaden und zu Installieren.
Vergesst nicht die ensprechenden Umgebungsvariablen zu setzten.
!!Falls ihr keine Erfahrung mit Java habt überspringt den ersten Teil.!!
Teil 1
Processing und Java
Um den Code zum laufen zu bringen müsst ihr in eurem processing Ordner den folgenden
Pfad folgen \Processing\core\library\core.jar und die "core.jar" Datei implementieren.
Achtung:
Dies ist nur ein Modell und kein code welches kommerziell zu gebrauchen ist.
Bedenkt das hier nicht Objektorientiert programmiert wurde also bitte keine Annmerkungen darauf.
PingPong.java
Code:
import processing.core.PApplet;
public class PingPong extends PApplet{
public static void main(String[] args){
PApplet.main("PingPong");
}
//walls
float wallThick = 20;
//paddle
float paddleHeight = wallThick*4;
float paddlePosL;
float paddlePosR;
boolean[] paddleLMove = new boolean[2];
boolean[] paddleRMove = new boolean[2];
float paddleSpeed;
//ball
float ballxPos;
float ballyPos;
int ballSize;
float ballspeed;
float ballySpeed;
//Point
int pointLeft = 0;
int pointRight = 0;
//start
boolean start;
int[] stonePos;
public void settings() {
size(700, 500);
}
public void setup() {
stonePos = new int[5];
reset();
}
//reset methode sets everything to start except points
void reset() {
ballxPos = width/2 + 100;
ballyPos = height/2;
ballSize= 20;
ballspeed= 5;
ballySpeed = 0;
paddleSpeed = 5;
paddlePosL = 250-paddleHeight/2;
paddlePosR = 250-paddleHeight/2;
}
//every 0.4 sec
public void draw() {
background(250, 250, 250);
fill(0,0,0);
rect(width/2 - 50, height/2 -23, 100, 30);
textAlign(CENTER);
textSize(20);
fill(255);
text("Start", width/2, height/2);
if (mouseX > width/2 - 50 && mouseX < width/2 - 50 + 150) {
if (mouseY > height/2 -23 && mouseY < height/2 -23 + 30) {
fill(0,0,0);
rect(width/2 - 50, height/2 -23, 100, 30);
textAlign(CENTER);
textSize(20);
fill(100);
text("Start", width/2, height/2);
}
}
//Start
if (start == true) {
background(250, 250, 250);
walls(wallThick);
ball(ballSize);
paddle(paddleHeight);
bricks();
fill(0,0,0);
}
//Points
fill(255);
text(pointRight, 700-15, 18);
text(pointLeft, 15, 18);
}
//Event for Start
public void mousePressed() {
if (mouseX > width/2 - 50 && mouseX < width/2 - 50 + 150) {
if (mouseY > height/2 -25 && mouseY < height/2 - 25 + 30) {
start = true;
}
}
}
void bricks() {
int yPos= 50;
int xPos = width/2;
int i = 0;
fill(0, 0, 0);
while (i < 5) {
rect(xPos-5 + stonePos[i], yPos, 10, 40);
yPos += 90;
i++;
}
yPos = 45;
//L
if (ballspeed < 0) {
for (int j = 0; j < 5; j++) {
if (ballxPos + ballSize/2 == xPos-5 + stonePos[j]) {
if (ballyPos > yPos && ballyPos < yPos + 40) {
ballspeed = -ballspeed;
stonePos[j] += 5;
}
}
yPos += 90;
}
}
//R
yPos = 45;
if (ballspeed > 0) {
for (int j = 0; j < 5; j++) {
if (ballxPos - ballSize/2 == xPos+5 + stonePos[j]) {
if (ballyPos > yPos && ballyPos < yPos + 40) {
ballspeed = -ballspeed;
stonePos[j] -= 5;
}
}
yPos += 90;
}
}
}
//If keyPressed Event used set paddle(R/L)Move[a] = t;
public void keyPressed() {
//right
if (keyCode == UP) {
paddleRMove[0] = true;
}
if (keyCode == DOWN) {
paddleRMove[1] = true;
}
//left
if (key == 'w') {
paddleLMove[0] = true;
}
if (key == 's') {
paddleLMove[1] = true;
}
}
//If keyR Event used set paddle(R/L)Move[a] = f;
public void keyReleased() {
//right
if (keyCode == UP) {
paddleRMove[0] = false;
}
if (keyCode == DOWN) {
paddleRMove[1] = false;
}
//left
if (key == 'w') {
paddleLMove[0] = false;
}
if (key == 's') {
paddleLMove[1] = false;
}
}
void walls(float wallThick) {
// noStroke() kein rand
fill(0, 0, 0);
rect(0, 0, width, wallThick);
rect(0, height-wallThick, width, wallThick);
}
//ball func for ball
void ball(int ballSize) {
ellipse(ballxPos, ballyPos, ballSize, ballSize);
ballxPos = ballxPos - ballspeed;
float paddleTop = paddlePosR;
float paddleBot = paddlePosR + paddleHeight;
//look for depending variables and calc hitting area on right paddle + Curveballs
if (ballxPos + 10 > width - wallThick/2) {
if (ballyPos > paddleTop && ballyPos < paddleBot) {
float balldistance = paddleBot - ballyPos;
float percent = balldistance/paddleHeight;
ballySpeed += (-2*percent) + (2*(1-percent));
if (ballspeed < 0) {
ballspeed = -ballspeed;
}
}
}
paddleTop = paddlePosL;
paddleBot = paddlePosL + paddleHeight;
//look for depending variables and calc hitting area on left paddle + Curveballs
if (ballxPos - 10 < wallThick/2) {
if (ballyPos > paddleTop && ballyPos < paddleBot) {
float balldistance = paddleBot - ballyPos;
float percent = balldistance/paddleHeight;
ballySpeed += (-2*percent) + (2*(1-percent));
if (ballspeed > 0) {
ballspeed = -ballspeed;
}
}
}
//If someone lose calc Point up
if (ballxPos < -40 || ballxPos > width +40) {
if (ballxPos < -40) {
pointRight ++;
}
if (ballxPos > width +40) {
pointLeft ++;
}
reset();
}
//Hitting walls top and down
if (wallThick > ballyPos || height - wallThick < ballyPos) {
ballySpeed *= -1;
}
ballyPos = ballyPos + ballySpeed;
}
//func for paddles pos / min max Position
void paddle(float paddleHeight) {
//left
rect(0, paddlePosL, wallThick/2, paddleHeight);
if (!(paddleLMove[0] && paddleLMove[1])) {
//max methode get maxYLpos
if (paddleLMove[0]) paddlePosL = max(wallThick, paddlePosL - paddleSpeed);
//min methode get maxYLpos
if (paddleLMove[1]) paddlePosL = min(height-(wallThick + paddleHeight), paddlePosL + paddleSpeed);
}
//right
rect(width-wallThick/2, paddlePosR, wallThick/2, paddleHeight);
if (!(paddleRMove[0] && paddleRMove[1])) {
//max methode get maxVRpos
if (paddleRMove[0]) paddlePosR = max(wallThick, paddlePosR - paddleSpeed);
//min methode get minYRpos
if (paddleRMove[1]) paddlePosR = min(height-(wallThick + paddleHeight), paddlePosR + paddleSpeed);
}
}
}
Teil 2
Processing
Falls ihr auf die schnelle das Programm ausführen wollt könnt ihr auch die
processing.exe starten und den folgenden Code einfügen.
PingPong.pde
Code:
//walls
float wallThick = 20;
//paddle
float paddleHeight = wallThick*4;
float paddlePosL;
float paddlePosR;
boolean[] paddleLMove = new boolean[2];
boolean[] paddleRMove = new boolean[2];
float paddleSpeed;
//ball
float ballxPos;
float ballyPos;
int ballSize;
float ballspeed;
float ballySpeed;
//Point
int pointLeft = 0;
int pointRight = 0;
//start
boolean start;
int[] stonePos;
void setup() {
size(700, 500);
stonePos = new int[5];
reset();
}
//reset methode sets everything to start except points
void reset() {
ballxPos = width/2 + 100;
ballyPos = height/2;
ballSize= 20;
ballspeed= 5;
ballySpeed = 0;
paddleSpeed = 5;
paddlePosL = 250-paddleHeight/2;
paddlePosR = 250-paddleHeight/2;
}
//every 0.4 sec
void draw() {
background(250, 250, 250);
fill(#050505);
rect(width/2 - 50, height/2 -23, 100, 30);
textAlign(CENTER);
textSize(20);
fill(255);
text("Start", width/2, height/2);
if (mouseX > width/2 - 50 && mouseX < width/2 - 50 + 150) {
if (mouseY > height/2 -23 && mouseY < height/2 -23 + 30) {
fill(#050505);
rect(width/2 - 50, height/2 -23, 100, 30);
textAlign(CENTER);
textSize(20);
fill(100);
text("Start", width/2, height/2);
}
}
//Start
if (start == true) {
background(250, 250, 250);
walls(wallThick);
ball(ballSize);
paddle(paddleHeight);
bricks();
fill(#FFFCFC);
}
//Points
fill(255);
text(pointRight, 700-15, 18);
text(pointLeft, 15, 18);
}
//Event for Start
void mousePressed() {
if (mouseX > width/2 - 50 && mouseX < width/2 - 50 + 150) {
if (mouseY > height/2 -25 && mouseY < height/2 - 25 + 30) {
start = true;
}
}
}
void bricks() {
int yPos= 50;
int xPos = width/2;
int i = 0;
fill(0, 0, 0);
while (i < 5) {
rect(xPos-5 + stonePos[i], yPos, 10, 40);
yPos += 90;
i++;
}
yPos = 45;
//L
if (ballspeed < 0) {
for (int j = 0; j < 5; j++) {
if (ballxPos + ballSize/2 == xPos-5 + stonePos[j]) {
if (ballyPos > yPos && ballyPos < yPos + 40) {
ballspeed = -ballspeed;
stonePos[j] += 5;
}
}
yPos += 90;
}
}
//R
yPos = 45;
if (ballspeed > 0) {
for (int j = 0; j < 5; j++) {
if (ballxPos - ballSize/2 == xPos+5 + stonePos[j]) {
if (ballyPos > yPos && ballyPos < yPos + 40) {
ballspeed = -ballspeed;
stonePos[j] -= 5;
}
}
yPos += 90;
}
}
}
//If keyPressed Event used set paddle(R/L)Move[a] = t;
void keyPressed() {
//right
if (keyCode == UP) {
paddleRMove[0] = true;
}
if (keyCode == DOWN) {
paddleRMove[1] = true;
}
//left
if (key == 'w') {
paddleLMove[0] = true;
}
if (key == 's') {
paddleLMove[1] = true;
}
}
//If keyR Event used set paddle(R/L)Move[a] = f;
void keyReleased() {
//right
if (keyCode == UP) {
paddleRMove[0] = false;
}
if (keyCode == DOWN) {
paddleRMove[1] = false;
}
//left
if (key == 'w') {
paddleLMove[0] = false;
}
if (key == 's') {
paddleLMove[1] = false;
}
}
void walls(float wallThick) {
// noStroke() kein rand
fill(0, 0, 0);
rect(0, 0, width, wallThick);
rect(0, height-wallThick, width, wallThick);
}
//ball func for ball
void ball(int ballSize) {
ellipse(ballxPos, ballyPos, ballSize, ballSize);
ballxPos = ballxPos - ballspeed;
float paddleTop = paddlePosR;
float paddleBot = paddlePosR + paddleHeight;
//look for depending variables and calc hitting area on right paddle + Curveballs
if (ballxPos + 10 > width - wallThick/2) {
if (ballyPos > paddleTop && ballyPos < paddleBot) {
float balldistance = paddleBot - ballyPos;
float percent = balldistance/paddleHeight;
ballySpeed += (-2*percent) + (2*(1-percent));
if (ballspeed < 0) {
ballspeed = -ballspeed;
}
}
}
paddleTop = paddlePosL;
paddleBot = paddlePosL + paddleHeight;
//look for depending variables and calc hitting area on left paddle + Curveballs
if (ballxPos - 10 < wallThick/2) {
if (ballyPos > paddleTop && ballyPos < paddleBot) {
float balldistance = paddleBot - ballyPos;
float percent = balldistance/paddleHeight;
ballySpeed += (-2*percent) + (2*(1-percent));
if (ballspeed > 0) {
ballspeed = -ballspeed;
}
}
}
//If someone lose calc Point up
if (ballxPos < -40 || ballxPos > width +40) {
if (ballxPos < -40) {
pointRight ++;
}
if (ballxPos > width +40) {
pointLeft ++;
}
reset();
}
//Hitting walls top and down
if (wallThick > ballyPos || height - wallThick < ballyPos) {
ballySpeed *= -1;
}
ballyPos = ballyPos + ballySpeed;
}
//func for paddles pos / min max Position
void paddle(float paddleHeight) {
//left
rect(0, paddlePosL, wallThick/2, paddleHeight);
if (!(paddleLMove[0] && paddleLMove[1])) {
//max methode get maxYLpos
if (paddleLMove[0]) paddlePosL = max(wallThick, paddlePosL - paddleSpeed);
//min methode get maxYLpos
if (paddleLMove[1]) paddlePosL = min(height-(wallThick + paddleHeight), paddlePosL + paddleSpeed);
}
//right
rect(width-wallThick/2, paddlePosR, wallThick/2, paddleHeight);
if (!(paddleRMove[0] && paddleRMove[1])) {
//max methode get maxVRpos
if (paddleRMove[0]) paddlePosR = max(wallThick, paddlePosR - paddleSpeed);
//min methode get minYRpos
if (paddleRMove[1]) paddlePosR = min(height-(wallThick + paddleHeight), paddlePosR + paddleSpeed);
}
}
Edit: Es handelt sich um ein voll funktionsfähigen code
lg







