Page 1 of 3

Set pixel in the world, not on the screen.

Posted: Fri Aug 28, 2015 12:46 pm
by ZephaniahNoah
I'm having a hard time creating npc's and things that move in the world without inhibiting the players movement so that I can use the setPixel function. But what would make this a whole lot easier, and more interactive, would be a set pixel world function. For example: When you set a pixel in the world it would put it into the Program memory array and saveGraphics() would then display it. Maybe this is already possible without implementing a new function. Or perhaps there is a better way of doing it. What are your thoughts?

Re: Set World pixel function.

Posted: Mon Aug 31, 2015 9:54 am
by brad
Sorry for the late reply.

Could you give a little example of some code that you are working through?

Re: Set World pixel function.

Posted: Tue Sep 01, 2015 6:03 am
by ZephaniahNoah
I made two pictures. One with the pixel I wanted, And one without it. When I wanted the pixel I would activate setMyPixel()

Code: Select all

void setMyPixel(){
    long MyDataRed[700]PROGMEM={X}
    long MyDataGreen[700]PROGMEM={X}
    long MyDataBlue[700]PROGMEM={X}
}
X = My picture with the pixel I want to add. I got no errors but it didn't work. I think I need to add the pixel to the original Program memory arrays, but I get all sorts of errors when I try that. Perhaps you now how?

Re: Set World pixel function.

Posted: Wed Sep 02, 2015 11:30 am
by brad
I think I understand what you are getting at now.

Correct me if i'm wrong but are you trying to get a certain pixel set within an array which for example, would hold all data throughout a level? For instance, if you have a level that is 700 pixels wide and 8 pixels high, and your player is required to jump on a certain platform lets say. Once they jump on the platform, a key appears some where else in the level. So therefore you would want to set a certain pixel somewhere within the 700x8 pixel array so that when the player walks over to that section, the key is now displayed. Is that the sort of thing you're trying to do?

If so, unfortunately you can't modify the contents of PROGMEM during runtime, you can only copy data to it at burn time, and then all you can do is read it at run time. The reason for using PROGMEM is so that we don't use up all of the SRAM.

Here's a good page with some useful info on PROGMEM:
http://arduino.stackexchange.com/questi ... ng-progmem

Moreover, an atmega328 microcontroller has 32KB of program memory but only 2KB of SRAM. if each level is 700 pixels wide and you have red, green, blue and barrier components to them, you are looking at 700bytes x 4 = 2,800 Bytes or 2.8KB - If you made your levels smaller (say 300 pixels wide) and then pre-loaded SRAM with your level data from PROGMEM, you could then change whatever you wanted at run time. I.E. you could easily set or clear whatever pixel you wanted.

Re: Set World pixel function.

Posted: Fri Sep 04, 2015 12:54 pm
by ZephaniahNoah
Yes. You are correct. That's what I was trying to do. Man that sucks PROGMEM is read only. I kinda guessed that was the case because it wasn't letting me change it. Sorry if I was being too vague about the setPixelWorld thingy I was talking about. Let me go into more detail... What if you could create an overlay so that when you put a pixel in that overlay it displays as a pixel overlaying the world. So that instead of displaying it attached to the screen it displays it as if it were part of the world. I think this could work by checking the player's position and moving the pixel around the screen as the player moves making it look as if it's part of the world/PROGMEM. For example: I want a yellow pixel here in the world. Instead of using these top two maps and switching the player between the two I can just add the overlay (on the bottom) to the picture so that when the player moves over they'll see it.
Image
As I said I'm pretty sure it's possible and I'm working on it and it involves quite a bit of code and implementing it as another function in the DigiPixel libraries would make it a lot easier when setting multiple pixels. Sorry if I'm not using the right names for things or not explaining myself very well. I'll try to send you the code if I ever figure it out.

Re: Set World pixel function.

Posted: Sat Sep 05, 2015 9:50 am
by brad
It would certainly be easier to do this if all the level data was stored in SRAM because you can read from and write to it. So you might have an 'enemy' pixel located at the X, Y co-ordinates of 478, 4. You would just need to set pixel 478, 4 whichever color you wanted within the level data stored in SRAM, then when you're player eventually got to that section of the level, you would see that 'enemy' pixel.

Here is a youtube video of the super pixel bros game that I programmed using Swordfish Basic on a PIC microcontroller, it has 'enemy' pixels that appear on the screen when the player gets to a point that he can actually see them:


Here is some code (in Basic) that shows sending the data to the graphics arrays which would then be sent out to the LED's:

Code: Select all

Sub DrawGraphics()
    For x = StartColumn To (StartColumn + 7)
        GraphicDataOutGreen = 0
        GraphicDataOutRed = 0
        GraphicDataOutBlue = 0
        GraphicDataOutGreen = GraphicDataOutGreen Or LevelBufferGreen(x) 
        GraphicDataOutRed = GraphicDataOutRed Or LevelBufferRed(x)
        GraphicDataOutBlue = GraphicDataOutBlue Or LevelBufferBlue(x)
        
        ' this code will draw the bad guy on the screen   (red and blue = magenta badguy!)
        If BadGuyX = x And BadGuyY < 8 Then       ' only draw him if he is in the screen
           GraphicDataOutBlue.bits(BadGuyY) = 1
           GraphicDataOutRed.bits(BadGuyY) = 1
        EndIf
        
        ' this draws the player on the screen
        If PlayerX = (7 - (x - StartColumn)) Then
           If PlayerY <= 7 And PlayerY >= 0 Then   'ensure that we only inlude this info in our data IF THE PLAYER IS ON THE SCREEN VERTICALLY!
              GraphicDataOutRed.bits(PlayerY) = 1
           EndIf
        EndIf
    Next  
End Sub
I hope that helps, it's not arduino code but it's quite similar in its syntax

Re: Set World pixel function.

Posted: Mon Sep 07, 2015 3:57 pm
by ZephaniahNoah
Alright, thanks. I'll use the SRAM to store my map if I can't get my method to work. I would just go for the SRAM method right away but my map is 700 pixels wide and I don't want to remake it. Thank you for the help!

P.S. Can Swordfish Basic write code to an Arduino, or would I need a pic?

Re: Set World pixel function.

Posted: Wed Sep 09, 2015 10:07 pm
by brad
That is a big map! When I made Super Pixel Bros, each game map was just 120 pixels wide :)

Unfortunately, Swordfish Basic is just for the 18F series of PIC microcontrollers. I very much prefer coding in it rather than any other programming language that I have used but unfortunately it just does not have a big fan base anymore. There used to be a wonderful thriving community for Swordfish Basic and then it seemed to all die off...

Re: Set World pixel function.

Posted: Thu Sep 10, 2015 12:00 pm
by ZephaniahNoah
Shrinking community? Awe... That's disappointing :( Anyways I got my method to work! I can get hurt by my bad guy if touched by the side, and I can kill it by jumping on top of it. And for the whole reason I'm doing this, can make the bad guy move around in the world too! I'm just having trouble making him move back and fourth atm.

Re: Set World pixel function.

Posted: Fri Sep 11, 2015 8:47 pm
by brad
Any chance you can post your code so I can try it out?

Re: Set World pixel function.

Posted: Sun Sep 13, 2015 11:07 pm
by bitfogav
brad wrote:Unfortunately, Swordfish Basic is just for the 18F series of PIC microcontrollers. I very much prefer coding in it rather than any other programming language that I have used but unfortunately it just does not have a big fan base anymore. There used to be a wonderful thriving community for Swordfish Basic and then it seemed to all die off...
I think a lot of electronic/programming communities have died a little recently which is kind of sad :cry:
The few web sites I often check on regularly often don't change or get updated anymore.. But anyway I use my Digipixel with Swordfish Basic.. :D

Re: Set World pixel function.

Posted: Mon Sep 14, 2015 9:28 pm
by brad
bitfogav wrote:
brad wrote:Unfortunately, Swordfish Basic is just for the 18F series of PIC microcontrollers. I very much prefer coding in it rather than any other programming language that I have used but unfortunately it just does not have a big fan base anymore. There used to be a wonderful thriving community for Swordfish Basic and then it seemed to all die off...
I think a lot of electronic/programming communities have died a little recently which is kind of sad :cry:
The few web sites I often check on regularly often don't change or get updated anymore.. But anyway I use my Digipixel with Swordfish Basic.. :D
It is a bit sad bitfogav :) but always good to catch up with old friends now and again!

Be sure to let us know of any projects that you may have going :)

Re: Set World pixel function.

Posted: Fri Sep 18, 2015 6:42 am
by ZephaniahNoah
brad wrote:Any chance you can post your code so I can try it out?
Yea! Will do! Since I figured this out I've been filled with all kinds new ideas. Not quite finished yet though.

Re: Set World pixel function.

Posted: Tue Sep 22, 2015 5:31 pm
by ZephaniahNoah
brad wrote:Any chance you can post your code so I can try it out?
Well I guess I have to give you the code now. After creating a button that opens a door I had begun adding more things. And after the project reached over 17,000 bytes the digiPxel.getPixel function completely stopped working. To be sure that this was the problem I deleted some code so that it would only be 16,726 bytes and the digiPxel.getPixel function started working again. Do you know of any way to fix this? I don't want to have to make my world smaller.
Image
In the red hut you get on the purple rope and press down to slide down. It does this by checking for purple barrier at (4,3). But it's not working. I made a hole leading to the lava where it checks (4,3) using getPixel to see if it is equal to red barrier so it will kill the player. But that doesn't work either, because it uses the digiPxel.getPixel function. IDK what's wrong. :(
EDIT: Also I got rid of the bad guy. But he, and others, will probably be back later. And remember, I use Arduino 1.0.6...

Re: Set pixel in the world, not on the screen.

Posted: Fri Sep 25, 2015 7:11 am
by brad
Have just downloaded it, will see about giving it a test run as soon as I find some time however I need to fix my Arduino first because I needed to borrow some of the female headers on it :)