So I created my own code for a 2d platform game (like Mario). I decided to use the hitTestPoint method to handle my collisions. It worked smooth as butter, and everything was working perfectly. The character could move up and down ramps perfectly.
My next step in creating my game would be to change my character (which was a block at the time) into a human character that can go to frames labeled "walk", "jump" and "stand". After creating variables for the two character states "run" and "stand" I coded the character to go to frame label "run" if the left or right keys are down, and "stand" if the character is not running, jumping or falling. Then the code was working okay, but there were quite a few problems that were occurring such as the character randomly running through walls and teleporting up ramps.
I still have both versions (working and glitched). Other than the character movie clip changing frames, the code was not altered. I have absolutely no idea why the character is acting like this now. If anyone has experienced a problem like this before or knows what the problem behind this is, please help me out!
Drake Swartzy
It's very likely your samples are not frequent enough (with the implementation you're using) to detect a collision.
With a low enough frequency, you'll update the position of your character, and then test whether it's overlapping the target. This means (if you're going fast enough) you could completely miss the collision.
A better approach may to use raycasting. See How do I handle collision detection so fast objects are not allowed to pass through walls?
Thanks so much for the help Atriace! Sorry, I actually just discovered the problem.... The code was glitching up because when I changed the scaleX value of the character (when the character turned directions), it also effected the points which were nested within the character. These points were used to handle character collisions. Thus that's why the character was acting strangely when it came to X values. However, your answer was definitely a possibility in a situation like this. Once again, thank you for the help.
Cheers,
Drake Swartzy
Related
In my LigGdx based game, I wish to move my Sprite in an elliptical path to reach the destination. I do not find any support in Universal tween engine. Sample of route example is shown below.
Questions :
Is there is any methods in UniversalTween Engine to have a elliptical path ?
Also let me know what is waypoints in UniversalTween Engine ?
Thanks in Advance !
The Universal Tween Engine now supports curves - Default is CatmullRom which would definitely be able to provide the smooth movement you want.
It's a little tricky to get your head around at first but not that bad once you get used to it.
Universal Tween Engine
Details of update that added curves
Well I have searched up this question for you and discovered you many people have already asked this question, and none of them got an answer, yet. So I will try to answer as best as I can. I believe that my method is not the best. But if your application is not time or performance sensitive, then this method may work.
Now this comes to a math problem. You know that the screen is make out of pixels and there is no point making it overly detailed because it isn't possible. So you can do this:
They grey line being your intended line, and the green line being your actual drawn line. If you move objects using the tween engine along the green path and switch path when hitting the red dots. You could mimic an elliptical movement. However, you need to use math and calculate your path. You could set the coordinates of your path as a constant for every screen size, or you could calculate it every time.
Overall, the more points you calculate, the more elliptical the movement will be.
Anyways if you look at this website, it teaches you how to tween.
You can use Tween.to(...); to help you tween to the points.
Hope this helped you
I am developing some games with my friends, using Ogre3D and Bullet Physics.
I managed to get our game character moving (just simple run and turn).
I guess I can implement 'jumping' by this class:
btCollisionWorld::ClosestRayResultCallback res(btFrom, btTo);.
However, my big issue is collision optimization.
I tried:
adding 100~500 rigidbody objects (after we changed these to mapobject in our game)
one staticplanecollision object (ground)
one character rigidbody object
FPS for just moving on plane is 60~80 = ok. But when my character collides with any other rigidbody object, FPS is going down to 7.
I have no idea that fix this problem.
I am not useing DynamicCharacterController or KineticCharacterController.
Character is controlled by setLinearVelocity() and rigidbody->getWorldTransform().setRotation(quat) function
Some more information:
PhysicsManager::GetInstance()->getDynamicsWorld()->stepSimulation(evt.timeSinceLastFrame,8);
I've had this issue before, I don't know if that's your case, but we were implementing Damned (game), and when we modeled the kitchens we were using the stoves' meshes as collision objects (btDbvtTriangleMeshShape), and everytime the character got close to a stove the FPS went down...
The solution was to use a simple collision shape for each stove (like btCompound with a few boxes), and the FPS issue went away :)
Hope your issue is similar to this so you can solve it by reducing the complexity of the collision shapes you're using.
If this isn't the case, please, show me the code you run when handling your character (also, KinematicCharacterController is highly recommended, and moving from Bullet to PhysX is even more recommended ;D).
Best.
I'm having a terrible time trying to code in Flash for a small game level.
I'm trying to drag an object within a path using a mouse pointer. And whenever the object hits the path boundary it shouldn't go beyond. Can anyone help me. I'm a noob in flash actionscript 3.
Any help would be much much appreciated !Thanks in advance.
I think what you're looking for is termed "Bitmap Hit Testing." It goes beyond the level of the regular hit test checking.
In regular hit testing (like obj.hitTestObject(otherobj)), Flash is checking the "boundary boxes" against each other. For instance, if you have two green circles you're trying to hit test against each other, they will register as colliding even if the corners which appear white are touching. There's an invisible bound box surrounding the circle that's colliding with the other invisible bound box surrounding the other circle.
Bitmap hit testing, on the other hand, is significantly slower and complex, but much more accurate. It is actually checking pixel per pixel whether the two images are colliding. In this case then, bitmaps can be irregular shapes with say, a path within, like this:
I would recommend looking at http://www.freeactionscript.com/tag/using-bitmapdata-hittest/ for a demo to make sure that this is what you're looking for, and then http://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/ for an explanation, both by Mike Chambers.
I surmise that your process would be a conversion of both of your clips (the dragged object and the "walls" of the path) into BitmapData (do some quick research), and then a simple method call of the BitmapData.hitTest for your checking. Let me know if you have any questions or need any additional clarification :-)
I'm totally beginner in Flash and Actionscript so sorry if my questuon is stupid.
I have to make a platform game - I'm planning to write something like Icy Tower - my character is jumping from one platform to another to get to the top of a tower of something. And here is my problem - I want to allow the character to jump onto a platform only from the top, but if he collides with whe platform from the bottom, or from the side, I want him to bounce (I hope you understand what I want mean).
So, to do something like that, I need to be able to detect where exactly do these two objects collide - the only solutions that comes to my mind is to keep the coordinates of every platform in some array and compare them with the characeter's position evertime he jumps, but it just doesn't seem right. Is there an better way to solve this problem?
I will be grateful for any advice.
PS. Sorry for my English
You can make use of a game library like flixel, or flashpunk. They are both great.
Essentially, you will need to iterate over all objects that your character can collide with. You can make use of .hitTestObject() to roughly determine if your character is colliding with any of the objects. Thereafter you can then get the coordinates and dimensions of your character on the stage and compare them to the coordinates and dimensions of the hit object to determine directions.
So in psuedo code
for each (var platform:DisplayObject in platforms) {
if (character.hitTestObject(platform)) {
if (collideFromBottom || collideFromSide) {
// allow movement
}
if (collideFromTop) {
// stop downward velocity
}
break; // might as well, as you have detected the collision
}
}
CollideFromBottom would be comparing the top of your character with the bottom of the platform. Remember that as Sprites, both player and platform have [x,y] properties and [width,height], allowing you to determine coordinates.
P.S. this question should have been asked at gamedev.stackexchange.com
I'd recommend you to use a Physics Engine like Box2D(
behold the examples), instead of creating some hitTest colision based game from scratch.
The probability of you having serious code/design problems and leaving the project aside are big.
There's a lot of good tutorials on internet, here a good resource - Using Box2d to Create a Side Scrolling Game:
Part 1
Part 2
Ok, so I'll try to be as descriptive as possible.
I'm working on a project for a client that requires a jibjab-style masking feature of an uploaded image.
I would like to be able to generate a database-storable object that contains anchor/control positions of a bezier shape, so I can pull it out later and re-mask the object. This all is pretty easy to do, except for one catch : I need to create the bezier object from a user-drawn outline.
So far, here's how I imagine the process going:
on mouse down, create a new sprite, beginFill, and moveTo mouse position.
on mouse move, lineTo an XY coordinate.
on mouse up, endFill.
This all works just great. I could just store the info here, but I would be looking at a GIGANTIC object full of tons of pretty useless x/y coordinates, and no way to really make fine-tuning changes outside of putting handles on every pixel. (I may as well give the end user a pencil tool...)
Here's what I'm thinking as far as bezier curve calculation goes :
1: Figure out when I need to start a new curve, and track the xy of the pixel on this interval. I'm imagining this being just a pixel count, maybe just increment a count variable per mouse move and make a new one every x pixels. The issue here is some curves would be inaccurate, and others unnecessary, but I really just need a general area, not an exact representation, so it could work. I'd be happier with something a little smarter though.
2: take each new x/y, store it as an anchor, and figure out where a control would go to make the line curve between this and the last anchor. this is where I get really hung up. I'm sure someone has done this in flash, but no amount of googling can seem to help me out with the way to get this done. I've done a lot of sketching and what little math I can wrap my brain around, but can't seem to figure out a way of converting pixels to beziers.
Is this possible? All I really need is something that will get close to the same shape. I'm thinking about maybe only placing anchors when the angle of the next pixel is beyond 180 degrees in relation to the current line or something, and just grabbing the edge of the arc between these changes, but no matter how hard I try, I can't seem to figure out how to get this working!
Thanks for your help, I'll be sure to post my progress here as I go, I think this could be really useful in many applications, as long as it's actually feasible...
Jesse
It sounds like a lot of work to turn pixels into Bezier curves. You could try using something like the Linear least squares algorithm. http://en.wikipedia.org/wiki/Linear_least_squares
A different tact, could you have your users draw vector graphics instead? That way you can just store the shapes in the database.
Another cool method of converting raster to vector would be something like this iterative program: http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/
Good luck
In my answer to this question I discuss using autotrace to convert bitmaps to beziers. I recommend passing your user drawing through this program on the server. Autotrace does a fantastic job of tracing and simplifying so there is no need to try and reinvent the wheel here.
Thanks for the answers, although I guess I probably should be more specific about the application, I'm really only needing an outline for a mask, so converting images to vectors or polygons, despite how cool that is, doesn't really fix my issue. The linear least squares algorithm is mega cool, I think this might be closer to what I'm looking for.
I have a basic workaround going right now, I'm just counting mouse moves, then every X (playing with it to get most desirable curve) moves, I grab the xy position. then, I take every other stored xy, and turn it into an anchor, the remaining xys are turned into controls. This is producing somewhat desirable results, but has some minor issues, in that the speed at which the mask is drawn effects the number of handles, and it's really just getting a general area, not a precise fit.
Interestingly, users seem to draw slower for more precise shapes, so this solution works a lot better than I had imagined, but it's not as nice as it could be. This will work for the client, so although there's no reason to pursue it further, I like learning new things, and will spend some off the clock time looking into linear least equations and seeing if I can drum up a class that will do these computations for me. If anyone runs across some AS3 code for this type of thing, or would like some of mine, let me know, this is an interesting puzzle.