PDA

View Full Version : Wizards: An XNA playtoy



Kensei
06-01-2009, 08:51 PM
Righty, Hallo guys (and gals) :)

I have been fiddling around with XNA, primarily going through the tutorials on XNA Development (http://www.xnadevelopment.com/) and now have a demo for y'all to play around with.

The GGE page explains most of this but if you are too lazy I will put it here as well. This is the beginning of a side scroller, you can play with either the keyboard or the xbox controller (since I created methods for both) which means instant co-op game play :D

So far, all you can do is move up and down, left and right, and fire fireballs as a slow moving squaredude.

There is tons more to do with this and it is more just a sandbox for me to play, but I have so much fun mucking about with WIPs that I thought I'd share it with all y'all :D

Its kinda tricky going from the easy to use Game Maker to XNA that does you no real favours :p (Took me a while to figure out the best way to do a collision detection)

As a side note, OMG, the controller methods are so much easier to implement than the keyboard input.

Please questions, comments, complaints, lulz are welcome :D


Releases found here (http://www.greatgamesexperiment.com/game/wizardsexperiment)

Nerosis
06-01-2009, 09:30 PM
I downloaded the setup file, but I can't get it to install. It fails to find a MyFirstTutGame.application file to download on my desktop (which is where I dumped the setup file). Am I doing something wrong?

The error message says "Cannot download the application. The application is missing required files. Contact application vendor for assistance".

Kensei
06-01-2009, 09:56 PM
Oops, Lemme fix that :p

Edit: Fixed - It should work now

Nerosis
06-01-2009, 11:04 PM
Yup, it works now. :)

How do you find XNA compared to Game Maker?

Kensei
06-01-2009, 11:25 PM
:p To be perfectly honest, XNA is a lot more complex than Game Maker in terms of doing thing - makes me appreciate GM, a lot.
I could likely create the same game, perhaps minus the scrolling background in a quarter of the time in Game maker and I am in no way a GM guru. (It took me a while to wrap my head around the fact that the BoundBox Collision check needed a minimum and a maximum value before it could check if the two objects collided)

That being said, I can see there is a great deal more 'power' behind XNA, you have a lot more control and truly create some awesome things with it - given time and knowledge.

Be sure you know your C#.Net and you should be fine, for the tutorial I followed, you need knowledge of inheritance, Object Orientation and standard coding such as for loops and if statements

Nerosis
06-01-2009, 11:46 PM
I use in C# in my day job, so that won't be an issue - one less thing to learn. :) Now just to find the time to learn XNA and make a game in it. It sounds like it might be a worthwhile direction to move in.

I'll start with the tutorials you linked to, and see how it goes... :cool:

BlackCid
07-01-2009, 08:42 AM
Jus down loaded the setup file, giv fid bac as soon as i tym - promise!

Kensei
07-01-2009, 01:29 PM
Jus down loaded the setup file, giv fid bac as soon as i tym - promise!

one more time? In English if possible? :p

The Dash
07-01-2009, 02:38 PM
one more time? In English if possible? :p

I think its

I just downloaded the setup file, I will give feed back as soon as I can - I promise!

edg3
07-01-2009, 03:05 PM
As a side note, OMG, the controller methods are so much easier to implement than the keyboard input.
Keyboard input can be a bit of a stumbling block at first in XNA, but if you want I have a class I wrote to handle keyboard input that you can try out because I didnt want to have to rewrite my code hundreds of times just for handling input.

So, after playing it, what are your plans from here on? :)
Also, I noticed that you have a duplicate of the wizard guy on screen, is it perhaps for the gamepad?

Kensei
07-01-2009, 03:12 PM
So, after playing it, what are your plans from here on? :)

Develop it into a more robust side scroller shooter.
Will likely take away the player's ability to move up and down so you are forced to use the jump and duck keys.
Will like just be a case of throwing a variety of enemies at the player (perhaps ones that require more than one hit to die) - I can create more specific enemies that inherit from my Enemy class.


Also, I noticed that you have a duplicate of the wizard guy on screen, is it perhaps for the gamepad?

That's correct :D It is effectively a two player game :)

So tentatively plans are as follows:
- Get my head around Game State Management so I can create a start screen and the ability to play with just the controller, just the keyboard or 2 players (the mechanism is there, just need a menu to set the controller
- ****loads more content :p
- More enemies
- Maybe a story
- Whatever else I discover in my tutorials :p

This is an incredibly open ended project

BlackCid
07-01-2009, 03:27 PM
OKay in english: it's farely generic.

I see what you mean about the techinicality involved in XNA compared to GM

And yeah! do something quick about the duplicate of the wizard guy.

overall I'L give you a 3 ... out of 2


I'm also interested in XNA maybe i'L publish something

Aequitas
07-01-2009, 04:36 PM
I posted (http://forums.tidemedia.co.za/nag/showthread.php?t=6368) this ages ago, so not everyone will have seen it.

But here's (http://www.riemers.net/eng/Tutorials/XNA/Csharp/series1.php) some good XNA tutorials that reveal how much of the graphics side of things works.

Kensei
07-01-2009, 05:08 PM
Thanks Aequitas :) Those set of tutorials was my next stop :D

Fengol
11-01-2009, 09:12 PM
Here's the XNA Creators Club sample for managing game state http://creators.xna.com/en-GB/samples/gamestatemanagement but if you get a chance learn how to interact with the Guide static object and get the player to sign in with their GamerTag to play your game ;)

Kensei
22-01-2009, 03:28 PM
Okay, after bugging Cyberninja (and getting his scorn because I have not played Gradius) I turn to you Game.Dev people.

As I am a huge fan of Tyrian and Raptor, I have not :( played many side scrollers. But the burning question I have is do I create lots of enemies that slowly approach the player or a few enemies with lots of hit points.

The hit point management is easy (hurray for object orientation) and the spawning of the enemies at the moment is just creating the same enemy at a new random point on the Y axis.

The other issue is, let the player jump and duck (fix the Y axis movement) or let them move freely around the playing fields

edg3
22-01-2009, 03:42 PM
As I am a huge fan of Tyrian and Raptor, I have not :( played many side scrollers. But the burning question I have is do I create lots of enemies that slowly approach the player or a few enemies with lots of hit points.
I would imagine you would have batches of either (or a mix) like do waves, 10 small ones, 3 big ones, 5 small ones and 2 big ones, and so on. Its always better to have variation.

Fengol
22-01-2009, 03:45 PM
Well, now you get into core of shmup design. I'd say the trend though has been towards pattern learning and busy screen of Japanese shmups like rrootage (http://www.asahi-net.or.jp/~cs8k-cyu/windows/rr_e.html); and with innovations like the black & white firepower in Ikuruga.

Hit points, then depend on the "pattern" you are making with the enemy units. More units on the screen at one time need fewer hits to take each one than a few larger unit. But you can also change that up by saying that units can only be hit at certain times when they lower shields or can only be hit behind, forcing you to learn timing.

Another trend is to ignore waves of units in favour of a series of mini-boss fights.

Fengol
22-01-2009, 03:46 PM
I just realised I didn't ask; are you making a side scrolling shooter (like the initial demo) or more of a platformer like Mario Bros 2?

Kensei
22-01-2009, 03:59 PM
Thanks edg3 and Fengol

Fengol, I am making more a side scroller like the initial demo - saves me trying to figure out how to do views in XNA (Only got it to work in GM recently :p )

What I could do is waves of weaker units, allowing the player to move freely - then create a boss battle where the controls are locked to duck and jump (ie, you need to avoid overhead attacks and ground based attacks)

Fengol
22-01-2009, 04:20 PM
Just remember the player expects the mechanics of the game to be consistent. Having different abilities just for the boss battle which can't be used in the level will make the game feel disjointed.

Also, the boss battle should be the culmination of what has been learnt and experienced in the level. The tactics and weapons he used to pass the level he's going to expect to be usable for the boss

Fengol
22-01-2009, 05:44 PM
I've just installed XNA 3.0 to play with Ultimate Quest and I see there's a Platformer Start Kit. Have you tried this Kensei?

Kensei
22-01-2009, 09:07 PM
I saw it, but given the close eye I have on my cap at the moment, I have not downloaded it

Is it for a traditional platformer?

btw: You make a very valid point about the bosses... it should be officially dubbed the 'Legend of Zelda' approach :D

Fengol
23-01-2009, 06:17 AM
Actually, I got a lot of it from Gamasutra Opinion: Boss Design - Trial & Punishment (http://www.gamasutra.com/php-bin/news_index.php?story=19005). There's also a PowerPoint presentation on bosses Bossy Behavior - Patterns and Techniques in Boss Design (http://www.google.com/url?sa=t&source=custom&client=pub-3896033488060561&sigafs=-EYxhg8_U-yE5lDD&flav=0002&ct=cres&cd=2&url=http%3A%2F%2Fwww.gamasutra.com%2Ffeatures%2Fgd carchive%2F2003%2FBarriga_Luis.pps&ei=YEN5SfyiB5KJ-gaxz_XEDw&usg=AFQjCNHpfyQX-0CSeqspF4NjwRqOXhkhdQ)

Kensei
24-01-2009, 10:08 AM
Hurray I have 5 enemies that spawn... but for some reason they all spawn in th same location, despite me giving the position a random number... Hmm, will need to check that.

So, an update on the demo (when I get the spawning issue sorted I will upload it)
- You can now get a score when you shoot the enemies
- To be politically correct/BEE the second player is now a black wizard
- Enemies now require more shots to be killed
- Enemies show that they are being hit
- There are now 5 enemies instead of 1

Things to work on:
- a lot :D
- Penalties for the player (including the enemies hurting the player)
- Different enemies
- Perhaps a menu instead of throwing the player into the thick of it :p (Will look at that GameManagementState tutorial)

Chippit
24-01-2009, 02:11 PM
Hurray I have 5 enemies that spawn... but for some reason they all spawn in th same location, despite me giving the position a random number... Hmm, will need to check that.
Use a common random generator object, don't create a new one every time you want a number. Random generators use the current time as the seed. If you create more than one at the same time and ask each one to generate a random number, they'll all return the same value.

Kensei
24-01-2009, 06:44 PM
That might be the issue, thanks Chippit.

At the moment, the random number (well the Random object) is part of the Enemy class - so in my LoadContent method, in the Enemy class, is where I am generating the random number and assigning it to Position.Y

I'll try separating the Random number from the class, and just extend the Random class, would that work?

It's just determining when to pass the number to the class... Unless, when I call each of the Enemies LoadContent method, I pass the random number then, rather than in the actual object's LoadContent method. Does that make sense? Am I likely making things worse than they should be?

Chippit
24-01-2009, 09:05 PM
Make a public static random object. Use it for everything.

Bonezmann
24-01-2009, 10:06 PM
I get a Send/Don't send error when trying to play the game and when I click on the setup file it says something about a failed download. Any ideas on what could be the problem?

Kensei
24-01-2009, 10:49 PM
Try downloading it again?

Ensure you have the following as well:
1. The .NET Framework 2.0 (http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5) or the .NET Framework 3.5 (http://www.microsoft.com/downloads/details.aspx?FamilyId=333325FD-AE52-4E35-B531-508D977D32A6) .
2. The XNA Framework Redistributable 3.0 (http://www.microsoft.com/downloads/details.aspx?FamilyId=6521D889-5414-49B8-AB32-E3FFF05A4C50)
3. The Game

Kensei
25-01-2009, 12:25 AM
:D Thanks Chippit, I changed when it obtained the random number and it worked

Release 2 is up, check the first page.

You now get a score deduction if you collide with the enemies, but it does push them back, so you can choose.
As it stands there is no penalty for missing an enemy.

Bonezmann
25-01-2009, 09:05 PM
I needed the xna framework. Thanx. Will be checking out release 2 now :)

edit: the shooting and ducking doesn't seem to work on the keyboard and it doesn't respond at all when I use my controller. Does it -have- to be a xbox controller?

Kensei
25-01-2009, 09:24 PM
Hmm, the shooting should work on the keyboard, make sure its the Right Ctrl, I think it makes a difference. I'll make a note to make it either the Left or Right Ctrl button

As for it having to be the Xbox controller, yes, I believe it does. Unless you can find an emulator (I think, never tried without my trusty controller)

Bonezmann
25-01-2009, 10:19 PM
Hmm, the shooting should work on the keyboard, make sure its the Right Ctrl, I think it makes a difference. I'll make a note to make it either the Left or Right Ctrl button

As for it having to be the Xbox controller, yes, I believe it does. Unless you can find an emulator (I think, never tried without my trusty controller)

Ah, yes. I used the wrong side :)

I see your wizard's collison is a bit out and I can just spam the enemies with fireballs. I know it's still in early stages and you're still learning, imo you're doing great :)

Maybe I should try it too...

Kensei
19-02-2009, 07:12 PM
Necrrrooooooo

Right, latest version is up on the GGE profile page.
Things I updated:

- Replaced the enemy and ship sprites
- Enemies now have 'health'
- Score tracking
- Health (but no consequences when you reach 0)
- 'Ducking' AKA activating your shield [When you are ducking you can push the enemies back without taking any damage - I aim to weave this into co-op somehow -> ie one player blocks while the other sits behind that shield and fires... kinda like Lost Vikings)

Things to note that are likely not amazing but I am chuffed I thought of it
- Scalable Enemy heath
- Scalable damage dealt by enemies
- Scalable damage dealt by fireballs
- Scalable number of enemies
- Ease of use swapping sprite names
- Ability to change player's names (but no interface to perform this action yet)
(Yay for GameConstants class :D )


Things that need work:
- Level progression instead of endless waves
- Smaller collision circles (I know how to do this but I have not had a chance to execute it yet)
- Replace the fireball with something else (looks at Cloud_Ratha)
- Menu system would be nice, hey?
- Heaps more :p

Fengol
19-02-2009, 07:25 PM
Link for the win

http://www.greatgamesexperiment.com/game/wizardsexperiment

Kensei
19-02-2009, 07:53 PM
Ooor, you could just check the first post of this thread :D

Evolution
20-02-2009, 09:44 AM
Here's a library I wrote to simplify input device management.

Supports:
-keyboard
-mouse
-multiple joypad devices (if you have more than one control plugged in to your pc)
(xna only supports xbox controllers, but this library breaks that rule)

-add the library to your referances in your project
-at the top of your code add "using GalsoEngine;"
-declare the main class "Galso engine;"
-create an object of galso in main public event "engine = new Galso(this);"
-after you have loaded the sprite batch in your loadcontent event load the engine "engine.Load(graphics, spriteBatch, Content);"
-in the update event add "engine.Update();"

To exit the game when the select button on a joypad is pressed use the following code in your update event: if (engine.joypad.pad[0].joy[8].pressed) this.Exit();

You can simplify this by writing this at the beginning of the update event after you have updated the engine: Gpad pad = engine.joypad.pad[0];
Then you will only have to write: if (pad.joy[8].pressed) this.Exit;

If you have no controls connected to your pc the above code will crash when checking if the joypad's buttons are pressed, to fix this use this code:
if (engine.joypad.pads != 0) // check if there is at least one joypad connected

Hope this helps.

Download Library (http://www.mediafire.com/?y3mhzvzl4hm)

I think the keyboard events work like this:

Gkeyboard key = engine.keyboard;

if (key.esc.pressed) this.exit;

The library simplifies allot of the work for me.

AndrewJ
20-02-2009, 09:53 AM
Link for the win

http ://www .greatgamesexperiment. com/...ardsexperiment

FAIL!!!

Nandrew
20-02-2009, 10:17 AM
Erk, this one gives me the "has stopped running" message as soon as I open it.

Kensei
20-02-2009, 05:11 PM
:(

Sorry to hear that Nandrew - I will take a look at it sometime this weekend.

@Evolution: Thanks I will take a look.
At the moment I have a int that is either 1 or 2 - if it is 1, it runs the update methods for keyboard, if it is 2 it runs the update methods for gamepad.

Kensei
13-03-2009, 06:51 PM
Alright, update on this thread.

I need a suggested way to manage some variables that will be used throughout the game.

What I have is a Player object, at the moment it stores whether the player is active, which controller they are using (Xbox controller or keyboard). Ideally I would also like to migrate my Update and Draw methods to the object so in the main class I can just call 'Player1.Update(gameTime)' or something.

My problem is that this Player object needs to be used from the title screen to the levels I create. As you will see below:

My game flow would be something like this:
Controller Detect screen
- Player presses A
- Player object created, activated and assigned correct controller
- change to Title screen

Title Screen
- Player can start a new game
- Player 2 can join
-if this is so, another Player object needs to be created
- Player 1 can change options
- Player 1 can exit

When new game is pressed
- Change to Gameplaying Screen

Game Playing Screen
- Load content
- draw player(s)
- Draw enemies
- Respond to input (like fire, protect and move)
- Player can of course pause or exit

halp? My brain has gone blank :(

Evolution
13-03-2009, 09:40 PM
I need a suggested way to manage some variables that will be used throughout the game.

The varaibles that you are using throughout the game should be declared in the first few lines of the Game class(the main class that your game is running in), before the functions of the class. If you want information about a variable in a class you can use the word public before declaring it, and you can access the variables outside the class this way.


What I have is a Player object, at the moment it stores whether the player is active, which controller they are using (Xbox controller or keyboard). Ideally I would also like to migrate my Update and Draw methods to the object so in the main class I can just call 'Player1.Update(gameTime)' or something.

You can make a Player class, if you havn't already. Then you just add the functions Update, Draw, etc. , then you just call the functions of the Player class in your Game class.


declare main/global variables in Game class:


const int players(2);
bool player_active[players];
for (int p(0); p < players; ++p)
player_active[p] = 0;
Player player[] = new Player[players];


In the Update function you would call:


for (int p(0); p < players && player_active[p]; ++p)
player[p].Update(this);


In the Draw function you would call:


for (int p(0); p < players && player_active[p]; ++p)
player[p].Draw(this);


I used C++ syntax so they might not work with C#, but I hope this helps.

Kensei
13-03-2009, 10:39 PM
Great idea :)

Thank you Evolution - I'll try that (of declaring the variables in Game1)
Not to worry about putting the syntax in C++, I understand it ;)

dislekcia
14-03-2009, 01:43 AM
Uh. You'd still need a reference to an instantiated game class for that...

For specific things (like having a single game-wide random object) I use static variables in my game class. The rest of the time I make sure that objects are part of a coherent game tree: A game has multiple scenes, scenes have multiple objects, objects do ****. Objects know which scene they're part of, scenes know which game they're part of. That way you can be pretty sure that if you need custom scene-wide variables, you can just subclass Scene and splack that sort of information in there.

Chippit
14-03-2009, 02:11 AM
Uh. You'd still need a reference to an instantiated game class for that...

For specific things (like having a single game-wide random object) I use static variables in my game class. The rest of the time I make sure that objects are part of a coherent game tree: A game has multiple scenes, scenes have multiple objects, objects do ****. Objects know which scene they're part of, scenes know which game they're part of. That way you can be pretty sure that if you need custom scene-wide variables, you can just subclass Scene and splack that sort of information in there.
I do pretty much exactly this too, often abstracted a few degrees further depending on the game itself and situation.

UQ looks something like Game > Game State > Map > Objects, with a few more levels depending on the state/situation. In fact, I'm actually very pleased with how it looks so far. Anything I've worked on in the past for any considerable period inevitably becomes a veritable mess of additions and tacked-on things. UQ's somehow managed to avoid all that, despite being the biggest thing I've ever made by far - mostly through careful planning and experience (and comments :P), I guess

Evolution
14-03-2009, 08:28 AM
Uh. You'd still need a reference to an instantiated game class for that...

For specific things (like having a single game-wide random object) I use static variables in my game class. The rest of the time I make sure that objects are part of a coherent game tree: A game has multiple scenes, scenes have multiple objects, objects do ****. Objects know which scene they're part of, scenes know which game they're part of. That way you can be pretty sure that if you need custom scene-wide variables, you can just subclass Scene and splack that sort of information in there.

this refers to the class that it was used in.
The function for player[p].Update will look like this:
void Update(Game game)
{
.....
game.variable (this lets you access any varable or function available in your Game class)
}
Game object is your main class that the game is running in. You could also use ref to the Game object that will lead you to the storage location in the memory of that object (I'm not sure if it's the same as pointers), this way you don't have to use extra memory, also it is faster. I don't think it will make a differance in a small game, I think you should only use referances if the game is computer intensive.

this = Game1 = Game
Game1 inhereted everthing from the Game class making it also an object of it.

I forgot about staic variables. If you put the word static before declaring a variable they become accessable throughout the program no matter where they are declared. It's usefull if you not sure whether you are going to use a varaible or not, and if you want it to be accessed from all parts of the program. Static functions works almost the same. With a static function you don't have to declare an object to use the static functions of that class.
eg. classname.staticfunction

With switching scenes, I create a few functions that handles resources. I used a variables like prev_room, cur_room, next_room, room_switch for telling the program when to unload, load, update, draw what resources. The functions make sure that resouces are only unloaded at the end of the update event, so that the game doesn't crash when trying to update missing resources.

dislekcia
14-03-2009, 01:22 PM
this refers to the class that it was used in.
The function for player[p].Update will look like this:
void Update(Game game)
{
.....
game.variable (this lets you access any varable or function available in your Game class)
}

It's usually better to store a pointer to something like that once on object creation, i.e: In your constructor. That way you won't have to pass the reference around if you have functions that your object runs during update. Which you should totally be doing ;)

Also, no time awareness during your update loops? Hmmm. I guess it's ok to rely on XNA's fixed timestep setup, but be aware that under heavy load your framerate will halve, even if it would only get slightly slower with a variable timestep. That big jump is always very noticeable.


Game object is your main class that the game is running in. You could also use ref to the Game object that will lead you to the storage location in the memory of that object (I'm not sure if it's the same as pointers), this way you don't have to use extra memory, also it is faster. I don't think it will make a differance in a small game, I think you should only use referances if the game is computer intensive.

Variables of class types are always passed by reference. You only really need the ref keyword when you want to ensure that a value type is passed as a pointer. Like having a struct that is modified by a function.


I forgot about staic variables. If you put the word static before declaring a variable they become accessable throughout the program no matter where they are declared. It's usefull if you not sure whether you are going to use a varaible or not, and if you want it to be accessed from all parts of the program. Static functions works almost the same. With a static function you don't have to declare an object to use the static functions of that class.
eg. classname.staticfunction

Kensei: It might be a good idea to create a completely static class just to store game information instead of storing everything in your main game class ;) If you need to do things that require instantiated memory inside your static class, there's always the singleton design pattern.


I do pretty much exactly this too, often abstracted a few degrees further depending on the game itself and situation.

UQ looks something like Game > Game State > Map > Objects, with a few more levels depending on the state/situation. In fact, I'm actually very pleased with how it looks so far. Anything I've worked on in the past for any considerable period inevitably becomes a veritable mess of additions and tacked-on things. UQ's somehow managed to avoid all that, despite being the biggest thing I've ever made by far - mostly through careful planning and experience (and comments :P), I guess

Yeah, SpaceHack is mostly surprisingly clean, apart from some of the generation sections. We never managed to abstract all that stuff out, so we have reams and reams of very small classes with slightly different behaviors. That's one of the first things I want to deal with when we start working on the game again.

Aequitas
14-03-2009, 04:19 PM
Yeah, SpaceHack is mostly surprisingly clean, apart from some of the generation sections. We never managed to abstract all that stuff out, so we have reams and reams of very small classes with slightly different behaviors. That's one of the first things I want to deal with when we start working on the game again.

I put those classes down to crazy deadlines and lack of sleep :P

But yeah, for loading resources we have some neat little managers that decide what needs to be loaded when, with static accessors. Makes swapping out and using different effects, textures etc. super convenient :)

Kensei
14-03-2009, 07:57 PM
I will re-read all of what you all posted again now now, just need to respond to this statement:


Kensei: It might be a good idea to create a completely static class just to store game information instead of storing everything in your main game class ;) If you need to do things that require instantiated memory inside your static class, there's always the singleton design pattern.

That is my plan, yes.

At the moment I have a static class that stores all my Game Constants (like Player's lives, what the name of the textures are, number of enemies etc) just so I have to change things once within my game ;)

What I want my Player object to contain is effectively the following:
- Player's Name
- score
- health
- Which input device they are using
- Player number (ie player 1 or 2)
- Image
- Is the player active

So it is more storing player info.

I am still debating whether to include the Update and Draw methods in that class or not. The Update and Draw would effectively mean updating the position of the player, whether they are firing or not, if they are 'ducking' etc.
At the moment this is being managed by an actual 'Ship' class.

Collision checks are done in the main class but this will be moved to my GamePlaying (inherited from my screen class) class...maybe I should draw a diagram :\

dislekcia
15-03-2009, 12:38 AM
I am still debating whether to include the Update and Draw methods in that class or not. The Update and Draw would effectively mean updating the position of the player, whether they are firing or not, if they are 'ducking' etc.
At the moment this is being managed by an actual 'Ship' class.

Collision checks are done in the main class but this will be moved to my GamePlaying (inherited from my screen class) class...maybe I should draw a diagram :\

Just in case it helps: Architecture-wise I usually keep a distinction between logical, game-play objects and graphical objects. So to use your player example, I'd have a Player class that inherited from a generic Ship class. The Player class would have both an Update and a Draw method. The Update method would be called by the containing structure (screen?), in it the object would do all the logical checks and balances it needs to do: Poll input, change states, create fireballs, whatever. The Draw method is again called by the containing structure, except in it the Player object would call the Draw methods of any graphics objects it had assigned to it.

Graphics objects are responsible for the resources they've loaded, etc. This sort of architecture allows some pretty neat things to be done. You could pause the game (or screen) by simply not calling it's Update method (thus not updating any contained objects) but still calling Draw. Or you could build logic into the containing structure's Draw method that only draws objects when they're visible, etc.

It's a nice abstraction to work in because it's really flexible. I tend to be able to whip up an "engine" like that from scratch in a couple of hours, I'm so used to implementing it.