|
Taiko
|
 |
« Reply #360 on: May 18, 2011, 09:04:54 AM » |
|
Cool! I'll check him out.
|
|
|
|
|
Logged
|
|
|
|
|
Triplefox
|
 |
« Reply #361 on: May 19, 2011, 12:45:18 AM » |
|
Today I added manipulation of multiple tile layers to my level editor. The tiles get converted to box2d bodies at runtime, the idea being that you can differentiate "mobile" bodies and "fixed" ones by using different layers.
Tomorrow I am going to put in the single most complicated feature of my level editor: Adding/removing joints of various types, which can attach to the layers.
Don't look forward to it, but I have a plan to keep it simplified and in preset-land, not "omg sliders everywhere."
|
|
|
|
|
Logged
|
|
|
|
|
Prinsessa
|
 |
« Reply #362 on: May 19, 2011, 01:03:49 AM » |
|
Today I added manipulation of multiple tile layers to my level editor. The tiles get converted to box2d bodies at runtime, the idea being that you can differentiate "mobile" bodies and "fixed" ones by using different layers.
Tomorrow I am going to put in the single most complicated feature of my level editor: Adding/removing joints of various types, which can attach to the layers.
Don't look forward to it, but I have a plan to keep it simplified and in preset-land, not "omg sliders everywhere."
Sounds like a good situation for a linked list to be used, at least. My game is also a Box2D game, for which I have programmed a custom level editor. My layer system is quite smart, in my own opinion, haha. Every type of object belongs in a 'layer priority group'. Different types of objects can belong to the same group. Objects belonging to group 1 can't be placed in layers below objects of group 0, and can't be placed in layers above those of group 2, for example, but objects within the same group can be freely moved above or below each other in the layer list. This makes it very easy to make sure that objects that have to be drawn in a specific order are drawn in that order, without any errors, as they're not possible to make. No type of object can be placed behind a background house, and no background house can be placed in front of anything else; they're automatically moved to the top layer of their group when they are added to the world, and can then be moved up or down.
|
|
|
|
|
Logged
|
|
|
|
|
Dacke
|
 |
« Reply #363 on: May 19, 2011, 03:42:53 AM » |
|
compile and run this in c++ #include <stdio.h> #include <time.h> #define O_O const char* #define __ if #define ___ while #define OO void
O_O O[]={"$%&'(#)*+,-./0#1234567#)89:;<=>#","0?@ABC5D#EFBG#", "HIJBK#HILBM#HINO-PB#HIFBQ#HIRS#HIATU-VB#","WXY=Z.[#\\]^_`#abc'Rd#efg*h^ij#k*+l-mInd#opBqrC5D#" ,"sJBK#sJBK#HIJtIJ#uBK#HIJtIJ#uBK#","WXY=Z.[#\\]^_`#abc'Rd#efg*h^ij#","\n","I;y.;","21","-,.?29;.-",",1","41*;", "G1+","521)",",8;",".+4;-","?2<","-1","<1","W","_",":+44","=1337,3;2,y-",")8?," ,"Wy3",",8725729","1:",")1+4<2y,","9;,",",87-",":.13","?2'","1,8;.","9+'","6+-,", ")?22?",",;44","'1+","81)",":;;4729","Y1,,?","3?5;","+2<;.-,?2<","R;*;.","9122?", "97*;","+0","4;,","<1)2",".+2","?.1+2<","<;-;.,","=.'","-?'","911<>';","?","47;", "8+.,","I;y*;","521)2",";?=8",":1.","4129","G1+.","8;?.,y-",">;;2","?=8729",">+,","G1+y.;", ",11","-8'","7,","W2-7<;",");",">1,8",")8?,y-","91729","12","I;","9?3;",");y.;","04?'","_2<", "7:","?-5","3;","Q111111118rrr","2;*;.","Y7*;"};OO _0(float _){clock_t _O=clock() +_*CLOCKS_PER_SEC;___(clock()<_O);}char _O(char _){__(_=='\n'||_==' ')return _;return -(_-'#'-'}');}OO __O(O_O _){___(*_){putchar(_O(*_++));fflush(stdout);_0(.06);}}OO _(O_O _){___(*_){__O((O+6)[*_++-'#']);__(*(_-1)=='#')_0(1);else __O(" ");}}int main(){_(*O);_(*(O+1));_("#");_(*(O+2));_("#");_(*(O+3));_("#");_(*(O+2));_ ("#");_(*(O+2));_("#");_(*(O+4));_("#");_(*(O+5));_(*(O+1));_("#");_(*(O+2));_("#");_(*(O +2));_("#");_(*(O+2));_("#");}
(i was quite bored) I really loved this so I ported it to Python, with the goal of making it even more compact. (But far less obfuscated obviously!) Your version is much more interesting, but at least I learned some new things about Python. Run as Python: import zlib, base64, time, sys for c in zlib.decompress(base64.b64decode("eNrtlL1uhDAQhHueYjq6e4erTjRJeUppYMEOxnvyzyHePmvgEpGT0kSK\ ckqoLM96/O2OxZlKT3CMEL1yPfmAyLB8JRQvnDA4nhA1wSdLAcq1CIyWUaE4okvWouFxNHEkF8uASauIqhzljHGDcT24W50mTrZ\ 1ZURPMasBnedRHGew\XODRpxlFhdcUIiblnEIksZ/lrBaIbNoR2exZnDhGhVENtOjJtUIeM11RPNE1u3F26M11q7hgJ1iByPstT\ 26v+OSgPIvl0m1Lgfxauyt7v7vx814JapYVt/VMe2FpR642tDjrdPMtzlQKZ561A6lGbxPp2OdpW84tyww9NCmfx1wTCWWj8zDq\ FBc1BxlZktRzzjBjGFEqF0xLmAi1uK6B5p\RuLj0vKckUzvQRd6/GlXJaHsjawMVunkcRTLfAqzBASu8SesQYHhD5mbdPHw6HPf\ QX0l2j7vNGcfpO/S950H/zZ/KP/BPIb0L/fvg=")): sys.stdout.write(c);sys.stdout.flush();time.sleep(0.06) if c=='\n':time.sleep(0.94)
|
|
|
|
« Last Edit: May 19, 2011, 04:14:21 AM by Dacke »
|
Logged
|
|
|
|
|
Dacke
|
 |
« Reply #364 on: May 19, 2011, 01:28:03 PM » |
|
Okay, so I went a bit overboard with this. I wrote an image to ascii converter in python to make it work. Run as Python:import zlib as a, base64 as b, time as c, sys as d e=1;f=a.decompress(b.b64decode("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")).split("&");l='' d.stdout.write(f[e]+'\n');g='\n' for h in f[0]: if h==g==l:d.stdout.write(g+f[e%5+1]+g);e+=1 d.stdout.write(h);d.stdout.flush();c.sleep(0.06);l=h if h==g:c.sleep(1)
|
|
|
|
« Last Edit: May 19, 2011, 01:45:02 PM by Dacke »
|
Logged
|
|
|
|
|
Triplefox
|
 |
« Reply #365 on: May 19, 2011, 01:57:09 PM » |
|
Sounds like a good situation for a linked list to be used, at least.
My game is also a Box2D game, for which I have programmed a custom level editor. My layer system is quite smart, in my own opinion, haha. Every type of object belongs in a 'layer priority group'. Different types of objects can belong to the same group. Objects belonging to group 1 can't be placed in layers below objects of group 0, and can't be placed in layers above those of group 2, for example, but objects within the same group can be freely moved above or below each other in the layer list.
This makes it very easy to make sure that objects that have to be drawn in a specific order are drawn in that order, without any errors, as they're not possible to make. No type of object can be placed behind a background house, and no background house can be placed in front of anything else; they're automatically moved to the top layer of their group when they are added to the world, and can then be moved up or down.
That's not the problem at hand. I already have layer drawing and ordering in place so I can draw them reasonably well. Everything is generated from tiles for simplicity; it was kind of a pain to render tilemaps so that they line up and rotate correctly with the physics objects, but that was done, and done weeks ago. The only feature of core gameplay that I haven't really tested is applying bitmasks to different layers so that they can go above/below each other. But to get to the problem. It's all UI: the user has to know which layers they're connecting when they work with joints, since each layer turns into a body at runtime. If I do this wrong it will be too confusing for public consumption; just having layers, by themselves, presents a usability problem. This is why I used tiles to begin with; it makes that stage of construction easier, since things will all line up neatly. That said, I do want to have an explicit notion of joints and layers, since they open up so many possibilities. So my solution is: Stick to a small, fixed, pre-ordered number of layers(right now 4, maybe more in the future). Adding a joint is in three steps: 1. Place start of joint 2. Place end of joint 3. Dialogue pops up: Which layers are being connected, and what kind of joint is being made? Then you see a placeholder graphic for the joint appear on the map saying "1-->4" or whichever layers you've connected. I haven't finalized how I'm setting the mass of layers yet, but I will probably end up using a per-layer control, with the first layer always being fully static, since I use that body for the borders of the map as well. Combining mass, masking, and joint variations should make it possible to do some interesting over/under/rotation situations, but the biggest issue is in making sure that the user naturally ends up with valid/interesting combinations. One idea I might run with is having not just a preset _number_ of layers, but preset _classes_ of layer: "Ground", "Low/Medium/High Obstacle", "Tall". That would greatly simplify things.
|
|
|
|
|
Logged
|
|
|
|
|
sublinimal
|
 |
« Reply #366 on: May 20, 2011, 11:28:45 AM » |
|
 Fibonacci spirals with a random palette generator!  Recursion trees!  A futuristic faux-3D landscape that's actually half of an ellipse! Could make a neat setting for a racing game. Okay, nothing impressive, but at least I did it all without any help. These damn .gifs don't seem to move smoothly at all, although they only have like 1 ms delay between the frames.
|
|
|
|
|
Logged
|
|
|
|
|
Dacke
|
 |
« Reply #367 on: May 20, 2011, 11:34:46 AM » |
|
That's really neat! The tree animation is lovely.
|
|
|
|
|
Logged
|
|
|
|
|
beyzend
|
 |
« Reply #368 on: May 21, 2011, 12:05:01 PM » |
|
|
|
|
|
|
Logged
|
|
|
|
|
Pineapple
|
 |
« Reply #369 on: May 21, 2011, 01:04:54 PM » |
|
 Perlin noise for terrain generation
|
|
|
|
|
Logged
|
|
|
|
|
xhunterko
|
 |
« Reply #370 on: May 21, 2011, 02:33:56 PM » |
|
Currently, the apocalapse.
|
|
|
|
|
Logged
|
|
|
|
|
Pineapple
|
 |
« Reply #371 on: May 21, 2011, 05:47:10 PM » |
|
Working on improving the RNG behind my perlin noise. This came up: 
|
|
|
|
|
Logged
|
|
|
|
|
Ludophonic
|
 |
« Reply #372 on: May 21, 2011, 06:09:17 PM » |
|
I previously rewrote my OpenGL stuff on Windows to be OpenGL 3.2 Core Profile. Now I'm backporting that to work under OpenGL 2.1 + extensions on OS X.
|
|
|
|
|
Logged
|
|
|
|
|
Prinsessa
|
 |
« Reply #373 on: May 22, 2011, 09:19:06 AM » |
|
 Fibonacci spirals with a random palette generator! I had a go too! 
|
|
|
|
|
Logged
|
|
|
|
|
mcc
|
 |
« Reply #374 on: May 22, 2011, 09:39:11 AM » |
|
|
|
|
|
|
Logged
|
|
|
|
|
teomat
Guest
|
 |
« Reply #375 on: May 22, 2011, 09:40:38 AM » |
|
A highlevel lua wrapper and object (de)serialization in c#/mono. The lua c-api is not as hard to work with as I initially thought and this is actually fun :D
|
|
|
|
|
Logged
|
|
|
|
|
teomat
Guest
|
 |
« Reply #376 on: May 24, 2011, 05:43:16 AM » |
|
Trying to get my Lua serializer to not die when it encounters circular dependencies. Right now it does this: Entity = {
__type = "mater.lua.tests.Test+Entity, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = 58225482;
a = 16;
s = 50;
pos = {
__type = "mater.lua.tests.Test+Position, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = 54267293;
x = 9;
y = 8;
e = {
__type = "mater.lua.tests.Test+Entity, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = 58225482;
a = 16;
s = 50;
pos = {
__type = "mater.lua.tests.Test+Position, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = 54267293;
x = 9;
y = 8;
e = {
__type = "mater.lua.tests.Test+Entity, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = 58225482;
a = 16;
s = 50;
pos = {
__type = "mater.lua.tests.Test+Position, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = 54267293;
x = 9;
y = 8;
e = { a few hundred times and then crashes because of a stack overflow. I kind of know what I'm going to do, but I'm not sure how. Edit: Wow, done already  Entity = {
__type = "mater.lua.tests.Test+Entity, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = -1574713792;
a = 16;
s = 50;
pos = {
__type = "mater.lua.tests.Test+Position, mater.lua.tests, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
__hash = -18553600;
x = 9;
y = 8;
};
};
Entity.pos.e = Entity
__main = Entity; I didn't think I'd be so fast. I guess I'll play some witcher 2 now 
|
|
|
|
« Last Edit: May 24, 2011, 06:11:50 AM by teomat »
|
Logged
|
|
|
|
|
increpare
Guest
|
 |
« Reply #377 on: May 24, 2011, 05:54:32 AM » |
|
Working on a puzzle-style game. Its logic is discrete, but I've allowed a lot of continuous animation-related stuff to seep in. I find myself wanting to run simulations, so I'm trying to pull the two bits apart. It's a bet of a messy task!
|
|
|
|
|
Logged
|
|
|
|
|
_Tommo_
|
 |
« Reply #378 on: May 24, 2011, 06:12:49 AM » |
|
You have to mark the object that were already encountered in a single serializing session, I believe. It's the deserializing that is pretty damn ugly. In what order are you going to recreate objects that have circular dependencies? Good luck with it 
|
|
|
|
|
Logged
|
|
|
|
|
teomat
Guest
|
 |
« Reply #379 on: May 24, 2011, 06:17:56 AM » |
|
You have to mark the object that were already encountered in a single serializing session, I believe. It's the deserializing that is pretty damn ugly. Already done :D I actually did deserialization first and I feel like it was even easier. Well, I can't de/serialize delegates and I didn't test it that much yet, but I think it's good enough for what I need. In what order are you going to recreate objects that have circular dependencies? Good luck with it  I simply serialize them as I find them and keep a map with their hashes as keys and table locations as values. Then whenever I encounter an already serialized object I add the it to a list with all the other missing references. Once the main object is serialized I dump those into the file and everythig is fine. Edit: typo
|
|
|
|
« Last Edit: May 24, 2011, 06:25:23 AM by teomat »
|
Logged
|
|
|
|
|