Newbs need help with collision detection.

Understanding the language, error messages, etc.

Re: Newbs need help with collision detection.

Postby naed » Wed Aug 10, 2016 8:51 pm

I'm just playing with the camera settings, trying to get it so that when the camera hits the boundaries i set the player can still carry on walking to the edge of the screen, it works in the example that was posted earlier by summoner123 but I can't figure out how it was done
User avatar
naed
 
Posts: 140
Joined: Tue May 31, 2016 3:18 pm

Re: Newbs need help with collision detection.

Postby Duhjoker » Wed Aug 10, 2016 10:02 pm

Decided to give it few looks myself. I'm looking at the RPG looking example he gave and the example he posted the other day looking for differences.

On the lil hoppy example are you sure its producing a boundary or does it look that way?
User avatar
Duhjoker
 
Posts: 446
Joined: Sat Jul 02, 2016 4:57 am
Location: Where Palm trees grow

Re: Newbs need help with collision detection.

Postby naed » Wed Aug 10, 2016 10:20 pm

On the dangerous dave example the camera clearly stops moving to the right but the player sprite continues to move, that's what I'm trying to achieve
User avatar
naed
 
Posts: 140
Joined: Tue May 31, 2016 3:18 pm

Re: Newbs need help with collision detection.

Postby Duhjoker » Thu Aug 11, 2016 1:28 am

Ohhhhh ok!!! I haven't messed with that a lot to be honest. Had to do some stuff but I'm looking again.
User avatar
Duhjoker
 
Posts: 446
Joined: Sat Jul 02, 2016 4:57 am
Location: Where Palm trees grow

Re: Newbs need help with collision detection.

Postby Duhjoker » Thu Aug 11, 2016 2:18 am

all righty then, I have the "dd" example the rpg example and ours all on screen. So first I looked at anything on all three sketches and I think I might have solved it I wouldn't know what integers to use.

first heres the camera controls for the RPG type example......

Code: Select all
void render()
{

 
      if(player.posx > 54 && camerax <  0 && camerax  > -156){player.posx = 54;camerax--;}
else  if(player.posx < 30 && camerax <  0 && camerax  > -156){player.posx = 30;camerax++;}
else  if(player.posx > 54 && camerax <= 0 && camerax >= -156)camerax--;
else  if(player.posx < 30 && camerax <= 0 && camerax >= -156)camerax++;   
 
 
      if(player.posy > 28 && cameray < 0 && cameray >  -192){player.posy = 28;cameray--;}
else  if(player.posy < 20 && cameray < 0 && cameray >  -192){player.posy = 20;cameray++;}
else  if(player.posy > 28 && cameray <= 0 && cameray >= -192)cameray--;
else  if(player.posy < 20 && cameray <= 0 && cameray >= -192)cameray++; 

      if(camerax > 0)camerax=0;
else  if(camerax < -156) camerax = -156;
 
      if(cameray > 0)cameray=0;   
else  if(cameray < -192) cameray = -192;

   




ok now here are the camera controls for dangerous cave....

Code: Select all
void renderiza()  //render
{
 
        if(player.posx > 35 && camerax != 0 && camerax != xmax){player.posx = 3 ;  camerax--;} //X Scrolling to the Right
else  if(player.posx < 30 && camerax != 0 && camerax != xmax){player.posx = 30; camerax++;} //X Scrolling to the Left
else  if(player.posx > 35 && camerax <= 0 && camerax >= xmax)camerax--;
else  if(player.posx < 30 && camerax <= 0 && camerax >= xmax)camerax++;
   
  if(camerax >0)camerax=0;
  if(camerax < xmax) camerax = xmax;
 
 
        if(player.posy > 14 ) {cameray-=2; player.posy -=2;}    //Y Scrolling  Down
else  if(player.posy < 10 ){cameray+=2; player.posy +=2;}   //Y Scrolling  Up

 



now heres ours
Code: Select all
       if(player_x > 35 && camerax != 0 && camerax != xmax){player_x = 3 ;  camerax--;} //X Scrolling to the Right
else  if(player_x < 30 && camerax != 0 && camerax != xmax){player_x = 30; camerax++;} //X Scrolling to the Left
else  if(player_x > 35 && camerax <= 0 && camerax >= xmax)camerax--;
else  if(player_x < 30 && camerax <= 0 && camerax >= xmax)camerax++;
   
  if(camerax >0)camerax=0;
  if(camerax < xmax) camerax = xmax;
 
 
        if(player_y > 14 ) {cameray-=2; player_y -=2;}    //Y Scrolling  Down
else  if(player_y < 10 ){cameray+=2; player_y +=2;}   //Y Scrolling  Up




for the rpg type example it gives an extra set of else,ifs but the dangerous cave does not have these.

Edit::: i was thinking that the extra set of camera controls would be the camera max and min after seeing his world size was 260p by 260p
User avatar
Duhjoker
 
Posts: 446
Joined: Sat Jul 02, 2016 4:57 am
Location: Where Palm trees grow

Re: Newbs need help with collision detection.

Postby Duhjoker » Thu Aug 11, 2016 9:09 am

We need a good sand tile. Every thing I draw looks like it's too much. Spent tonight doing the top right quadrant and I think I might actually get all the maps packed in!!! But boy is it going to change. I had to add some sprites and I like them in alphabetical order so the arrays are going to change. Fortunately summoner123 has a save tile map command so I just have to reload the sprites and recopy the generated code. Plus I'm gonna chang the layer names. 1 goes all the way from map 1 to the end 2 layer etc.
User avatar
Duhjoker
 
Posts: 446
Joined: Sat Jul 02, 2016 4:57 am
Location: Where Palm trees grow

Re: Newbs need help with collision detection.

Postby noah » Thu Aug 11, 2016 12:56 pm

Hi, I'm not and artist or anything but you said you needed a sand tile and I had one going...
I've uploaded it to my website here. Feel free to use/not use as you want.

-noah :)
User avatar
noah
 
Posts: 25
Joined: Mon Jul 25, 2016 8:32 am
Location: Spiffin' Britain

Re: Newbs need help with collision detection.

Postby naed » Thu Aug 11, 2016 7:05 pm

I always think the 8x8 tiles for sand look rubbish (no offence noah) and generally just look like two squiggly lines, I might have a try at creating one using black and grey, but not sure how easy that would be to add to the tileset map (as not added grey to the map yet, let alone a tile with both colors)

Also noah I saw on your site your not planning to make your gamebuino project public, I for one would be interested in seeing your progress? Any plans to change this decision?
User avatar
naed
 
Posts: 140
Joined: Tue May 31, 2016 3:18 pm

Re: Newbs need help with collision detection.

Postby Duhjoker » Thu Aug 11, 2016 7:54 pm

Has anyone had a chance to look at the boundary recognition I posted above?


For grey tiles lik sand you would probably have to make two tilemaps. One with the black sprites then one with oonly the floor tiles.
User avatar
Duhjoker
 
Posts: 446
Joined: Sat Jul 02, 2016 4:57 am
Location: Where Palm trees grow

Re: Newbs need help with collision detection.

Postby naed » Thu Aug 11, 2016 8:13 pm

Duhjoker wrote:For grey tiles lik sand you would probably have to make two tilemaps. One with the black sprites then one with oonly the floor tiles.


but how would i place them, as each tileset place only allows for placement of one sprite, not two... unless i'd need to overlay the two tilemaps??


i'm just going to take a look at your boundary recognition you posted, although i'm already able to set boundaries for the camera
Code: Select all
if(camerax >=0) camerax = 0;

thats the easy part, the problem i have is that when the camera reaches the boundary and stops, so does the player - he doesn't continue walking to the edge of the screen like in Summoner123's example.... i'm yet to figure that part out

EDIT

got it to work

Code: Select all
#include <SPI.h>
#include <Gamebuino.h>
Gamebuino gb;



const byte tilemap[] PROGMEM = {17,11,
8,8,
 2, 2, 2, 2, 2, 2, 2,19, 8, 8, 3,18,18,18,18,18, 2,
 2, 2, 2, 2, 2, 2, 2,19, 8, 8,27,27,27,27,27,27,20,
 2, 2, 2, 2, 2, 2, 2,19, 8, 8,26,26,26,26,26,26,20,
 2, 2, 2, 2, 2, 2,18, 4, 8, 8,25,26,26,26,26,26,20,
 2, 2, 2, 2, 2, 4, 8, 8, 8, 8, 8,26,26,26,26,26,20,
 2, 2, 2, 2, 4, 8, 8, 8, 8, 8, 8,26,26,26,26,26,20,  /////////112x64 pix res
18,18,18, 4, 8, 8, 8, 8, 8, 8, 8, 8,25,25,25,25, 3,
 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
21,21, 6, 8, 8, 8,22,23,24, 8, 8, 8, 8, 8, 5,21,21,
 2, 2,19, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,20, 2, 2,
 2, 2, 2,21,21,21,21,21,21,21,21,21,21,21, 2, 2, 2,};

const byte bush[] PROGMEM = {B00101100,B01010010,B10001001,B01000010,B10010001,B01001010,B00100100,B01111110,};
const byte port_noir[] PROGMEM = {B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,};
const byte rock_terrain_master[] PROGMEM = {B00000010,B00010000,B01000000,B00000010,B00010000,B00001000,B01000001,B00000100,};
const byte rock_valley_ne[] PROGMEM = {B10100000,B11001001,B01110000,B00001100,B00000101,B00000100,B00000110,B00000011,};
const byte rock_valley_nw[] PROGMEM = {B00000101,B10010011,B00001110,B00110000,B10100000,B00100000,B01100000,B11000000,};
const byte rock_valley_se[] PROGMEM = {B00000011,B00000110,B00000100,B00000101,B00001100,B01110000,B11001001,B10100000,};
const byte rock_valley_sw[] PROGMEM = {B11000000,B01100000,B00100000,B10100000,B00110000,B00001110,B10010011,B00000101,};
const byte turtle_rock[] PROGMEM = {B01101100,B10110010,B11010001,B01010101,B01010010,B10011001,B10000001,B11111110,};
const byte void_tile[] PROGMEM = {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,};
const byte water_left_bottom[] PROGMEM = {B10001111,B10000000,B11110000,B10000000,B10001111,B10000000,B11110000,B11111111,};
const byte water_left_middle[] PROGMEM = {B10001111,B10000000,B11110000,B10000000,B10001111,B10000000,B11110000,B10000000,};
const byte water_left_top[] PROGMEM = {B11111111,B10000000,B11110000,B10001111,B10000000,B10000000,B11110000,B10000000,};
const byte water_right_bottom[] PROGMEM = {B1110001,B00000001,B0000111,B00000001,B11110001,B00000001,B00001111,B11111111,};
const byte water_right_middle[] PROGMEM = {B11110001,B00000001,B00001111,B00000001,B11110001,B00000001,B00001111,B00000001,};
const byte water_right_top[] PROGMEM = {B11111111,B00000001,B00001111,B00000001,B11110001,B00000001,B00001111,B00000001,};
const byte water_middle_bottom[] PROGMEM = {B11110000,B00000000,B00001111,B00000000,B11110000,B00000000,B00001111,B11111111,};
const byte water_middle_middle[] PROGMEM = {B11110000,B00000000,B00001111,B00000000,B11110000,B00000000,B00001111,B00000000,};
const byte water_middle_top[] PROGMEM = {B11111111,B00000000,B11110000,B00000000,B00001111,B00000000,B11110000,B00000000,};
const byte rock_s[] PROGMEM = {B00010010,B00000000,B01001000,B00000100,B00100001,B10001100,B01110010,B10000001,};
const byte rock_e[] PROGMEM = {B00000101,B00100010,B00001010,B10000010,B00100100,B00010100,B10000010,B00001001,};
const byte rock_n[] PROGMEM = {B10000001,B01110010,B10001100,B00100001,B00000100,B01001000,B00000000,B00010010,};
const byte rock_w[] PROGMEM = {B10100000,B01000100,B01010000,B01000001,B00100100,B00101000,B01000001,B10010000,};
const byte bush_left[] PROGMEM = {B00111011,B01000100,B10100000,B10010100,B01000010,B10000000,B10001000,B01110111,};
const byte bush_middle[] PROGMEM = {B10111101,B01000010,B00001000,B10000100,B00010000,B00100001,B10001000,B01110111,};
const byte bush_right[] PROGMEM = {B11011100,B00100010,B00000101,B00101001,B01000010,B00000001,B00010001,B11101110,};
const byte tree_base[] PROGMEM = {B01010100,B01000100,B10100010,B10001010,B10000010,B01101100,B00101000,B00101000,};
const byte tree_repeat[] PROGMEM = {B01010100,B01000100,B10000010,B10010010,B10101010,B01101100,B00101000,B01000100,};
const byte tree_top[] PROGMEM = {B00000000,B00000000,B00000000,B00010000,B00101000,B00101000,B00101000,B01000100,};



const byte *spritesheet[] = {bush,    //0
port_noir,                            //1
rock_terrain_master,                  //2
rock_valley_ne,                       //3
rock_valley_nw,                       //4
rock_valley_se,                       //5
rock_valley_sw,                       //6
turtle_rock,                          //7
void_tile,                            //8
water_left_bottom,                    //9
water_left_middle,                    //10
water_left_top,                       //11
water_right_bottom,                   //12
water_right_middle,                   //13
water_right_top,                      //14
water_middle_bottom,                  //15
water_middle_middle,                  //16
water_middle_top,                     //17
rock_s,                               //18
rock_e,                               //19
rock_w,                               //20
rock_n,                               //21
bush_left,                            //22
bush_middle,                          //23
bush_right,                           //24
tree_base,                            //25
tree_repeat,                          //26
tree_top};                            //27

const byte backblack[] PROGMEM = {8,8,0x7E,0x42,0x42,0x3C,0x7E,0x3C,0x3C,0x24,};
const byte backgrey[] PROGMEM = {8,8,0x1,0x1,0x1,0xC1,0x81,0xC0,0x40,0x0,};
const byte frontblack[] PROGMEM = {8,8,0x7E,0x66,0x42,0x38,0x78,0x38,0x3C,0x24,};
const byte frontgrey[] PROGMEM = {8,8,0x80,0x80,0x80,0x87,0x87,0x7,0x2,0x0,};
const byte leftblack[] PROGMEM = {8,8,0x3E,0x32,0x22,0x1C,0x1C,0x1C,0x1C,0x14,};
const byte leftgrey[] PROGMEM = {8,8,0x0,0x0,0x0,0x60,0x60,0x60,0x40,0x0,};
const byte rightblack[] PROGMEM = {8,8,0x7C,0x4C,0x44,0x38,0x3C,0x38,0x38,0x28,};
const byte rightgrey[] PROGMEM = {8,8,0x2,0x2,0x2,0x2,0x2,0x0,0x0,0x0,};


  int player_x = 70;    //cant get these to center
  int player_y = 40;    //cant get these to center
  int player_direction = 0;

int x,y; ///if 0 player spite will not move, -50,50 no tilemap

//////CAMERA//////
int camerax = -20 ;
int cameray = -20 ;
int xmax = -68;


void setup() {
  gb.begin();
  gb.titleScreen(F("test"));
  gb.setFrameRate(62);  ////////for sprite
  gb.display.persistence = false;
}

/////////PLAYER_MOVEMENT\\\\\\\\\

void loop() {
  if(gb.update()){
    if (gb.buttons.repeat(BTN_RIGHT,1));{x--;}
    if (gb.buttons.repeat(BTN_LEFT,1));{x++;}
    if (gb.buttons.repeat(BTN_DOWN,1));{y--;}
    if (gb.buttons.repeat(BTN_UP,1));{y++;}


if(player_x > 59 && camerax <  0 && camerax  > -52){player_x = 59;camerax--;}   
//value 59 equals player position on right when camera will start to follow
//value 0 and -52 equals camera boundary positions
else  if(player_x < 15 && camerax <  0 && camerax  > -52){player_x = 15;camerax++;}
//value 15 equals player position on left when camera will start to follow
//value 0 and -52 equals camera boundary positions
else  if(player_x > 59 && camerax <= 0 && camerax >= -52)camerax--;
else  if(player_x < 15 && camerax <= 0 && camerax >= -52)camerax++;   
 
 
      if(player_y > 28 && cameray < 0 && cameray >  -40){player_y = 28;cameray--;}
//value 28 equals player position on right when camera will start to follow
//value 0 and -40 equals camera boundary positions
else  if(player_y < 15 && cameray < 0 && cameray >  -40){player_y = 15;cameray++;}
//value 15 equals player position on left when camera will start to follow
//value 0 and -40 equals camera boundary positions
else  if(player_y > 28 && cameray <= 0 && cameray >= -40)cameray--;
else  if(player_y < 15 && cameray <= 0 && cameray >= -40)cameray++; 

      if(camerax > 0)camerax= 0;
else  if(camerax < -52) camerax = -52;
//value 0 and -52 equals camera boundary positions
      if(cameray > 0)cameray= 0;   
else  if(cameray < -40) cameray = -40;
//value 0 and -40 equals camera boundary positions
 
    gb.display.drawTilemap(camerax,cameray,tilemap,spritesheet); // draw the tilemap
//    gb.display.cursorY = 12; gb.display.println( player_x );gb.display.println( player_y );

 if(gb.buttons.repeat(BTN_UP,1)){
       gb.display.setColor(BLACK);{
    gb.display.drawBitmap(player_x,player_y,backblack);
       }
    gb.display.setColor(GRAY);{
    gb.display.drawBitmap(player_x,player_y,backgrey);
    }
      player_direction = 1;
      player_y = player_y - 1;
      if(checkcolision())player_y++;  // ADD by Summoner123 - If have colision on the new position regreat one Pixel
      }

     
    if(player_y <= 0){
      player_y = 0;}



    if(gb.buttons.repeat(BTN_DOWN,1)){
      gb.display.setColor(BLACK);{
    gb.display.drawBitmap(player_x,player_y,frontblack);
    }
     gb.display.setColor(GRAY);{
    gb.display.drawBitmap(player_x,player_y,frontgrey);
    }
      player_direction = 2;
      player_y = player_y + 1;
      if(checkcolision())player_y--;  // ADD by Summoner123 - If have colision on the new position regreat one Pixel
      }
     
    if(player_y >= 40){
      player_y = 40;}
 


    if(gb.buttons.repeat(BTN_RIGHT,1)){
       gb.display.setColor(BLACK);{
    gb.display.drawBitmap(player_x,player_y,rightblack);
    }
     gb.display.setColor(GRAY);{
    gb.display.drawBitmap(player_x,player_y,rightgrey);
    }
      player_direction = 3;
      player_x = player_x + 1;
      if(checkcolision())player_x--;  // ADD by Summoner123 - If have colision on the new position regreat one Pixel
      }
     
     
    if(player_x >= 77){
      player_x = 77;}


    if(gb.buttons.repeat(BTN_LEFT,1)){
       gb.display.setColor(BLACK);{
    gb.display.drawBitmap(player_x,player_y,leftblack);
    }
    gb.display.setColor(GRAY);{
    gb.display.drawBitmap(player_x,player_y,leftgrey);
    }
      player_direction = 4;
      player_x = player_x - 1;
     
      if(checkcolision())player_x++;  // ADD by Summoner123 - If have colision on the new position regreat one Pixel
      }
     
    if(player_x <= -2){
      player_x = -2;}
     
      ////////////PLAYER DIRECTION/////////////

 if (player_direction == 1){
        gb.display.setColor(BLACK);{
        gb.display.drawBitmap(player_x,player_y,backblack);
      }
        gb.display.setColor(GRAY);{
        gb.display.drawBitmap(player_x,player_y,backgrey);
        }
 }
     
      else if (player_direction == 2){
        gb.display.setColor(BLACK);{
        gb.display.drawBitmap(player_x,player_y,frontblack);
      }
        gb.display.setColor(GRAY);{
        gb.display.drawBitmap(player_x,player_y,frontgrey);
        }
      }
else if (player_direction == 3){
        gb.display.setColor(BLACK);{
        gb.display.drawBitmap(player_x,player_y,rightblack);
      }
        gb.display.setColor(GRAY);{
        gb.display.drawBitmap(player_x,player_y,rightgrey);
        }
}
      else if (player_direction == 4){
        gb.display.setColor(BLACK);{
        gb.display.drawBitmap(player_x,player_y,leftblack);
      }
        gb.display.setColor(GRAY);{
        gb.display.drawBitmap(player_x,player_y,leftgrey);
        }
      }
      else {  gb.display.setColor(BLACK);{
        gb.display.drawBitmap(player_x,player_y,frontblack);
      }
        gb.display.setColor(GRAY);{
        gb.display.drawBitmap(player_x,player_y,frontgrey);
        }
      }
}
 
}
     bool checkcolision() // Transformed it into a function
   {
    uint16_t i;
     for(i=0; i < gb.display.numcolision + 1; i++)
   {
    if(gb.collideRectRect(player_x,player_y,8,8,gb.display.solid[i].x,gb.display.solid[i].y,8,8))///changed player_x,y back to 8
    {
        //  if(gb.display.solid[i].spritecol == void_tile); //Do nothing because it's floor - This line not needed
          if(gb.display.solid[i].spritecol == bush) return true;
else      if(gb.display.solid[i].spritecol == port_noir) return true;
else      if(gb.display.solid[i].spritecol == rock_terrain_master) {gb.popup(F(" ""Rock"" "),1); return true;} //Return True if character have touched the wall
else      if(gb.display.solid[i].spritecol == rock_valley_ne) return true;
else      if(gb.display.solid[i].spritecol == rock_valley_nw) return true;
else      if(gb.display.solid[i].spritecol == rock_valley_se) return true;
else      if(gb.display.solid[i].spritecol == rock_valley_sw) return true;
else      if(gb.display.solid[i].spritecol == turtle_rock) return true;
else      if(gb.display.solid[i].spritecol == water_left_bottom) return true;
else      if(gb.display.solid[i].spritecol == water_left_middle) return true;
else      if(gb.display.solid[i].spritecol == water_left_top) return true;
else      if(gb.display.solid[i].spritecol == water_right_bottom) return true;
else      if(gb.display.solid[i].spritecol == water_right_middle) return true;
else      if(gb.display.solid[i].spritecol == water_right_top) return true;
else      if(gb.display.solid[i].spritecol == water_middle_bottom) return true;
else      if(gb.display.solid[i].spritecol == water_middle_middle) return true;
else      if(gb.display.solid[i].spritecol == water_middle_top) return true;
else      if(gb.display.solid[i].spritecol == rock_n) return true;
else      if(gb.display.solid[i].spritecol == rock_e) return true;
else      if(gb.display.solid[i].spritecol == rock_s) return true;
else      if(gb.display.solid[i].spritecol == rock_w) return true;
else      if(gb.display.solid[i].spritecol == bush_left) {gb.popup(F(" ""A bush!!"" "),1); return true;}
else      if(gb.display.solid[i].spritecol == bush_middle) {gb.popup(F(" ""A bush!!"" "),1); return true;}
else      if(gb.display.solid[i].spritecol == bush_right) {gb.popup(F(" ""A bush!!"" "),1); return true;}
else      if(gb.display.solid[i].spritecol == tree_base) return true;
else      if(gb.display.solid[i].spritecol == tree_repeat) return true;
else      if(gb.display.solid[i].spritecol == tree_top) return true;
 
      }
   }
    return false; // Return false if don't touch anything
  }     


I changed the sprites in this one as i was playing around ( and also the tilemap size) but you should be able to just take this code and copy it into your project if you need to - i've commented it the best i can to explain
Last edited by naed on Thu Aug 11, 2016 9:00 pm, edited 1 time in total.
User avatar
naed
 
Posts: 140
Joined: Tue May 31, 2016 3:18 pm

PreviousNext

Return to Programming Questions

Who is online

Users browsing this forum: Google [Bot] and 5 guests

cron