Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - ZippyDee

Pages: 1 2 3 [4]
46
TI Z80 / Axe Lemmings
« on: April 04, 2011, 04:07:30 pm »
I probably won't finish this, because I tend to get distracted from big projects like this, but I'm going to at least START making Lemmings in Axe! :D

Any input/help would be greatly appreciated, especially if you know anything about the details of the gameplay (like what's the maximum drop height they can survive, etc...)

I'll hopefully post screenshots once (or if) I get to that point. :D

Wish me luck!
-Zippy Dee

47
Howdy-doody-doodle-doo?
Collision detection and collision reactions are something game developers are constantly having to find ways to do. I'm going to explain the basic calculations needed to write efficient point-to-line collision reactions for all y'all who either don't know that much about physics, just want to brush up on some kinetics, or are just too lazy to do the calculations yourself.

THE BASICS OF COLLISIONS

Point-to-line? What's that mean?
When I say "point-to-line" (or "point-line") I am referring to a collision in which a specified point on an object collides with a solid line.

The point:
When I say "a specified point on an object" I am referring to ANY point (P) whose coordinates lie within the boundaries of your object. Obviously calculating collision with every single point in your object would be completely absurd, so collision objects are usually made up of a few keypoints to which the collision detection is applied. Those points are usually vertices and a few points that lie within longer lines. The calculations that I talk about in this explanation would be applied to these keypoints.

When a rotational force is applied to an object, the object will want to rotate around its center of mass. Every object has a center of mass. The simplest calculation for the center of mass is to assume the mass of every point in your object is the same, then you just take the average of the x-coordinates of all the points, and the average of the y-coordinates of all the points. That gives you your center of mass (xc, yc).

The line:
The line has a much shorter explanation: It's a line segment. It has endpoints, a slope, a y intercept, and angle, etc. All you really need is the endpoints and you can find the rest.


Detecting a collision
This is just a quick and dirty explanation of how you would go about determining if there was a collision between a line and a point on an object. Sorry for the lack of actual calculations. This is more about theory. :P

In order for a collision to take place at all, the point must be moving in some way. In order for it to move, it needs to have some sort of a vector representing velocity. Because your points are rigidly attached to this object's center of mass, the velocity of the object's center of mass can be used to represent the velocity of the point. (This doesn't take into account any velocity created by the object's rotation, but that calculation is a bit much for a lot of what we're doing, so we we'll just ignore that for now. Unless you're looking for a really, really accurate physics engine, this shouldn't have a tremendous effect on your end result.)

Using this velocity, we can calculate the trajectory (again ignoring rotation around the center of mass) of the point (P) between this frame and the next frame. The trajectory will just be a line between the current location of the point (x1, y1) and the location of the point (x2, y2). From there we can calculate the equation of the line segment between those two points and check if that line segment intersects with the line segment we're testing for collision.

Line to line intersection is fairly simple:
y=m1x+b1
y=m2x+b2
Then you solve the parametric equation for x and y to find the collision.

You can also find the intersection point of two lines (not line segments) by finding the determinants of a series of matrices (which I won't really explain the specifics of at this time) and you can simplify it to a single equation as shown in pseudocode here:
Code: [Select]
function intersect(x1,y1,x2,y2,x3,y3,x4,y4){
x = ((x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4))/((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4))
y = ((x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4))/((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4))
return Point(x,y)
}

If one of the lines is vertical, then you can simply find the x of that line and solve the equation of the other line for y at that x coordinate.

Note that those will find the intersection point of two LINES, not line-SEGMENTS. In order to correct this, you just need to check whether the point of intersection is between the start and end points of both line segments. If so, a collision occurred between the current frame and the next frame.

NOTE: When doing the collision detection calculations, it is best to calculate the collisions of all keypoints on your object, and figure out which collision happened first. Then calculate the reaction based on that collision. Otherwise it can get messy if you object is moving at a high speed and multiple reactions are being calculated at once, when they really wouldn't have happened if you had calculated in order of time. Calculating the time of the collision is simple enough:
Code: [Select]
//where (x1,y1) and (x2,y2) are the start and end points (respectively) of the point's trajectory
//and (x,y) is the point of collision
time = sqrt((x-x1)^2-(y-y1)^2)/sqrt((x2-x1)^2-(y2-y1)^2)
Assuming we already know that (x,y) lies on the line defined by (x1,y1)(x2,y2), this equation will return a value between 0 and 1. 0 means the objects are colliding on the current frame (which should have been handled during the last calculation) and 1 means they will collide exactly on the next frame. Anything in between means the collision occurred somewhere between the two frames.

For anyone programming in a language such as Axe or ASM that doesn't directly use decimals, think of the time value as a percent rather than 0 to 1. So instead of 1 you use a large integer value for 100%, and 0 for 0%.



COLLISION REACTIONS

Finally the good stuff. And by good, I mean there's a lot to cover.

A basic explanation of vector dynamics for collision objects:
"Vector dynamics" is pretty much a fancy way of saying "how objects move." A vector, for those who don't know, has two properties: a magnitude, and a direction. For example, velocity is a vector: its magnitude is the speed the object is traveling at, and its direction is...well, the direction the object is traveling.

Let's talk a bit about the properties of a moving object. There are many properties that we could talk about, but there are a few that we actually care about for these purposes:
  • Mass (we'll use 1 for almost all calculations just for the sake of simplicity. :))
  • Position (relative to the center of mass)
  • Linear velocity
  • Linear acceleration
  • Angular velocity
  • Angular acceleration
  • Moment of inertia (sort of...)
Hopefully you already know what most of those are, but I'll just briefly go over them all, just in case.
-Mass is mass. It's the mass of the object, and it is represented by the mass. All clear? Good! Moving on...
-Position is simply the x and y of the center of mass of the object. As I said earlier, the center of mass can be found by averaging all the x/y points within the bounds of the object....or just average the x and y of your extremes, because we're using a constant particle mass.
-Linear velocity, or just 'velocity', is simply the speed and direction in which the object is currently moving. If it's not moving, it has no velocity. The easiest way to express velocity in programming is by using individual xVel and yVel values.
-Linear acceleration, or just 'acceleration', is the rate at which the linear velocity changes from one frame to another. We'll also express this using individual xAccel and yAccel values.
-Angular velocity, also known as 'rotational velocity', is the speed at which the object is rotating. Like linear velocity, angular velocity is also a vector, it's what's called a "rotary vector." The magnitude is the speed, and the direction is the axis it rotates about. But we'll be using the center of mass as a rotational axis, so we only need to worry about the speed, which we'll call rotVel (for 'rotational velocity').
-Angular acceleration, like regular acceleration, is the rate at which the angular velocity changes from one frame to the next. We'll express this as rotAccel.
-Moment of inertia is probably a new term for you if you haven't taken a physics class. Put simply, Inertia is an object's resistance to a change in motion (Newton's First Law: Every body remains in a state of constant velocity unless acted upon by an external unbalanced force). The Moment if Inertia is its resistance to a change in rotational motion.

When I say "Moment of inertia (sort of...)" I mean that using the exact moment of inertia is not always possible in all situations. The calculation for moment of inertia requires that you integrate over the entire surface of the object the distance to the axis of rotation squared times the mass for each particle. This is not always a simple calculation if you're using irregular shapes. In that case we can cheat and use a more regular shape that is similar. Here's a list of the moments of inertia for many regular shapes: http://en.wikipedia.org/wiki/List_of_moments_of_inertia

For this example, I'll be using a "Thin rectangular plate of height h and of width w and mass m" (as defined in that wikipedia list), so our moment of inertia (usually represented as I) calculation will be (mass*(h*h+w*w))/12. For most calculations we'll use a mass of 1, because that makes things easy, but this answer will almost definitely have to be scaled down quite a bit in order for it to look good in our pseudo-physics environment.


Bodies colliding:
Okay, so now we finally have collision, let's take a look at what's going on.

As we know, change occurs when a force is applied to an object. Physics states that Force=mass*acceleration, but because we're using a mass of 1, we can say that Force=acceleration. Remember that acceleration is also a vector, so it must have magnitude and direction.

An object has a net force Fnet acting upon it at any given time. "Net force" is as simple as the sum of all individual forces acting upon the object. From this point onward, please just understand that due to our mass being 1, any time we talk about a "force" being applied, it means an "acceleration" of equal magnitude is applied.

Gravity is a force that is acting on anything with mass at all times. So you can always assume your object has the force of gravity being applied straight down. Also, we know that "for every action there is an equal and opposite reaction." So, if an object is sitting on flat ground, the object has the force of gravity pulling it down against the ground, and the ground pushes back with an equal force in the opposite direction. For any surface of any angle, this force will be applied in a direction perpendicular to the angle of the ground. This perpendicular force is called the Normal Force (represented by FNorm).

Let's look at some simple physics: a box is placed on an inclined plane at angle θ.



Gravity is pulling downward (as usual) with a force of Fg. The magnitude of the normal force can be calculated by FNorm=mass*Fg*cos(θ). But that only accounts for cos(θ) of the force of gravity, so the object would still be accelerating straight down by Fgsin(θ), meaning it would fall through the surface of the plane! That's because when FNorm is applied, the rest of the force of gravity is diverted to go PARALLEL to the surface of the plane. The magnitude of that parallel force can be calculated by F||=Fg*sin(θ).

Okay, so now the box is sliding down the inclined plane at a velocity increasing by F|| every frame. At least, it WOULD if the plane was made out of some sort of friction-less material. But since lack of friction can be assumed physically impossible, let's make this more realistic and add some in. The force of friction (Ffric) is applied in the OPPOSITE direction of F||, with a magnitude found by Ffric=FNorm. Piece of cake, right? But wait...what's that "µ" symbol doing there? The Greek letter µ ("mu", pronounced "mew") represents the coefficient of friction. Oh, dear! What does THAT mean? µ is the ratio of the force of friction between two bodies, and the force pushing the two bodies together. µ changes based on what materials the two bodies are made of. In this case, FNorm is the force pushing the two bodies together.

Wow, all this stuff with µ is getting really complex. Isn't there an easier way? Yep! Let's forget all about that µ stuff and assume that our materials will never change, so we can just make up a value to represent our µ. Just for the sake of examples, let's say our µ is 0.15. Based on that, we can say that Ffric=FNorm*0.15 and it is applied in the opposite direction as F||. If it's the exact opposite direction, why not just subtract Ffric from F||? Our new equation for the parallel force with friction applied will be F||=Fg*sin(θ)-FNorm*-0.15.

Just to make sure we're on the same page now...
   FNorm=Fg*cos(θ)[
    F||=Fg*sin(θ)-FNorm*0.15[/sub]
(remember that 0.15 is just the example value for µ. Play around with it until you find something you like.)


Okay, so now we know the normal force and the parallel force applied to an object on a plane that at the angle θp. Let's look at what those forces mean for us.

Let's say a box is now dropped at an angle of 0 degrees from some height onto an inclined plane at angle θp. The corner of the box will hit the plane first, so that's where the collision is processed. FNorm is now applied to the box at the point of collision Pc. This will cause the box to rotate, but we need to know how much it will rotate. Let's take a look:

First we look at the angle θa between Pc and the box's center of mass Pm. Now we look at FNorm and find the angle that it is applied at (θN). The difference between these two angles (θc) is what we'll be looking at. Using this angle we can calculate both the linear and angular acceleration on the object.
accel=FNorm*cos(θc)
But remember we're representing acceleration with xAccel and yAccel, so we have to use convert it to x and y.
xAccel=xAccel+accel*cos(θa)
yAccel=yAccel+accel*sin(θa)

The reason we use θa is that the force is applied to the center of mass, not just this specific point.
But now that only accounts for cos(θc of the force. The other sin(θc) turns into angular acceleration.
rotAccel=rotAccel+FNorm*sin(θc)

Now we've dealt with what happens with FNorm, but what about F||? That force is still applied, but now we have to do the same calculations to it as we did to the normal.
First we take the difference between θa and θ|| (we'll call it θd). Now we apply F|| to the linear and angular accelerations the same way.
accel||=F||*cos(θd)
xAccel=xAccel+acceld*cos(θa)
yAccel=yAccel+acceld*sin(θa)
rotAccel=rotAccel+F||*sin(θd)



So let's look at what we have now:
   accel=FNorm*sin(θc)
    xAccel=xAccel+accel*cos(θa)+acceld*cos(θa)
    yAccel=yAccel+accel*sin(θa)+acceld*sin(θa)
    rotAccel=rotAccel+FNorm*sin(θc)+F||*sin(θd)



I know this is still incomplete, but I thought I'd update it to at least this much and I'll update again once the full explanation is done. After that I will add graphics for explanations (which will help a lot, I'm sure) and then I'll put together an example of implementation of all of this for the final version. Thanks for your patience!

48
Axe / nib{} question
« on: March 28, 2011, 08:16:02 pm »
Hi, I'm trying to use the nib{} command in a sprite display routine, and I'm getting some funky looking graphics out of it...but not the ones I want.

Basically, Pic0V and Pic0S each point to a bunch of 4x4 sprites. Naturally, each sprite is 2 bytes, so to use the Pt-on() (etc...) commands I have to convert it to 8x8. Well, for this program I'll always be displaying one sprite from Pic0V and one from Pic0S side by side, so I thought "why not just make a routine to generate an 8x8 sprite that has both 4x4's next to each other (with the rest filled by 0's of course).

So I tried to write that routine, but it's not working...and I realized that I may be using the nib{} command wrong. So I guess my real question is this:

if {L1} = $8F, would nib{L1*2} = 8 or 15? Basically, which half of the byte is read first? The lower half or the upper half?

49
Hey everyone! I'm Zippy. Or Taw. Either one.

I love words.
Words are awesome.
Anathema. Putrid. Spackle. Dank. Elbow. Gaggle. Pundit. Vivacious.....

You may look at words like that and just say "Okay...those are words. Cool story." But I look at words and see things like this:
STARTLING
STARTING
STARING
STRING
STING
SING
SIN
IN
I

Remove one letter each time and it is STILL a real word. Isn't that awesome?

Or how about this:
Therein, Therein, Therein, Therein, Therein, Therein, Therein, Therein, Therein, Therein, Therein.
All those words can be seen without rearranging any letters.
SO AWESOME.
Even just thinking about every-day words is awesome. Words like "banana" and "floss."

But enough about words, I've barely introduced myself! :P

I'm Zippy/Taw (as you already know), I'm a nerd (As you probably guessed), and I'm perfectly fine with that fact. :)
I like people. I like to talk. And I love talking to people...
I have ADHD and Tourette's Syndrome, along with a few other minor things, but hey, we all have our issues, right?
I like math. I hate math classes. I love to learn. I hate the educational system.
I love thinking. Specifically problem solving.

My love for learning inspires me to try all sorts of things, leading to the smorgasbord of activities and ideas that I refer to as my interests.

Programming, problem solving, psychology, building things, playing music, composing music, singing, acting, dancing, drawing, painting, marching band, colorguard, writing, stilt-walking, juggling, spinning poi, gymnastics, aerial acrobatics, teaching things to people, laughing, dreaming, meeting new people, just generally being around people, telling jokes (usually bad puns or obnoxiously witty remarks), correcting spelling/grammar, and obviously a lot more things.

I'm 18, I graduated high school a year ago, but I'm taking a year off before college. I am currently dancing 13 hours a week doing Jazz, Lyrical, Ballet, Ballroom, Hip-Hop, Breaking, and Popping/Locking. This year I'm dancing competitively in Jazz, Ballroom, Hip-Hop, and Popping/Locking.

I'm a self-taught programmer with plans to take actual CS courses in college. I started with VB4 when I was 7 (looking back at that always makes me laugh), then I learned Flash ActionScript 2.0, then 3.0, then TI-BASIC, then a liiiiiiiiiiiiiiiiiiiiittle bit of z80 ASM, then Java, then 4 days ago I started poking around with Axe, and now I'm here. :D

I play a lot of instruments. I won't list them all right now, but if you really want I can tell you.

I teach at a circus camp in the summer, hence the stilt-walking, juggling, poi, gymnastics, and aerial acrobatics in my list of interests.

I'm one of those people who starts a bunch of projects but is conveniently too ambitious to finish any of them before starting more and completely forgetting about the old ones. I wish that wasn't the case, but oh well.

That's basically me. If you have any questions about me or even about anything really, I'll be happy to answer them, at least to the best of my knowledge.
Glad to be on the forums :D

My apologies for writing so much,
-Zippy Dee

50
Axe / Efficient 12x12 sprite routines
« on: March 26, 2011, 04:58:58 am »
I'm working on a game in which I want to use 12x12 sprites, and I would REEEEEEEEEEALLY rather not have 48 wasted bits for every sprite, so I'm looking for an efficient method of displaying 12x12 sprites. If I knew how to access data from an Axe program, I'd just figure out a 12x12 routine using my small knowledge of ASM. Sadly, I don't know how to do that, so I can't. :P

Any suggestions?

Thanks!
-Zippy Dee

Edit: I know how I'd write one in Axe, I just don't know if it would be very optimal, so I guess that's really what I'm looking for: either an assembly routine or an optimized axe routine.

51
The Axe Parser Project / Axi---what?
« on: March 25, 2011, 03:20:47 am »
<-----noob here.

Can someone explain to me what an Axiom is? :D

Thanks!
-Zippy Dee

52
ASM / Custom parser commands? :O
« on: March 24, 2011, 05:14:46 am »
Being new to ASM, I still have a lot of questions. Here's my most recent one:

I understand that it's possible to add new commands to the command parser and also (I think) to modify the way other commands are interpreted, but I have no idea HOW this is done. Can anyone explain?

Thanks again,
-Zippy Dee

53
Axe / What's the best way to store data?
« on: March 24, 2011, 02:41:40 am »
AXE/ASM noob here! :D

What's the ideal way to store large amounts of data (i.e. map data, sprites, large strings) for your programs? I'd expect that you'd just keep the data in your program, but is there a better way to do it?
Also, could I get some guidance on when to use temp ram areas/external variables rather than portions of program memory for data storage?

Any other data optimization tips would be greatly appreciated!

Thanks!
-Zippy Dee

54
ASM / Bezier curves HELP!!
« on: March 20, 2011, 11:19:52 pm »
Hi, I'm quite  new to ASM, so I probably made a bunch of mistakes.

I'm trying to write a program that draws a Bezier curve based on given control points. However......it doesn't seem to be working. I think it's an issue with my math for calculating the next iteration of control points, but I've looked it over again and again and I can't figure out what's wrong.  :banghead:

Here's the code, complete with a surplus of comments (probably more than I really need, but I just wanted to show my though processes).

//EDIT: Here's an explanation for constructing Bezier curves. Hopefully it'll help :)
http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Constructing_B.C3.A9zier_curves


Code: [Select]
.nolist
#include "ti83plus.inc"
#define    ProgStart    $9D95
.list
.org    $9D95 - 2
    .db    t2ByteTok, tAsmCmp

b_call(_GrBufClr) ;clear stuff...
b_call(_ClrLCDFull)

ld a, 255
ld (_time), a ;set _time to 255 (when used in calculation it ends up acting as a lower part of a fixed point number)
ld a, (_len) ;_len is always 4 right now. That'll change once I get this thing working.
ld (_level), a
call LoadVals ;load the _initx and _inity values into _px and _py
_tloop:
call Bezier ;calculate and plot the point on the curve at _time
call LoadVals ;reload the _initx/y values
ld hl, _time
dec (hl) ;dec _time
xor a
cp (hl)
jr nz, _tloop ;loop until _time is zero

call Plot ;plot the first point (shouldn't be necessary, but just in case)

ld hl, _px ;load points at _px+(_len) and _py+(_len) into _px and _py
ld bc, (_len)
dec bc ;_len is the total length, so subtract one to get the last one
add hl, bc ;set hl to address of _px+(_len)
ld de, _px
ldi

inc bc ;ldi decrements bc, so add 1 to restore it
add hl, bc
ld de, _py
ldi

call Plot
b_call(_GrBufCpy)
ret


LoadVals:
ld hl, _initx
ld de, _px
ld bc, 8
ldir
ret


Bezier:
ld a, 0
ld (_n), a ;reset _n
ld hl, _level
dec (hl) ;go to next (or first) level iteration

ld a, (hl)
cp 0
jr nz, bez

call Plot ;if the level is zero, draw the point at _px,_py to the graph buffer
b_call(_GrBufCpy) ;display for testing purposes
jr bez_ret ;end the routine

bez:
ld hl, (_n) ;for each point p[_n] where _n=0 to _n=_level-1
ld h, 0 ;_n is one byte, so zero out h
push hl ;save _n
ld de, _px ;we want to calculate the _nth byte starting at _px
;Div_pt has add hl,de in it.
call Div_pt
ld (hl), a ;save the new x coordinate to _px[_n]

pop hl ;restore _n
ld de, _py ;now we want the _nth byte starting at _py
call Div_pt
ld (hl), a ;save the new y coordinate to _py[_n]

ld hl, _n
ld a, (_level)
inc (hl) ;_n=_n+1
cp (hl)
jr nc, bez ;loop until _n>=_level-1

call Bezier ;call Bezier again to calculate the next level iteration

bez_ret:
ld hl, _level
inc (hl) ;reset _level to the previous level iteration before returning
ret


Div_pt:
;input
; de = start address of point array
; hl = value at _n
;output
; a = p[_n]+(p[_n+1]-p[_n])*(_time/256)
; hl = address of p[_n]
;note that p[ ] is either _px[ ] or _py[ ] depending on input de value

add hl, de ;find the address of the desired byte
push hl
pop de
inc de ;de = hl+1
ld a, (de)
sub (hl) ;subtract p[_n] (at hl) from p[_n+1] (at de)
;a is now the difference of the two points

push hl ;save location of p[_n]
ld e, 0
jr nc, _pskip
ld e, 1 ;if (de)-(hl) is negative, e is 1
neg ;make a positive
_pskip:
;##################################################################
;##################################################################

;This is the part that I guess isn't working

;Basically, I'm using _time as a percentage (where 256 is 100%)
;The point at _time percent of the line between p[_n] and p[_n+1] is calculated here
;    and stored in a (later stored in p[_n] back in the main Bezier routine)

;I'm calculating this:
;   p[_n]+(p[_n+1]-p[_n])*(_time/256)

ld h, a ;make hl fixed point with value a
ld l, 0
ld a, (_time)
ld d, a ;multiply by _time
push de ;save e, which holds the sign
call HL_Times_D
;because HL is 2 bytes and D is one byte, this SHOULD be the same
;  as multiplying by d as if it was the decimal part of a fixed point number

pop de ;restore e
ld a, e
cp 0 ;check for negative
ld a, h ;in case of negative, get the value to invert
jr z, _nskip
neg ;if a was negative before, make it negative again
_nskip:
pop hl
add a,(hl) ;add the original p[_n] value
ret
;##################################################################
;##################################################################

Plot:
ld a, (_py) ;get the y coordinate into l
ld l, a
or a
ret m ;ret if negative
cp 64
ret nc ;ret if y>=64
ld a, (_px) ;get x
or a
ret m ;ret if negative
cp 96
ret nc ;ret if x>=96
call GetPixel ;turn on pixel (x,y)
or (hl)
ld (hl), a
ret


GetPixel: ;this came from the "Learn TI-83/84+ ASM in 28 days" or whatever guide
;a = x coordinate
;l = y coordinate
ld h, 0
ld d, h
ld e, l
add hl, hl
add hl, de
add hl, hl
add hl, hl
ld e, a
srl e
srl e
srl e
add hl, de
ld de, PlotSScreen
add hl, de
and 7
ld b,a
ld a, $80
ret z
__gloop:
rrca
djnz __gloop
ret


HL_Times_D: ;this came from the "Learn TI-83/84+ ASM in 28 days" or whatever guide
;in the guide it was DE_Times_A, but I was already using HL and D for division
;  so I thought it was a good idea to just keep those values
ld a, d
ld de, 0
ex de, hl
ld b, 8
__mloop:
rrca
jr nc, __mskip
add hl, de
__mskip:
sla e
rl d
djnz __mloop
ret


Div_HL_D: ;this came from the "Learn TI-83/84+ ASM in 28 days" or whatever guide
xor a
ld b, 16
__dloop:
add hl, hl
rla
jr c, __overflow
cp d
jr c, __dskip
__overflow:
sub d
inc l
__dskip:
djnz __dloop
ret


_time:
.db 0
_level:
.db 0 ;control point iteration level
_n:
.db 0 ;control point to calculate at any given time
_len:
.dw 4 ;number of control points for the curve
_initx:
.db 4, 7, 13, 20 ;control point x values
_inity:
.db 6, 23, 19, 2 ;control point y values
_px:
.db 0, 0, 0, 0 ;x values for calculations
_py:
.db 0, 0, 0, 0 ;y values for calculations
.end
.end

If anyone could help me out that would be wonderful!

Thanks!
-Zippy Dee

Pages: 1 2 3 [4]