summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2010-04-12 14:40:31 +0200
committerMatthias Schiffer <matthias@gamezock.de>2010-04-12 14:40:31 +0200
commitdafe16f191f99dc1199a5b386fad916a78c5c4f1 (patch)
tree35b889df1cfdbf696e0b2e68c1e17f3fca6a743e
parentd56001cb33d5a6d688cfd97dba71408c8fff1f7d (diff)
downloadhtanks-dafe16f191f99dc1199a5b386fad916a78c5c4f1.tar
htanks-dafe16f191f99dc1199a5b386fad916a78c5c4f1.zip
Some improvements on coordinate calculation & player rendering
-rw-r--r--src/GLX.hs9
-rw-r--r--src/HTanks.hs6
-rw-r--r--src/HWiidPlayer.hs7
-rw-r--r--src/Render.hs22
4 files changed, 23 insertions, 21 deletions
diff --git a/src/GLX.hs b/src/GLX.hs
index 6f245a7..bc2201e 100644
--- a/src/GLX.hs
+++ b/src/GLX.hs
@@ -11,7 +11,7 @@ import Data.Maybe (isJust)
import Data.Ratio
import Graphics.Rendering.OpenGL.GL (($=), GLdouble, GLfloat, Vector3(..), Capability(..))
-import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, ortho, translate)
+import Graphics.Rendering.OpenGL.GL.CoordTrans (matrixMode, MatrixMode(..), viewport, Position(..), Size(..), loadIdentity, ortho, translate, scale, rotate)
import Graphics.X11.Types
import Graphics.X11.Xlib.Atom (internAtom)
@@ -179,8 +179,9 @@ windowToGameCoords :: Integral a => GLX -> a -> a -> IO (Float, Float)
windowToGameCoords glx x y = getWindowAttributes (glxDisplay glx) (glxWindow glx) >>= \wa ->
let w = fromIntegral . wa_width $ wa
h = fromIntegral . wa_height $ wa
- in return (((-w/2 + wx)/s + lw/2), ((h/2 - wy)/s + lh/2))
- where s = fromRational . glxScale $ glx
+ in return (((-w/2 + wx)/sx + lw/2), ((h/2 - wy)/sy + lh/2))
+ where sx = fromRational . glxScale $ glx
+ sy = sx*(cos $ pi/6)
lw = fromIntegral . glxLevelWidth $ glx
lh = fromIntegral . glxLevelHeight $ glx
wx = fromIntegral x
@@ -197,6 +198,8 @@ resize lw lh w h = do
matrixMode $= Projection
loadIdentity
ortho (-sf*aspectf) (sf*aspectf) (-sf) sf (-1) 1
+ scale 1 1 (0.1 :: GLfloat)
+ rotate (-30) $ Vector3 1 0 (0 :: GLfloat)
translate $ Vector3 (-(fromIntegral lw)/2) (-(fromIntegral lh)/2) (0 :: GLfloat)
matrixMode $= Modelview 0
diff --git a/src/HTanks.hs b/src/HTanks.hs
index c9525b9..f1e0e98 100644
--- a/src/HTanks.hs
+++ b/src/HTanks.hs
@@ -27,7 +27,7 @@ import Data.Obj3D.GL
main :: IO ()
main = do
let theLevel = testLevel
- --hwiidPlayer <- newHWiidPlayer
+ hwiidPlayer <- newHWiidPlayer
gl <- initGL $ glxDriver (levelWidth theLevel) (levelHeight theLevel)
when (initialized gl) $ do
@@ -36,8 +36,8 @@ main = do
, Tank 5.0 3.5 0 0 1.5 270 False 3 1 5 1
], bullets = []}
mainstate = MainState {run = True, driver = SomeDriver gl, time = currentTime, players =
- [ SomePlayer $ DefaultPlayer S.empty 0 0 False
- --SomePlayer $ hwiidPlayer
+ [ --SomePlayer $ DefaultPlayer S.empty 0 0 False
+ SomePlayer $ hwiidPlayer
, SomePlayer $ CPUPlayer 0
], textures = M.empty, models = M.empty, gameState = gamestate}
diff --git a/src/HWiidPlayer.hs b/src/HWiidPlayer.hs
index d1df2e5..db35871 100644
--- a/src/HWiidPlayer.hs
+++ b/src/HWiidPlayer.hs
@@ -5,7 +5,7 @@ module HWiidPlayer ( HWiidPlayer
) where
import Control.Monad
-import Data.Bits
+import Data.Bits hiding (rotate)
import Data.Function (on)
import Data.List (sortBy)
import Data.Maybe
@@ -14,7 +14,7 @@ import Data.Typeable
import HWiid
import Graphics.Rendering.OpenGL.GL (GLfloat, Vector3(..))
import Graphics.Rendering.OpenGL.GL.BeginEnd (unsafeRenderPrimitive, PrimitiveMode(..))
-import Graphics.Rendering.OpenGL.GL.CoordTrans (unsafePreservingMatrix, translate)
+import Graphics.Rendering.OpenGL.GL.CoordTrans (unsafePreservingMatrix, translate, rotate)
import Graphics.Rendering.OpenGL.GL.VertexSpec
@@ -65,7 +65,8 @@ instance Player HWiidPlayer where
renderPlayer (HWiidPlayer _ _ aims) = unsafePreservingMatrix $ do
let (x, y) = mulV (1/(fromIntegral $ length aims)) $ foldr addV (0, 0) aims
- translate $ Vector3 x y (0 :: GLfloat)
+ translate $ Vector3 x y (0.2 :: GLfloat)
+ rotate 30 $ Vector3 1 0 (0 :: GLfloat)
unsafeRenderPrimitive Quads $ do
texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat)
diff --git a/src/Render.hs b/src/Render.hs
index 82ad08e..356310f 100644
--- a/src/Render.hs
+++ b/src/Render.hs
@@ -92,13 +92,6 @@ setup = do
(lw, lh) <- gets (level . gameState) >>= \l -> return (fromIntegral . levelWidth $ l :: GLfloat, fromIntegral . levelHeight $ l :: GLfloat)
liftIO $ do
- matrixMode $= Projection
- scale 1 1 (0.1 :: GLfloat)
- translate $ Vector3 (lw/2) (lh/2) 0
- rotate (-30) $ Vector3 1 0 (0 :: GLfloat)
- translate $ Vector3 (-lw/2) (-lh/2) 0
- matrixMode $= Modelview 0
-
blend $= Enabled
blendFunc $= (SrcAlpha, OneMinusSrcAlpha)
depthFunc $= Just Lequal
@@ -144,6 +137,8 @@ render = do
liftIO $ do
clear [ColorBuffer, DepthBuffer]
+ depthFunc $= Just Lequal
+
texture Texture2D $= Enabled
textureBinding Texture2D $= Just textureWood
@@ -224,23 +219,26 @@ render = do
y = realToFrac . bulletY $ bullet
rotDir = realToFrac . bulletDir $ bullet
- translate $ Vector3 x y (0 :: GLfloat)
+ translate $ Vector3 x y (0.1 :: GLfloat)
+ rotate 30 $ Vector3 1 0 (0 :: GLfloat)
rotate rotDir $ Vector3 0 0 (1 :: GLfloat)
textureBinding Texture2D $= Just textureBullet
unsafeRenderPrimitive Quads $ do
texCoord $ TexCoord2 (0 :: GLfloat) (0 :: GLfloat)
- vertex $ Vertex3 (-0.1 :: GLfloat) (-0.1 :: GLfloat) 0.01
+ vertex $ Vertex3 (-0.1 :: GLfloat) (-0.1 :: GLfloat) 0
texCoord $ TexCoord2 (0 :: GLfloat) (1 :: GLfloat)
- vertex $ Vertex3 (-0.1 :: GLfloat) (0.1 :: GLfloat) 0.01
+ vertex $ Vertex3 (-0.1 :: GLfloat) (0.1 :: GLfloat) 0
texCoord $ TexCoord2 (1 :: GLfloat) (1 :: GLfloat)
- vertex $ Vertex3 (0.1 :: GLfloat) (0.1 :: GLfloat) 0.01
+ vertex $ Vertex3 (0.1 :: GLfloat) (0.1 :: GLfloat) 0
texCoord $ TexCoord2 (1 :: GLfloat) (0 :: GLfloat)
- vertex $ Vertex3 (0.1 :: GLfloat) (-0.1 :: GLfloat) 0.01
+ vertex $ Vertex3 (0.1 :: GLfloat) (-0.1 :: GLfloat) 0
+
+ depthFunc $= Just Always
textureBinding Texture2D $= Just textureCrosshair
forM_ playerlist renderPlayer