No worries I'll try my best to explain!
Cerberus has a few handy types inbuilt such as Int, Float, String, and Bool. You know those already and each allows you to do what they do best.
But you can also grow your own type and that's what I do here:
Class xy
Field x:Int
Field y:Int
Field vx:Int
Field vy:Int
Field size:Int
End
To make one for youself you use types that already exist, in this case it's just a bunch of ints.
xy is just a name that I picked, much like int or string or pacman, and it could be anything. I picked xy because I first used it only to represent a 2d coordinate and to me it sounded good. A better name for this would have been "point" perhaps. As you see I added more stuff with time.
The reason that I defined a type named xy was becuase this allows me to talk about about these variables as a group and make the code simpler and more clear. You need to be a bit more wordy though when you use your own defined types, compared to the inbuilt ones. This is what makes it hard to grasp, becuase it looks so different even though it is not.
An int or string could be created simply like this:
Local a:Int
Global a:String
Global or local here tells where you can access the variables, it's the "scope" of the variables.
A customized type though needs a longer definition:
Global test:xy = New xy
Notice that the only additional word compared to primitive ones is "New xy" and that this might strike you as redudant as you already told the computer that you are creating a variable using Local or Global, and you've already told the type to use the type :xy. But this is how it is with non-primitives.
Look in the class and you see x y etc. That means that any variable that we assign this type now actually has all these things in it!
That means that we can access a part of it only if we want, using dot syntax like so:
test.x = 10
test.vy = 199
or we could treat it as a whole if we have same type:
test2 = test
I hope this clears things up, just ask if something is still muddy!