Here’s my code:
// Adventures of Dingding
// By Dane MacFadden
// 2019/06/03
ArrayList<Platform> platform; // Holds platforms
Dingding dingding; // Character object
void setup() {
size(600, 400);
platform = new ArrayList<Platform>();
dingding = new Dingding();
}
void draw() {
background(255);
PVector gravity = new PVector(0, 0.3); // Adds gravity
dingding.applyForce(gravity); // Applies gravity to character
dingding.display();
dingding.update();
levelOne();
for (Platform i : platform) { // Enhanced for loop to show all platforms
i.display();
}
}
void levelOne() { // Creates first level
platform.add(new Platform(width/2, height-30, width, 100));
}
void keyPressed() {// Lets character move
if (key == 'a') {
dingding.move(-5);
}
if (key == 'd') {
dingding.move(5);
}
}
class Dingding {
PImage sprite;
PVector position;
PVector dimensions;
PVector vel;
boolean isColliding;
Dingding() {
position = new PVector(width/2, height/2);
dimensions = new PVector(50, 0);
vel = new PVector(0, 0);
sprite = loadImage("dingding.png");
}
void display() {
imageMode(CENTER);
image(sprite, position.x, position.y, dimensions.x, dimensions.x);
}
void move(float steps) { // Lets character move
position.x += steps;
}
void applyForce(PVector force) { // Applies forces when the character is not touching a platform
if (!isColliding) {
vel.add(force);
}
}
void update() { // Updates position of character
position.add(vel);
for (Platform i : platform) {
if (i.collide(position)) {
position.y = i.pos.y;
isColliding = true;
}
}
}
}
class Platform {
PVector pos;
PVector dim;
Platform(float x, float y, float pWidth, float pHeight) {
pos = new PVector(x, y);
dim = new PVector(pWidth, pHeight);
}
void display() {
stroke(0);
rectMode(CENTER);
fill(0);
noStroke();
rect(pos.x, pos.y, dim.x, dim.y);
}
boolean collide(PVector position) {
if (position.x > (pos.x-dim.x) && position.y > pos.y && position.x < (pos.x+dim.x)) {
return true;
}
return false;
}
}
When I run the code, the character just falls right through the ground. I don’t get why. I’m kind of new to using PVectors and physics and such
1 Like
Hey There!
Always remember to format your code. It saves lives!
Not home but looks like your collision needs a bit of a re-work.
Yeah it was formatted, I think something just went wrong when I copy pasted it. Do you mean the Boolean in my platform class?
By format I mean on the forum. It seems your collision method is wrong.
Cannot run this code, first curly quotes issue then
cannot convert from element type Object to sketch_190604a.Platform
Amend sketch so we can see whats going on.
Normally though you would either create a return statement, or a if statement, which tests the characters position against the objects edges.
ie if(this.x>object.x&& this.x<object.x+object.width&&this.y>= object.y){
return true;
}
some variation depending on the specifics of your requirements.
1 Like
Hello,
several issues here:
-
don’t call levelOne from draw(), because it copies the same platform over and over again into our poor ArrayList
-
Also, you use rectmode(CENTER). That means that x,y represents the center of the platform, not its upper left corner. Therefore you have to take away half of the height of the platform off the y-position to get the upper border of the platform. Same with x, on both sides.
-
also, don’t use image with 5 parameters, only 3. Using 5 parameters slows things down a lot. Use resize command in setup once and for all and then image with 3 parameters.
Remark
It’s ArrayList<Platform> platforms; // Holds platforms
With <Platform> you tell the ArrayList the type of objects it’s holding.
Remark
I also implemented the key w.
Chrisir
// Adventures of Dingding
// By Dane MacFadden
// 2019/06/03
ArrayList<Platform> platforms; // Holds platforms
Dingding dingding; // Character object
// ----------------------------------------------------------------------------
void setup() {
size(600, 400);
platforms = new ArrayList();
dingding = new Dingding();
levelOne();
}
void draw() {
background(255);
PVector gravity = new PVector(0, 0.3); // Adds gravity
dingding.applyForce(gravity); // Applies gravity to character
dingding.display();
dingding.update();
for (Platform i : platforms) { // Enhanced for loop to show all platforms
i.display();
}
}
// ----------------------------------------------------------------------------
void levelOne() { // Creates first level
platforms.add(new Platform(width/2, height-30,
width-111, 30));
}
void keyPressed() {// Lets character move
if (key == 'a') {
dingding.move(-5);
}
if (key == 'd') {
dingding.move(5);
}
if (key == 'w') {
dingding.vel.y=-9;
dingding.isColliding=false;
}
}
// ==========================================================================
class Dingding {
PImage sprite;
PVector position;
PVector dimensions;
PVector vel;
boolean isColliding=false;
Dingding() {
position = new PVector(width/2, height/2);
dimensions = new PVector(50, 25);
vel = new PVector(0, 0);
sprite = loadImage("dingding.png");
}
void display() {
imageMode(CENTER);
ellipseMode(CENTER);
//image(sprite, position.x, position.y, dimensions.x, dimensions.x);
fill(245, 3, 2);
ellipse(position.x, position.y,
dimensions.x, dimensions.y);
}
void move(float steps) { // Lets character move
position.x += steps;
}
void applyForce(PVector force) { // Applies forces when the character is not touching a platform
if (!isColliding) {
vel.add(force);
}
}
void update() { // Updates position of character
//if (!isColliding)
position.add(vel);
for (Platform i : platforms) {
if (i.collide(position)) {
position.y = i.pos.y-dimensions.y;
dingding.vel.y=0.0;
isColliding = true;
}
}
}
}//class
// ========================================================
class Platform {
PVector pos;
PVector dim;
Platform(float x, float y,
float pWidth, float pHeight) {
pos = new PVector(x, y);
dim = new PVector(pWidth, pHeight);
}
void display() {
stroke(0);
rectMode(CENTER);
fill(0);
noStroke();
rect(pos.x, pos.y,
dim.x, dim.y);
}
boolean collide(PVector position) {
//
if (position.x > (pos.x-dim.x/2) &&
position.x < (pos.x+dim.x/2)-1 &&
position.y >= pos.y-dim.y/2-1
) {
return true;
}
return false;
}
}//class
//
2 Likes