Rear-ended at a stop light :(. Not the best way to end Thanksgiving weekend.
About this blog
Entries in this blog
Rear-ended at a stop light :(. Not the best way to end Thanksgiving weekend.
Then I went looking through my own journal, and got REALLY depressed. I'll try to keep it short, but here's why (or scroll down, there may be pictures) (actually, turns out you don't have to scroll down to see pictures).
I've been trying to pick up my programming stuff again, and have actually been kind of excited about it. I'm still using the SnakeEngine (Scarlet), and I'm still trying to make "lots of little" games rather than doing something big. That way I can actually accomplish something and learn a lot without wasting a lot of time with a bad design. My unstated goal was to make one game for each version of the SnakeEngine, apply lessons learned, and move on. So here's what I've done so far with each version:
[Garter]: Squarediana Jones (for Ravuya's One-Button One-Week Contest)
[Ringneck]: Aliens What Which Fall From the Heavens and Drop Bombs or Missiles or Something
The Space Invaders game was 2006. Clearly things are going exactly as I had planned!
Now, I've done some stuff with Scarlet, like that dinosaur thing, but that's not really a game (even if you can walk around and shoot missiles), although it is based on and idea I had I hope to make someday.
More recently I've had another distraction from making actual games: a memory manager. I haven't really spent a lot of time on it, but I do have something that works as a bare minimum, and it was kind of a fun project. Also, I'm using it in my current game project: Missile Command!
I'm not losing, I just don't have anything to defend yet.
The actual title will probably be "Three Bases What Which Shoot Missiles at Other Missiles to Protect Six Cities From Them". Or something like that.
At any rate, the game shouldn't take much longer to finish, and will hopefully be more fun than my space invaders game, where the scores were more related to your tolerance for the tedious rather than your skill.
But! What comes after that is (even) more interesting! A complete rethinking of everything up to this point! I know that sounds crazy, but if we look back to the beginning of the SnakeEngine (ALLLL the way back to 2005) I wrote:
Original Post by Me
...SnakeEngine would probably be better named as "The Snake Experiments", meaning I'm not caring too much about backwards compatibility between versions...
It was all supposed to be basically throw-away code between each version. I go on to say:
Original Post by Me
[The Samus sprite engine] uses Garter (I'll probably try to de-couple those two, so I can use it without changing it with future engines, which should be trivial)
To show how far away from my original plan was, the Samus sprite engine is now part of SnakeEngine!!
So anyway, I'm going to do some serious re-evaluating of my process, tools, environment, pretty much everything. And this isn't to say I'm going to scrap all the code I've written in the last 900 years, because it's not all bad. In fact, most of it will probably live on for a while in some form or another.
In the end, however, I'm not actually depressed. Something has re-sparked my interest and I want to make games again. I've been thinking a lot about them, in fact, and I have over 5000 game ideas in my head right now.
Finally, I realize many of my posts here are about how I'm going to do stuff, but what can I say, it helps to write out my thoughts, might as well let people read them :P. Thanks!
Stop using the word "boffin" in all your tech articles. It's annoying and there are less stupid words out there.
atmosphere towards the chaos below, echoing off the distant mountains as
they collide into the earth with absolute destruction. All the dinosaurs, in a
state of panicked fright, come together in hopes of salvation, as impossible as
it seems, from the merciless rampage the sky has delivered. During this time
of sheer terror and destruction, one dinosaur has risen from the turmoil to
lead the others on what may be their final journey. All dinosaur kind recognize
their champion, and as one they bow in humility before Stegosaurus: the smartest
and most powerful of the dinosaurs.
Fortunately each of those terminals (including the ones on the other desktops) is running on a different computer. I love the summer, lots of spare cpu cycles around :).
So today I finished my last recitation I will ever do, after I finish grading the last assignment, I will no longer be a GTA. I'm not sure what all to say about it, I was pretty scared to do it at first, but in the last two years I think it has been really good for me. Both it and grad school has really changed me, for the better, and while some people may say I'd have been better off just getting a job and making some money, it's been an experience I'll never get anywhere else. And as of next Monday, I'll be done with (school) classes for the rest of my life, and I'll just have to finish up my thesis over the summer. It's kind of weird, and it hasn't really hit me yet, because after high school I went to a community college, then to university, and continued through grad school, for a total of eight years of college. Yeah...I didn't exactly rush through. So school has been the only thing I've known for pretty much all my life, and for the last two years grad school has bascially been my life, I don't know what 'free evenings and weekends' means anymore. So, long story short, woohoo!
This of course means I am currently looking for a job, but maybe I'll make a post on that later.
In other, more interesting news, my car project has basically been put on hold for two reasons: time (obviously), money.
Now about the money, as soon as I know if I have a job I'll be good, as I have plenty saved up to last through the summer. I just don't like spending money when I don't know when my next paycheck is gonna be, ya know?
It's status, however, is that the last thing I received in the mail was my intercooler (a big friggin' intercooler at that :) ). I had also ordered some turbo headers, which I think I mentioned before, but they should be at my Dad's (where I'm sending all my stuff, as my studio apartment doesn't work well for that) by now, which is totally awesome. So really, I should have all the parts now :D.
I've been thinking/talking to people, I may need to get new pistons, because mine have 175k miles on them. Now, as it turns out, pistons aren't cheap. There exist cheap ones, but they will probably break when boosting. So needing pistons got me thinking, if I'm gonna change them, I seriously might as well bore it out, not the OMG MAKE BIGGER MORE POWER kind, but the seriously everybody does that when rebuilding the engine, as it gets rid of warping and defects which happen over time. The standard bore is '30 over', meaning from a bore of 4.000in, to 4.030 in, and my 302 goes to a 306 (and I gain like a whopping 5 free hp out of it). Then I also got to thinking, this guy on the mustang forums sells stroker kits cheap (name brand, he actually represents a reseller company). This would bring me up to a 331 or 347, and when stroking, you get monster torque. My main concern with this is the horsepower I'd be attaining would easily bring me to block-splitting territory if I wasn't real careful with the boost. So I've decided that because I am (and will be) using the stock block, a simple bore should be fine. The stock block, by the way, can 'traditionally' handle up to 450 wheel horsepower and be ok, get above that and you're on "borrowed time". Although I've heard of people with up to 600hp making several 1/4 mile runs with no problems, that requires some seriously good tuning.
Which brings me to tuining. I think I'm definately going to have it professionally dyno-tuned. I know nothing about tuning, my brother hasn't done it before, this is a little different than turning the screws on the side of a carburator, this will be a fuel injected twin turbo v8. For the safety of my investment, I'll leave it to the professionals.
My OTHER problem is what to do while my car is out of commision (which will surely be a while), which is another reason I haven't really started yet. Idealy, I get a job, and then I buy some dumb daily driver and finish my car, but again, I don't know how much money I'll have lying around to do that sort of thing. Fortunately my brother has a Dodge Stratus our cousin gave him, which is a real pos, but it runs. So I guess I'd drive that for the time being.
Oh yeah, I may also be buying another turbo, we have one good one, but the others need rebuilt, which my brother and I also have no experience doing, and I'd rather not have a turbo shatter on me.
So yeah, the car project hasn't stopped, just have a lot going on right now.
More details (if you care) in previous journal entries:
So I have still been working on my car, although mostly in research and parts gathering. Having only a few hours of daylight off on the weekends from school, I don't have much time to do actual work on it. Which so far has been ok because I don't have most of the parts anyway. But today marked the end of phase 0!!
Phase 0 was to simply fix what was really wrong with my car (and without fixing would make souping up my car even more pointless), this included fixing the frame (the big one) and the sway bar. Long story short, Mustang + bald tires + ice + offramp = bad. Hit a guard rails, messed up the front a bit and bent the frame an inch or two. Anyway, a while back I actually went and got that fixed for a reasonable price (comparatively). Just fixed the frame though, left the cosmetic damage as is. Also didn't have them fix the sway bar, I figured I could do that myself and didn't want to pay for it.
So I made an order to Summit racing the other day, and one of the parts I got was a sway bar bolt. With my brother's help (or rather, with some help from me for my brother), we fixed it (see if you can spot the problem we had):
Now it doesn't clunk horribly whenever I make left turns or go over bumps.
In addition to those things, I also ordered some hatch struts off ebay and fixed that too, so now I don't have to hold up my hatch with my head whenever I get groceries!
Also from Summit, I ordered:
Push rod length checking tool (so I know what size pushrods to buy)
Gaskets (TONS of gaskets)
Spark Plug wires
Cam kit (camshaft, valve springs, lifters, timing chain)
Fuel Pump (255lph)
Also, from B&G Turbokits I bought custom headers specifically made for T-3 twin turbo 5.0 projects, so that works out so I don't have to do any fabrication of my own (which I don't know how).
Previously I also bought a mass air adapter so I can complete that.
Basically, the only big things I have left are an intercooler (which I found one I like, and will probably order this week), and figure out how to tune the pos. I have two choices there: 1) Have a shop dyno-tune it for me 2) buy a TwEECer and do it myself.
The advantage of 2 is that I can do it multiple times without paying more, the downside is I have no idea what I'm doing, and would seriously need a base program. Having a shop do it would probably get it done right, but cost about as much as a TwEECer, and if something changes I have to go back in. So still not sure there.
Anyway, that's where I am, no more power at the moment, but progress nonetheless.
This is the car, btw:
I added a small amount of functionality to Scarlet, basically you can turn on and off Ortho2D mode now, which actually isn't something I've really used before.
I also made it so all texture entities (including sprites) are use display lists now. I didn't at first because I was unsure of the performance gain I would get because everything is basically 2 triangles with a texture (It's a 2D engine, remember). Well, it wasn't that hard to set up display lists and I got a pretty good performance gain out of it, so I guess it was worth it.
More and more I'm becomming unhappy with the tiling features of SnakeEngine. It was a bit of a hack to get working, a bit of a more hack to get working in ortho mode, and I think it's slow. I may end up rewriting the whole thing. After fixing a couple bugs, it isn't so bad to use, it didn't take long to get up a tile tester using it:
Yeah...I need to work on my art skills.
This is basically just to view how the tiles fit together and tessalate, I figured it's be easier to write this than to paste it together in Gimp. It was.
Unfortunately I found that while I could write a tile game using SnakeEngine's built in tile stuff, it's more trouble than it's worth. It just isn't powerful enough. So for now I guess it's good for backgrounds and stuff, but not much else.
Fortunately school starts up next week so I won't have any time for this now that I'm a little motivated to do something... yeah...
I mean, this is a development journal. TOday I thought about some stuff. It was the best day ever.
So yeah, not a lot of progress, still just spheres, lights, and reflection. But you can make some cool images that way.
Speed is still slow, this image (1600x1200) took ~58 seconds.
Later on I hope to get some sort of anti-aliasing in place, I think that would make it look a lot nicer. Next though I'm going to implement transparency (and refraction, of course), and triangles. This, with some modification to the file loader, should get it to the point I had my C++ version at as far as it's visual capabilities go. The C++ one also had bounding sphere support, but I'll worry about that later.
1. Because I haven't really done much with java, other than little programs here and there. The largest thing I've done in it was when a friend and I implemented Tetris, and then a genetic algorithm to play Tetris, in it. Sorry, it had no GUI. We could spit out an ascii drawing of the board if we wanted to though.
2. I like ray tracers. I've been itching to trace some rays lately. I also would like to learn Swing better. This seems like a good mix. Games are fun too, but then you have the pressure of being "done" some day. With raytracers, you just get some diffuse light on spheres and you good. Everything else is "extra". Ok, so any self respecting raytracer will have specularity and reflection, because otherwise what's the point.
Why Java, you should use C++.
I've done a ray tracer in C++. Originally for a class at my uni, I developed it in C++ on Linux using Qt for the GUI. It was a lot of fun. If you look at my old journal entries you can see the development of it. I have also ported it to Windows, though I couldn't get Qt compiling correctly here, so it's just command line. I was going to start a new one anyway, without a deadline, and try to make it truely extendable. This is because there was all sorts of things I wanted to implement but didn't get the chance to, and I think it will be easier and more fun to experiment with a more moddable design from the start. Figure why not try Java, with all it's cool GUI and Threadness and 1.5ness (I haven't actually done anything in Java since 1.5 came out).
Also, I think it will be a challenge.
So, what's first? Achieve C++ speed. Or at least close enough.
Right now I have the basics in place, and can render this image:
In actuality, I also have reflection in place, but for my purposes I'm leaving it out. I have it set up (scene files) to render that exact image in both my java implementation and my C++ implementation.
Giving the render thread maximum priority, the java raytracer (JRT) finished that in ~980ms. Slooooooowwwwwwwwwwwww........
C++ verion (CRT) did it in 390ms. Better (not exactly real-time either...).
But that wasn't totally fair, CRT has bounding sphere support, so, turn that off: 312ms. Doh. But of course it's faster...THERE'S ONLY 4 SPHERES ON SCREEN (and 3 lights, FYI, though bounding spheres don't affect those)! The bounding sphere's aren't gaining anything. But I'll keep it off until JRT get's culling methods too.
So much of my problem is, as I implied, I'm not a Java programmer. And for efficiency, I don't know how best to set up classes (OMG EVERYTHING'S A CLASS!). I would like to improve speed, but keep the understandability and extendability of my code. First thing I'm doing is I'm going to remove as many "new"'s as possible. Although passing everything by reference will take a bit of getting used to. So, that's what I'm off to do now.
I've been bidding on crap all week and been getting out bid at the very last second on everything, and usually higher than I want to go anyway (I've been watching, and watch myself get sniped, and do nothing because most people on ebay are retarded and will pay any price because "if it's off ebay, it must be a good deal!").
So I finally won some cylinder heads for my car!!!!!!!!!!!!!!!!
GT-40p's to be exact, off a 5.0 explorer.
See, here's the deal:
Mustangs stopped getting the 5.0 (302) in 96, when they went to the new 4.6 (which is still used today). Explorers/Mountaineers got it until 98 or 99 or something (don't know exactly off the top of my head). Anyway, 96 is when emmissions got more strict (which is why the Mustang got a new engine finally), but the Explorers weren't ready for a new engine (I have no idea why this is exactly, I guess they didn't want the 4.6 in them or something), but the current 5.0 wasn't up to standards, so they had to change some stuff, namely the cylinder heads and the intake. These were based on their previous GT-40 line of stuff, which is very similar to what's used in the Cobra engines.
Anyway, there's a bit more to it than that, but the point is they are better than the stuff the 5.0 mustangs (and older 5.0 explorers) had, and therefore make them the junkyard upgrade of choice.
I can't remember if I mentioned this in a past entry, but I also got an Explorer upper intake from a junkyard, which means now I need to get a lower >_<.
See, I'm pretty excited about this, because the Mustang's 5.0 has three serious bottlenecks: the crappy intake, the crappy cylinder heads, and the crappy headers. Now cylinder heads are basically the single most expensive thing you can replace on an engine (as far as just the parts go, and we're talking replace, so not counting superchargers), so I figured I'd never get to upgrade that (while in school), and just upgrading any one of those three bottlenecks is nearly pointless, you really have to do all three for a noticable gain (for it to be worth it anyway). So now I have some cylinder heads (hooray!), and an upper intake. Now if I can just snag a lower intake I'll basically be set.
What about the headers? Well, remember I'm going to twin-turbo my car, right? So I'll worry about those when I get to that point. Basically we'll stick some shorty headers on backwards, run them through the turbos and then out the back. This is going to be an enormous pain, but it brings me to my next bit of news.
My Dad spotted in Craig's list last weekend an ad for a Mustang parts sale. Basically everything I've ever wanted, namely the last item on the list:
Bucket full of turbos and spare parts $50
I nearly crapped myself when I saw that.
So long story shorter, remember how I already have one turbo ready? Well, now I've got 3. And enough parts to build at least 2 more. Now only two of these are really any good, but well, two works out well for a twin-turbo system.
I also picked up some mass air stuff, so now I just need an ECU (been outbid on like 3 already :( ) and I can convert from speed density to mass air!
So yeah, fun stuff.
In other news, I've been working a tiny bit on Squarediana Jones (no memory leaks, hooray!), so here's a pic that looks nearly exactly like my old ones but trust me it's better:
Now people will look in my journal, see that screenshot and think everything I just said has anything to do with it :P
OMG I WON AGAIN!!
I won a bid on a lower GT-40 intake!!!!!!!!!
Everything is comming together!
With any luck, by mid-next-month I'll have some new parts installed on my car!
Not sure what to expect, I think about a 40hp gain is a bit optimistic, but possible.
And if anything I ordered is messed up or not what they said it was, I'm going to jump out my roof and set my house on fire. And I live in an apartment building.
I did get rid of all of them in Scarlet...sort of, but it turns out I had some strange stuff going on in my Glober (my huffman compressed file archiver) stuff, which Scarlet uses so I can load sprites and textures from Glob files as well as normally. I didn't see this in Car That Drives to the Right because I wasn't reloading stuff from a file all the time, just creating and deleting missiles, who's textures were stored in the TextureManager guy, so it was only loaded once.
I found it in Squarediana Jones because I was having it load the level from a file all the time.
So using CarRight as a testbed again I went out looking and found 3 or 4 really subtle things. I wrote the Glober stuff in 04, so I'm really glad when I wrote it I had just read The C++ Programming Language and had started on Code Complete, because while it obviously wasn't perfect, the code was super easy to look through and see what was going on.
So I did end up finding everything, and now I can create and delete missiles all day long, and load and close compressed files all day long, and NO MEMORY LEAKS!!! HOORAAYY!
In other news, I'm obviously a big Metroid fan, but not even I would buy this:
Sealed Super Metroid on Ebay
I mean holy crap, $229.99, and it has a bid on it! Money to burn I guess.
I am however bidding on an original Metroid with box and Instructions (not sealed :P). I bought the original brand new myself, but I did it later when they had the 'Classic' series out, so I have the yellow box and label, and for completions sake I think I need the Silver Label version. I know, I complain about the original, and claim to not really like it that much, but meh. While I have a collection a lot of games, the Metroid games are the only ones I really collect. Ya know?
There's also a really cool Zero Mission (right up there with Super Metroid) poster up, it's pretty cheap right now, but they want 15 bucks for shipping, and I've been spending enough money as it is, so I think I'll have to pass :(.
What I ended up doing was breaking down Scarlet and sort of starting over, except most of the code was already written. As I slowly rebuilt it I carefully went over every class already written, checking things like copy constructors, desctructors, and anything else where weird stuff can happen. I did end up creating a few copy constructors, they were all for classes with just primitives in them (not my memory leak problem). The only major thing I did was make it so Scarlet is no longer a singleton class. Fortunately the only things I've done with Scarlet are Car That Drives to the Right, and a skeleton framework for Squarediana Jones, so refactoring them was easy.
When I finally got back up to the Sprite stuff (where the crashing problem was happening), I started it up and what do you know... no problems.
Now, this is with the exact same sprite code as before, I mean it was literally the same file as before, just copied from my bkp directory to my working directory. This is how I know there was a mutant vortex of impossibility.
I'd also like to note that before rebuilding Scarlet, I did to a clean build and all that other fun stuff, so no sucky .o files were lying around causing things not to fix themselves or whatever.
So this got me back up to the point I was at when looking for the memory leak.
Using CarRight as a testbed, I re-began my search, and guess what... ok it's pretty obvious, but yeah, I found it.
Want to know what it was?
Way back in the day, when I started the SnakeEngine projects, I made a decision that all GraphicEntity classes would need a bool initialize(void) method. And thus, they all do. To add a GraphicEntity to the list of things to be displayed my Graphics class has a method void addToDisplay(GraphicEntity* ent). Now, before adding things to the list, it checks if the entity is initialized, how? With this: if(ent->initialize()). See a problem here?
initialize returns a bool, a success notifier.
addToDisplay returns void, if there is a problem the bool doesn't get propogated back to anywhere useful.
Say the GraphicEntity is already initialized, then I expected for the entity itself to check for that, and do nothing but return true when that method is called. What if I forget to do that for a GraphicEntity? BAM, possible memory leak, depending on what goes on in initialize. This is exactly what was happening.
WHY SHOULD addToDisplay INITIALIZE OBJECTS?! IT JUST SAYS IT ADDS! STUPID!
Anyway, my reasoning for that was in case the programmer (uh..me) forgot to call the GraphicEntity's initialize method, it would still be ok. This decision always left a bad taste in my mouth because I knew it was a bad thing to do, but it worked so I left it in. Now it's gone.
So anyway, now I can add and delete missiles all day long in Car That Drives to the Right and no memory leaks. Graphics is no longer a singleton, and the code is a bit cleaner (it really wasn't bad to begin with, even have comments) and hopefully more robust (I changed a few things here and there along the way).
Scarlet is a go, let's make some games.
GOD I CAN'T FIND IT!!!
SOMEWHERE I have a memory leak, and I can't for the life of me track it down!
I'm working a bit on Squarediana Jones/SnakeEngine[Scarlet], and among one of them there is a very tiny memory leak, and it is driving me crazy!
Maybe I need better tools, but I don't know what.
Right now all I do is the lame bring up task manager and watch if memory usage goes up.
Once every few times I reload a level (the only level I currently have) memory usage goes up (4 - 8k).
I've tracked it down to when I create new Treasures and WhipHooks (they'll both do it).
Now I can't for the life of me find anything I'm newing and not deleting. I've tried using a giant picture for the sprite to see if that increases how much memory goes up, it doesn't change.
I've tried adding huge double arrays to the whiphooks/treasures themselves, doesn't change it (well, the initial memory usage is way higher, but the increase isn't changed).
I've tried adding huge double arrays to the sprite class, no change.
Basically all that I'm making are simple classes that have sprite classes. It's so simple I figured it would have to be in the Sprite class or Scarlet somewhere, but holy crap I don't know where.
Maybe adding giant arrays to things isn't the most elegant way of tracking down things like this, but I'm not sure what else to do...
So yeah, I'm at a loss
Anyway, I will post some random stuff now, with pictures!
First of all, I've began a new hobby: photography.
Taking pictures is something I've always enjoyed, but I've never owned a quality camera before, and for some reason even though I periodically research them a bit and check prices just to stay up on them, I never really considered buying one. But I did. It's a Canon S80, 8.0MP, and I got a 2GB card for it. So far I really like it, the picture quality is excellent, and it has a lot of cool features. The only thing I would have prefered is a longer zoom, but I decided to forgo the A700's 6x zoom for the 8 megapixels. So far I don't regret my decision. I really have a lot to learn about photography, and since so far I've been obsesed with leaving it on fully manual mode, I take a lot of crappy pictures lol, but I figure that's the best way to learn.
Oh teh Metroid:
Yes, this is my Metroid collection, well, most of it. Missing are the boxes (I still have all the original boxes and instructions), the Metroid GameCube box (I bought my GameCube when they were doing that cool promotion with the Samus on the box and it included Metroid Prime with the Prime 2 demo disc and the Platinum GC for $99), and my bottle of Jones soda with the Metroid label. Someday I'll take a picture of everything together :).
Out of all those Metroids, there are only two I haven't beaten, Hunters, of course, because I just recently bought it, and believe it or not, the original.
What?! What Metroid fan can call themselves a fan without beating the original?! Well I'm sorry, but the original really isn't that fun, and that's comming from a guy who really likes Metroid II. Really, the main problem is that you always start with only 30 health, which means you either die and try again a lot or you sit in front of those pipe things and shoot the flyer guys until you have enough health to move on. It's tedius, and I just don't have the patients for that.
However, I am going though it for real, just to say I've beaten it. I'm doing the draw a map as you go, since everything looks the same.
Anyway, after I beat it and Hunters (which from what I've played I think is kinda short and easy, but the MP is supposed to be fun) I think I'll write what I think about each of them here. Because I can.
This is what I've been "working" on:
Really I've been working on the Scarlet version of the SnakeEngine (check a couple of the past entries if you really care), which so far has involved combining the Samus Sprite engine into it, because it didn't really need to be separate I decided, and making better text capabilities. Previous versions used some crappy windows bitmap font business, which was slow and not 3D. Now I use a font as a texture made from AngelCode's bitmap font generator. While I just did a simple implementation, so far it works infinitly better.
This is also what I've been "working" on:
Oh man, a beat up old car with its hood up and a part on the ground, that's not a good scene.
Is that...is that a turbocharger sitting there?!
Why yes, yes it is.
So my brother an I have been hitting the junkyard looking for parts, and while there we found (well, he found it, I wasn't there that day) this, a Garret T-3 turbo out of a Merkur XR4Ti, as you can see the exhaust manifold is still connected, but we took that off. 'So...a turbo off a 4-banger, kinda small don't you think?' Actually, this is a pretty good sized turbo, much bigger than what you find on Eclipses and Volvos, and stock can push about 20psi. But yes, it's a bit small :), I don't feel like explaining now, since this entry is so long I'm sure I'm the only one still reading it, but if you think about it you'll probably understand why with a V-8 (or V-anything really), twin turbo is totally the way to go, and isn't any harder to do. So we've been looking for another turbo. Honestly, I'd be surprised if these ever ended up on my car, but hey, for 50 bucks for a turbo, they're nice to have around :).
I will however be putting money into my car this fall, mostly looking for junkyard upgrades, which are plentiful for 5.0 Mustangs, and I'll certainly document that here.
Anyway, so I've been messing around with Lionhead's The Movies lately, which is also a bit tedious to play, but pretty fun. I've had the game pretty much since it was released, but haven't put a lot of time into it, partly because of school, and partly just because. Past week I've gotten into the online part though, and have uploaded a few movies just for the fun of it, you can watch them here if you feel like it.
If you have any comments about them just go ahead and leave them here, I'm not asking anyone to join and review my movies or anything. So far my movies haven't been terribly popular, but "well received". However it seems most of the reviews are by people who just mass review the new movies, give 5 stars and ask to have their movies reviewed. I'm pretty sure people in general are a broken system.
Does anyone else reading this journal play? I'd like to see some of the stuff you guys have made, if anything :).
In case you don't want to read all of my journal to find out what I'm talking about, I'm making what is basically an OpenGL wrapper library in C++, humorously called the "SnakeEngine". It's versions, rather than 1.0, 1.5b, etc, are names of snakes. While it remains 2D (no 3D model support) the versions will be names of non-venomous snakes, I started with Garter and am now working on Ringneck.
The SamusSE is just something that uses the SnakeEngine to display and animate sprites I've made. Named after the first sprite I animated.
For Ringneck, it now supports infinitely scrolling tiled backgrounds (or foregrounds...). Nothing special, but I can set it's range in 4 directions (top bottom left right), and any of those can be infinity. It has a "primary tile" which will be what is shown when it doesn't know what else to show, but any tile position can be set to some other tile. I haven't messed around with it much, so I'm not sure how well it will work out, but so far it does what I need.
To test it, and some mouse input, I made my MouseInputGame:
I also added some texture functionality, such as creating textures by passing in an array of data rather than a filename to load, and also the ability to give textures aliases and also swap out textures whenever. Normally, when a texture is loaded, it's name is saved and whenever something wants to load that texture it just returns the id of the already loaded texture, so it isn't loaded a bunch of times. But now I can load textures a bunch of times. This way I can have lots of things with the same image, but be able to modify one without all things with that texture changing. Which I need to do for my barriers in space invaders.
For the SamusSE, I just added more animation styles, in addition to loop and pingpong, I now have looponce, pingonce, and play. The difference between loop once and play is that play stops on the last frame rather than reseting to the first. Clearly the this sprite engine isn't terribly far along since it didn't already have those.
Anyway, then I felt like making Space Invaders, because I want to basically start over with my game making hobby. So, start with small stuff, just to get some more completed projects and practice, and its easier to work on small projects than it is on large, overwhelming stuff.
So, here it is:
And here it is if you want to play:
Aliens What Which Fall From the Heavens and Drop Bombs or Missiles or Something
Let me know if there are any bugs...if you play. If you don't that's understandable, space invaders isn't exactly the most fun and exciting game in the world. Also, this was more of a personal project than anything, which is why I'm not putting it in the showcase, I'm not really looking for feedback on the game, and there are already some perfectly good space invader games in the showcase already. Mine has a really cool ship explosion though :).
Anyway, it's hard work programing until 4+ in the morning every night listening to Tatu, so I totally need some sleep.
Edit: I just realized the weird graphical error looking things at the top of the Space Invaders pic, I'm not sure what that is, but I didn't see it when I took the screen shot...
First thing I did was bounding sphere, I'm sure you all know why this is helpful. First I started by putting all the triangles in their own spheres (collision against a sphere is much much faster than a triangle, in case you weren't aware). Then I recursively look for the pair of spheres that minimizes the distance between and combined radii, take those and put them in a bigger sphere. I do this until there is only one sphere at the top level (then I obviously have a tree of spheres). Not sure if this is the "way it's done", but it seems to work. In fact, on the scene from the previous entry it rendered 70% faster on my machine :).
I also added the ability to load MilkShape models. It's not as impressive as it sounds, since I had the code to load them laying around from my intro to graphics course, with a little hammering it plugged right in. Of course by the time I got all this working (yesterday), I didn't really have time to make a better scene than what I already had, so I stuck one of the models I had from before (a car my brother made me for my intro graphics final project) in the scene. It's not like it wasn't a little strange already:
right click for full size.
(sorry for file size)
The file is called desert, but I'm not sure where they are exactly, as I've never seen a desert that shiny before. Then again, I've never seen a catepillar in an aquarium (terrainium?) before either.
I wasn't real sure what my goal was when I set out to make the "cool" scene for the project, but I'm happy with what I have (although more time would have been nice, I spent 2 days working on refraction, and I'm not sure there was a problem to begin with). I wanted to do something "real", meaning not just random shapes (like the image below), but I didn't have texture maps, and I only had spheres and triangles to work with. Now, normally triangles are great, but not when you have to plot them by hand :( (read my previous entry about the files to see that it wasn't that bad).
So I first figured a flower would be a good choice, my flower ended up looking kinda dorky but I liked it anyway. Then just a field with flowers or something seemed kinda lame to me. Then I though something in a fish tank would be cool, and allow to show off a bit of refraction too, then I decided a catepillar, because they're made out of spheres, right? I'm not sure if they're really yellow or not, but they were in Super Mario World, so I figure it's ok.
I'm a little disappointed in the grass in the tank, I spent a bunch of time plotting it out on paper to make sure I could type it in and have kind of uneven ground (like in the flower picture below), and with the lighting you can hardly tell. That's why I raised that one part all high in the middle.
Another thing this picture doesn't really show off is my shadows. Which sucks because I spent a lot more time than I should have on it. See, I made sure that transparent objects cast a less than black shadow, and that was easy, but getting multiple transparent objects to add their shadows together was surprisingly difficult to get right, and now it looks all cool but you can't tell here :(. Maybe I can show a bunch of "cool" pics :).
I also totally just realized that the rock the catepillar is on sorta looks like a turtle...if I have time it may become that :).
Anyway, I really totally need some sleep, later.
Rather than bore you with all the images I made throughout making this thing, here are a couple of the better ones:
This one I made to put everything together and make sure it would work with a complex scene. Good thing too, I found an interesting bug when rendering that blue cube (the one on the left). See, when at it's current angle everything worked fine, but if I oriented it so that it was facing directly towards the camera (but still below) it would sit there rendering for a while and then seg fault... I narrowed it down to the transparency being the problem, the only thing I could really think of is that for some reason a ray was getting inside there and just bouncing around forever (which it really shouldn't for transparency since it SHOULD go straight through, and reflection only goes a limited number of bounces).
Now, that box is constructed from six squares (each with two triangles, but that's not important), each square has it's normal facing outwards from the center of the box. Now, I figured what was happening is that if a refracted ray hits the back of a triangle, it is refracted backwards, so once inside the box, always inside the box. What I don't understand is that if this is the case, why does it only happen when the box is oriented a certain way? I suppose now that I think about it that one or more sides could actually have their normals facing inwards, and at an angle the rays would eventually hit all 6 sides, but not when straight on... I'll have to look into that.
BUT, that would of course just make the problem worse anyway, so here's what I did: Whenever a refracted ray hits an object whose normal is facing the wrong way... it just reverses the normal! Problem solved. Hack? I really don't know, as I don't see any other way around this problem, even if I limited the number times a ray could be refracted it would still never get through the box. But as you can see, what I'm doing seems to look fine.
Pay no attention to the stems...
Now last time I was talking about how much of a pain it is to put in triangles by hand, so clearly from this picture you can see I must have done something about that! No, nothing as cool as milkshape models (yet), instead, since I can define a bunch of triangles in a file, why not make a file with a bunch of triangles defined, and then just use it a bunch of times! Ok, nothing really amazing, and in fact the file loader that loads the objects is identicle to the regular loader, it just doesn't check for camera and light information. This of course means that the objects can define spheres and triangle positions, and of course, other objects! So those flowers are a file with a sphere, a stem, and 8 petal objects. The petals and stems are just triangles. In fact, the blue box is made up of 6 bluesquare objects. Like I said, nothing ground breaking but it does make my life easier and allows me to make some kinda cool scenes. The problem right now is that objects, other than size and orientation, are defined at their lowest level, meaning if I wanted say a green box, I would have to make an entirely new object. This is pretty much necessary for colors, but I may make it so I can override the shininess and transparentness of an object. Shrug, if I have time, less than a week left :).
Oh yeah, one more thing, notice how the first image doesn't have a window border? That's because my program saved it itself this time, no screenshot :). I'm using Qt, so it was as easy as image->save(filename, "PNG"); . Awesome.
And also triangles, which is pretty cool.
If I have time I may take the code from my old graphics course where I made a loader for Milkshape models, and see if I can get something cool in it, right now everything is hand coded into a file, not so bad for spheres, but triangles are kind of a pain.
I'm having some other issues right now, now that transparency is working, namely with the shadows. I don't have a pic of it, but even very very transparent objects self shadow themselves quite harshly, which is a problem. Fortunately I have about a week to get all this sorted out, and hopefully get a cool scene for style points :).
Also, the guy who was going to compete against me with this has understandably dropped out. See, we have this thing called "school" that gets in the way of all our fun. So maybe this summer we can compete with a thin lens raytracer or something.
edit: oh yeah, please excuse the horrible colors.